ข้ามไปยังเนื้อหาหลัก

Fractional gates

เวอร์ชัน package

โค้ดในหน้านี้พัฒนาโดยใช้ข้อกำหนดต่อไปนี้ แนะนำให้ใช้เวอร์ชันเหล่านี้หรือใหม่กว่า

qiskit[all]~=2.3.1
qiskit-ibm-runtime~=0.45.1

หน้านี้แนะนำ Gate สองประเภทที่รองรับใหม่บนเครือ QPU ของ IBM Quantum® fractional gate เหล่านี้รองรับบน Heron QPU ในรูปแบบ:

  • RZZ(θ)R_{ZZ}(\theta) สำหรับ 0<θπ/20 \lt \theta \leq \pi/2
  • RX(θ)R_X(\theta) สำหรับ θ\theta ใด ๆ

หน้านี้อธิบาย use case ที่การใช้ fractional gate สามารถเพิ่มประสิทธิภาพของ workflow และวิธีใช้ gate เหล่านี้บน IBM Quantum QPU

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime

วิธีใช้ fractional gates

ภายใน fractional gate เหล่านี้ทำงานโดยดำเนินการหมุน RZZ(θ)R_{ZZ}(\theta) และ RX(θ)R_X(\theta) โดยตรงสำหรับมุมใด ๆ การใช้ RX(θ)R_X(\theta) gate สามารถลดระยะเวลาและ error สำหรับการหมุน single-qubit ของมุมใด ๆ ได้สูงสุดถึงสองเท่า การดำเนินการหมุน RZZ(θ)R_{ZZ}(\theta) gate โดยตรงหลีกเลี่ยงการแยกส่วนเป็นหลาย CZGate ซึ่งลดระยะเวลาและ error ของ Circuit เช่นกัน สิ่งนี้มีประโยชน์อย่างยิ่งสำหรับ Circuit ที่มีการหมุน single- และ two-qubit จำนวนมาก เช่น เมื่อจำลอง dynamics ของระบบควอนตัมหรือเมื่อใช้ variational ansatz ที่มีหลาย parameter

แม้ gate ประเภทนี้จะอยู่ในไลบรารี standard gate ที่ใช้กับ QuantumCircuit ได้ แต่จะใช้งานได้เฉพาะบน IBM Quantum QPU บางรุ่นเท่านั้น และต้องโหลดด้วย flag use_fractional_gates ตั้งค่าเป็น True (แสดงด้านล่าง) flag นี้จะรวม fractional gate ไว้ใน Target ของ Backend สำหรับ Transpiler

service = QiskitRuntimeService()
backend = service.backend('ibm_torino', use_fractional_gates=True)

ตัวอย่างโค้ดนี้แสดงวิธีใช้ fractional gate ในบริบทของ workflow ที่จำลอง dynamics ของ Ising chain โดยใช้ fractional gate จากนั้นเปรียบเทียบระยะเวลา Circuit กับ Backend ที่ไม่ใช้ fractional gate

หมายเหตุเกี่ยวกับอัตรา error ที่รายงาน

ค่า error ที่รายงานใน Target ของ Backend ที่เปิดใช้ fractional gate เป็นเพียงสำเนาค่าของ gate เวอร์ชันที่ไม่ใช่ fractional ซึ่งเป็นคู่เทียบกัน (ซึ่งอาจไม่เท่ากันจริง) เนื่องจากยังไม่รองรับการรายงานอัตรา error บน fractional gate

อย่างไรก็ตาม เนื่องจาก gate time ของ fractional gate และ non-fractional gate เท่ากัน จึงสมเหตุสมผลที่จะสมมติว่าอัตรา error ของทั้งสองเทียบเคียงได้ โดยเฉพาะเมื่อแหล่ง error หลักใน Circuit เกิดจาก relaxation

from qiskit import QuantumCircuit
from qiskit.circuit import Parameter
from qiskit.transpiler import generate_preset_pass_manager
from qiskit.visualization.timeline import draw as draw_timeline, IQXSimple

from qiskit_ibm_runtime import QiskitRuntimeService

num_qubits = 5
num_time_steps = 3
rx_angle = 0.1
rzz_angle = 0.1

