Fractional gates
เวอร์ชัน package
โค้ดในหน้านี้พัฒนาโดยใช้ข้อกำหนดต่อไปนี้ แนะนำให้ใช้เวอร์ชันเหล่านี้หรือใหม่กว่า
qiskit[all]~=2.3.1
qiskit-ibm-runtime~=0.45.1
หน้านี้แนะนำ Gate สองประเภทที่รองรับใหม่บนเครือ QPU ของ IBM Quantum® fractional gate เหล่านี้รองรับบน Heron QPU ในรูปแบบ:
- สำหรับ
- สำหรับ ใด ๆ
หน้านี้อธิบาย 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 เหล่านี้ทำงานโดยดำเนินการหมุน และ โดยตรงสำหรับมุมใด ๆ การใช้ gate สามารถลดระยะเวลาและ error สำหรับการหมุน single-qubit ของมุมใด ๆ ได้สูงสุดถึงสองเท่า การดำเนินการหมุน 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 ที่รายงานใน Target ของ Backend ที่เปิดใช้ fractional gate เป็นเพียงสำเนาของคู่หูที่ไม่ใช่ fractional gate (ซึ่งอาจไม่เหมือนกัน) เนื่องจากยังไม่รองรับการรายงานอัตรา 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")
กำหนด 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(),
)
# 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(),
)
ข้อจำกัดของมุม
สำหรับ two-qubit gate สามารถดำเนินการได้เฉพาะมุมระหว่าง ถึง บน IBM Quantum hardware หาก Circuit มี gate ใด ๆ ที่มีมุมอยู่นอกช่วงนี้ pipeline transpilation มาตรฐานโดยทั่วไปจะแก้ไขด้วยการแปลง Circuit ที่เหมาะสม (ผ่าน pass FoldRzzAngle) อย่างไรก็ตาม สำหรับ gate ใด ๆ ที่มี Parameter หนึ่งตัวหรือมากกว่า Transpiler จะสมมติว่า parameter เหล่านี้จะถูกกำหนดมุมภายในช่วงนี้ที่ runtime Job จะล้มเหลวหากค่า parameter ใด ๆ ที่ระบุใน PUB ที่ส่งไปยัง Qiskit Runtime อยู่นอกช่วงนี้
ควรใช้ fractional gates ที่ไหน
ในอดีต basis gate ที่มีบน IBM Quantum QPU คือ CZ, X, RZ, SX และ ID ซึ่งไม่สามารถแสดง Circuit ที่มีการหมุน single- และ two-qubit ที่ไม่ใช่ทวีคูณของ ได้อย่างมีประสิทธิภาพ ตัวอย่างเช่น gate เมื่อ transpile ต้องแยกส่วนเป็นชุดของ และ gate ซึ่งสร้าง Circuit ที่มีสอง gate ที่มีระยะเวลาจำกัดแทนที่จะเป็นหนึ่งตัว
ในทำนองเดียวกัน เมื่อ two-qubit rotation เช่น gate ถูก transpile การแยกส่วนต้องใช้ CZ gate สองตัวและ single-qubit gate หลายตัว ซึ่งเพิ่ม circuit depth การแยกส่วนเหล่านี้แสดงในโค้ดต่อไปนี้
qc = QuantumCircuit(1)
param = Parameter("θ")
qc.rx(param, 0)
qc.draw("mpl")
# 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)
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")
# 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)
สำหรับ workflow ที่ต้องการการหมุน 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 Runtime เพื่อข้อมูลเพิ่มเติม ดูเอกสาร API reference สำหรับ QiskitRuntimeService.backend ซึ่งอธิบาย use_fractional_gates ด้วย
นอกจากนี้ Qiskit Transpiler มีความสามารถจำกัดในการใช้ ใน optimization pass ซึ่งต้องระมัดระวังมากขึ้นในการสร้างและปรับ Circuit ที่มีคำสั่งเหล่านี้
สุดท้าย การใช้ fractional gate ไม่รองรับสำหรับ:
- Dynamic circuits
- Pauli twirling - อย่างไรก็ตาม measurement twirling with TREX รองรับ
- Probabilistic error cancellation
- Zero-noise extrapolation (using probabilistic error amplification)
อ่านคู่มือเกี่ยวกับprimitive options เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับการปรับแต่ง error mitigation และ suppression techniques สำหรับ quantum workload ที่กำหนด
ขั้นตอนถัดไป
- เรียนรู้เพิ่มเติมเกี่ยวกับ transpilation ดูหน้าแนะนำ transpilation
- อ่านเกี่ยวกับการเขียน custom transpiler pass
- ทำความเข้าใจวิธีกำหนดค่า error mitigation สำหรับ Qiskit Runtime