ising_circuit = QuantumCircuit(num_qubits)
for i in range(num_time_steps):
# rx layer
for q in range(num_qubits):
ising_circuit.rx(rx_angle, q)
for q in range(1, num_qubits - 1, 2):
ising_circuit.rzz(rzz_angle, q, q + 1)
# 2nd rzz layer
for q in range(0, num_qubits - 1, 2):
ising_circuit.rzz(rzz_angle, q, q + 1)
ising_circuit.barrier()
ising_circuit.draw("mpl")

Output of the previous code cell

กำหนด Backend object สองตัว: ตัวหนึ่งเปิดใช้ fractional gate และอีกตัวปิดใช้ จากนั้น transpile ทั้งสองตัว

service = QiskitRuntimeService()
backend_fractional = service.backend("ibm_torino", use_fractional_gates=True)
backend_conventional = service.backend(
"ibm_torino", use_fractional_gates=False
)

pm_fractional = generate_preset_pass_manager(
optimization_level=3, backend=backend_fractional, scheduling_method="alap"
)
pm_conventional = generate_preset_pass_manager(
optimization_level=3,
backend=backend_conventional,
scheduling_method="alap",
)

ising_circuit_fractional = pm_fractional.run(ising_circuit)
ising_circuit_conventional = pm_conventional.run(ising_circuit)

แสดง timeline ของ Circuit โดยใช้ gate สองประเภท

# Draw timeline of circuit with conventional gates
draw_timeline(
ising_circuit_conventional,
idle_wires=False,
target=backend_conventional.target,
time_range=(0, 500),
style=IQXSimple(),
)

Output of the previous code cell

# Draw timeline of circuit with fractional gates
draw_timeline(
ising_circuit_fractional,
idle_wires=False,
target=backend_fractional.target,
time_range=(0, 500),
style=IQXSimple(),
)

Output of the previous code cell

ข้อจำกัดของมุม

สำหรับ two-qubit RZZ(θ)R_{ZZ}(\theta) gate สามารถดำเนินการได้เฉพาะมุมระหว่าง 00 ถึง π/2\pi/2 บน IBM Quantum hardware หาก Circuit มี RZZ(θ)R_{ZZ}(\theta) gate ใด ๆ ที่มีมุมอยู่นอกช่วงนี้ pipeline transpilation มาตรฐานโดยทั่วไปจะแก้ไขด้วยการแปลง Circuit ที่เหมาะสม (ผ่าน pass FoldRzzAngle) อย่างไรก็ตาม สำหรับ RZZ(θ)R_{ZZ}(\theta) gate ใด ๆ ที่มี Parameter หนึ่งตัวหรือมากกว่า Transpiler จะสมมติว่า parameter เหล่านี้จะถูกกำหนดมุมภายในช่วงนี้ที่ runtime Job จะล้มเหลวหากค่า parameter ใด ๆ ที่ระบุใน PUB ที่ส่งไปยัง IBM Quantum Compute Service อยู่นอกช่วงนี้

ควรใช้ fractional gates ที่ไหน

ในอดีต basis gate ที่มีบน IBM Quantum QPU คือ CZ, X, RZ, SX และ ID ซึ่งไม่สามารถแสดง Circuit ที่มีการหมุน single- และ two-qubit ที่ไม่ใช่ทวีคูณของ π/2\pi / 2 ได้อย่างมีประสิทธิภาพ ตัวอย่างเช่น RX(θ)R_X(\theta) gate เมื่อ transpile ต้องแยกส่วนเป็นชุดของ RZRZ และ X\sqrt{X} gate ซึ่งสร้าง Circuit ที่มีสอง gate ที่มีระยะเวลาจำกัดแทนที่จะเป็นหนึ่งตัว

ในทำนองเดียวกัน เมื่อ two-qubit rotation เช่น RZZ(θ)R_{ZZ}(\theta) gate ถูก transpile การแยกส่วนต้องใช้ CZ gate สองตัวและ single-qubit gate หลายตัว ซึ่งเพิ่ม circuit depth การแยกส่วนเหล่านี้แสดงในโค้ดต่อไปนี้

qc = QuantumCircuit(1)
param = Parameter("θ")
qc.rx(param, 0)
qc.draw("mpl")

Output of the previous code cell

# Decomposition of an RX(θ) gate using the IBM Quantum QPU basis
service = QiskitRuntimeService()
backend = service.backend("ibm_torino")
optimization_level = 3
pm = generate_preset_pass_manager(optimization_level, backend=backend)
transpiled_circuit = pm.run(qc)
transpiled_circuit.draw("mpl", idle_wires=False)

Output of the previous code cell

from qiskit import QuantumCircuit
from qiskit.circuit import Parameter
from qiskit.transpiler import generate_preset_pass_manager

from qiskit_ibm_runtime import QiskitRuntimeService

qc = QuantumCircuit(2)
param = Parameter("θ")
qc.rzz(param, 0, 1)
qc.draw("mpl")

Output of the previous code cell

# Decomposition of an RZZ(θ) gate using the IBM Quantum QPU basis
service = QiskitRuntimeService()
backend = service.backend("ibm_torino")
optimization_level = 3
pm = generate_preset_pass_manager(optimization_level, backend=backend)
transpiled_circuit = pm.run(qc)
transpiled_circuit.draw("mpl", idle_wires=False)

Output of the previous code cell

สำหรับ workflow ที่ต้องการการหมุน RX(θ)R_X(\theta) single-qubit หรือ two-qubit จำนวนมาก (เช่น ใน variational ansatz หรือเมื่อจำลอง time evolution ของระบบควอนตัม) ข้อจำกัดนี้ทำให้ circuit depth เติบโตอย่างรวดเร็ว อย่างไรก็ตาม fractional gate ลบข้อกำหนดนี้ เนื่องจากการหมุน single- และ two-qubit ถูกดำเนินการโดยตรง และสร้าง quantum circuit ที่มีประสิทธิภาพมากขึ้น (และด้วยเหตุนี้จึงลด error ได้)

เมื่อไม่ควรใช้ fractional gates

สิ่งสำคัญที่ต้องทราบคือ fractional gate เป็นคุณสมบัติเชิงทดลอง และพฤติกรรมของ flag use_fractional_gates อาจเปลี่ยนแปลงในอนาคต ดูrelease notes สำหรับเวอร์ชันใหม่ของ qiskit-ibm-runtime เพื่อข้อมูลเพิ่มเติม ดูเอกสาร API reference สำหรับ QiskitRuntimeService.backend ซึ่งอธิบาย use_fractional_gates ด้วย

นอกจากนี้ Qiskit Transpiler มีความสามารถจำกัดในการใช้ RZZ(θ)R_{ZZ}(\theta) ใน optimization pass ซึ่งต้องระมัดระวังมากขึ้นในการสร้างและปรับ Circuit ที่มีคำสั่งเหล่านี้

สุดท้าย การใช้ fractional gate ไม่รองรับสำหรับ:

อ่านคู่มือเกี่ยวกับprimitive options เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับการปรับแต่ง error mitigation และ suppression techniques สำหรับ quantum workload ที่กำหนด

backend ใดบ้างที่รองรับ fractional gates?

ไม่ใช่ทุก backend ที่รองรับ fractional gates รัน service.backends(use_fractional_gates=True) เพื่อหา backend ที่รองรับ ด้วยการเปิดตัว qiskit-ibm-runtime v0.48 คุณยังสามารถรัน service.least_busy(fractional_gates=True) เพื่อหา backend ที่ว่างที่สุดซึ่งรองรับ fractional gates ได้อีกด้วย fake backend จะรองรับ fractional gates ก็ต่อเมื่อ backend "จริง" ที่เกี่ยวข้องรองรับเช่นกัน

โปรดทราบว่า fake backend ไม่รองรับ fractional gates โดยค่าเริ่มต้น เนื่องจาก fractional gates ถูกปิดใช้งานโดยค่าเริ่มต้น หากต้องการเปิดใช้งาน fractional gates บน fake backend ที่รองรับ ให้รีเฟรชการกำหนดค่าของ backend นั้น

ตัวอย่าง:

service = QiskitRuntimeService()
fake_backend = FakeBoston()
fake_backend.refresh(service=service, use_fractional_gates=True)

ขั้นตอนถัดไป

คำแนะนำ