การแสดงแทน quantum computer สำหรับ Transpiler
เวอร์ชันของแพ็กเกจ
โค้ดในหน้านี้พัฒนาโดยใช้ requirements ต่อไปนี้ แนะนำให้ใช้เวอร์ชันนี้หรือใหม่กว่า
qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1
ในการแปลง abstract circuit ให้เป็น ISA circuit ที่สามารถรันบน QPU (quantum processing unit) เฉพาะได้ Transpiler ต้องการข้อมูลบางอย่างเกี่ยวกับ QPU ข้อมูลนี้พบได้ในสองที่: object BackendV2 (หรือ BackendV1 รุ่นเก่า) ที่คุณวางแผนส่ง job และ attribute Target ของ Backend
Targetประกอบด้วย constraint ที่เกี่ยวข้องทั้งหมดของ device เช่น native basis gate, qubit connectivity และข้อมูล pulse หรือ timingBackendมีTargetโดยค่าเริ่มต้น ประกอบด ้วยข้อมูลเพิ่มเติม เช่นInstructionScheduleMapและให้ interface สำหรับส่ง quantum circuit job
คุณยังสามารถระบุข้อมูลสำหรับ Transpiler ใช้อย่างชัดเจนได้ เช่น หากมี use case เฉพาะ หรือหากเชื่อว่าข้อมูลนี้จะช่วยให้ Transpiler สร้าง circuit ที่ optimize ได้ดีกว่า
ความแม่นยำที่ Transpiler สร้าง circuit ที่เหมาะสมที่สุดสำหรับ hardware เฉพาะขึ้นอยู่กับว่า Target หรือ Backend มีข้อมูลเกี่ยวกับ constraint มากแค่ไหน
เนื่องจากอัลกอริทึม transpilation พื้นฐานหลายตัวเป็น stochastic จ ึงไม่มีการรับประกันว่าจะหา circuit ที่ดีกว่า
หน้านี้แสดงตัวอย่างหลายรายการของการส่งข้อมูล QPU ไปยัง Transpiler ตัวอย่างเหล่านี้ใช้ target จาก mock backend FakeSherbrooke
การกำหนดค่าเริ่มต้น
การใช้ Transpiler แบบง่ายที่สุดคือการระบุข้อมูล QPU ทั้งหมดโดยให้ Backend หรือ Target เพื่อให้เข้าใจวิธีการทำงานของ Transpiler ให้สร้าง circuit และ transpile ด้วยข้อมูลต่าง ๆ ดังนี้
Import library ที่จำเป็นและสร้าง instance ของ QPU:
เพื่อแปลง abstract circuit ให้เป็น ISA circuit ที่รันบน processor เฉพาะได้ Transpiler ต้องการข้อมูลบางอย่างเกี่ยวกับ processor โดยทั่วไปข้อมูลนี้เก็บอยู่ใน Backend หรือ Target ที่ส่งให้ Transpiler และไม่จำเป็นต้องใช้ข้อมูลเพิ่มเติม อย่างไรก็ตาม คุณยังสามารถระบุข้อมูลสำหรับ Transpiler ใช้อย่างชัดเจนได้ เช่น หากมี use case เฉพาะ หรือหากเชื่อว่าข้อมูลนี้จะช่วยให้ Transpiler สร้าง circuit ที่ optimize ได้ดีกว่า
หัวข้อนี้แสดงตัวอย่างหลายรายการของการส่งข้อมูลไปยัง Transpiler ตัวอย่างเหล่านี้ใช้ target จาก mock backend FakeSherbrooke
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke
backend = FakeSherbrooke()
target = backend.target
ตัวอย่าง circuit ใช้ instance ของ efficient_su2 จาก circuit library ของ Qiskit
from qiskit.circuit.library import efficient_su2
qc = efficient_su2(12, entanglement="circular", reps=1)
qc.draw("mpl")
ต ัวอย่างนี้ใช้การตั้งค่าเริ่มต้นเพื่อ transpile ไปยัง target ของ backend ซึ่งให้ข้อมูลทั้งหมดที่จำเป็นในการแปลง circuit ให้รันบน Backend ได้
from qiskit.transpiler import generate_preset_pass_manager
pass_manager = generate_preset_pass_manager(
optimization_level=1, target=target, seed_transpiler=12345
)
qc_t_target = pass_manager.run(qc)
qc_t_target.draw("mpl", idle_wires=False, fold=-1)
ตัวอย่างนี้ใช้ในส่วนต่อมาของหัวข้อนี้เพื่อแสดงให้เห็นว่า coupling map และ basis gate เป็นข้อมูลสำคัญที่ต้องส่งไปยัง Transpiler เพื่อการสร้าง circuit ที่เหมาะสมที่สุด QPU มักสามารถเลือกการตั้งค่าเริ่มต้นสำหรับข้อมูลอื่นที่ไม่ได้ส่งไป เช่น timing และ scheduling
Coupling map
coupling map คือกราฟที่แสดงว่า Qubit ใดบ้างที่เชื่อมต่อกันและมี two-qubit gate ระหว่างกัน บางครั้งกราฟนี้มีทิศทาง หมายความว ่า two-qubit gate สามารถไปในทิศทางเดียวเท่านั้น อย่างไรก็ตาม Transpiler สามารถกลับทิศทางของ Gate ได้โดยเพิ่ม single-qubit gate เพิ่มเติม abstract quantum circuit สามารถแสดงแทนบนกราฟนี้ได้เสมอ แม้ว่า connectivity จะจำกัด โดยการแนะนำ SWAP gate เพื่อย้ายข้อมูล quantum ไปรอบ ๆ
Qubit จาก abstract circuit ของเราเรียกว่า virtual Qubit และ Qubit บน coupling map เรียกว่า physical Qubit Transpiler ให้การ mapping ระหว่าง virtual และ physical Qubit ขั้นตอนแรกของ transpilation ที่เรียกว่า layout stage จะทำการ mapping นี้
แม้ว่า routing stage จะพัวพันกับ layout stage ซึ่งเลือก Qubit จริง แต่โดยค่าเริ่มต้น หัวข้อ นี้จะถือว่าเป็น stage แยกกันเพื่อความเรียบง่าย การรวม routing และ layout เรียกว่า qubit mapping เรียนรู้เพิ่มเติมเกี่ยวกับ stage เหล่านี้ในหัวข้อ Transpiler stages
ส่ง keyword argument coupling_map เพื่อดูผลกระทบต่อ Transpiler:
coupling_map = target.build_coupling_map()
pass_manager = generate_preset_pass_manager(
optimization_level=0, coupling_map=coupling_map, seed_transpiler=12345
)
qc_t_cm_lv0 = pass_manager.run(qc)
qc_t_cm_lv0.draw("mpl", idle_wires=False, fold=-1)
ดังที่แสดงข้างต้น มีการแทรก SWAP gate หลายตัว (แต่ละตัวประกอบด้วย CX gate สามตัว) ซึ่งจะทำให้เกิด error มากบน device ปัจจุบัน เพื่อดูว่า Qubit ใดถูกเลือกบน qubit topology จริง ให้ใช้ plot_circuit_layout จาก Qiskit Visualizations:
from qiskit.visualization import plot_circuit_layout
plot_circuit_layout(qc_t_cm_lv0, backend, view="physical")
ซึ่งแสดงว่า virtual Qubit 0-11 ของเรา ถูก map แบบตรงไปตรงมาไปยัง physical Qubit 0-11 ที่เรียงต่อกัน ลองกลับไปใช้ค่าเริ่มต้น (optimization_level=1) ซึ่งใช้ VF2Layout หากต้องการ routing
pass_manager = generate_preset_pass_manager(
optimization_level=1, coupling_map=coupling_map, seed_transpiler=12345
)
qc_t_cm_lv1 = pass_manager.run(qc)
qc_t_cm_lv1.draw("mpl", idle_wires=False, fold=-1)
ตอนนี้ไม่มีการแทรก SWAP gate และ physical Qubit ที่เลือกเหมือนกับเมื่อใช้ class target
from qiskit.visualization import plot_circuit_layout
plot_circuit_layout(qc_t_cm_lv1, backend, view="physical")
ตอนนี้ layout อยู่ในรูปวงแหวน เนื่องจาก layout นี้เคารพ connectivity ของ circuit จึงไม่มี SWAP gate ทำให้ได้ circuit ที่ดีกว่ามากสำหรับการประมวลผล
Basis gate
quantum computer ทุกตัวรองรับ instruction set ที่จำกัด เรียกว่า basis gate ทุก Gate ใน circuit ต้องถูกแปลเป็นส่วนประกอบของ set นี้ Set นี้ควรประกอบด้วย single- และ two-qubit gate ที่ให้ universal gate set หมายความว่าการดำเนินการ quantum ใด ๆ สามารถ decompose เป็น Gate เหล่านั้นได้ ซึ่งทำโดย BasisTranslator และ basis gate สามารถระบุเป็น keyword argument ให้ Transpiler เพื่อให้ข้อมูลนี้
basis_gates = list(target.operation_names)
print(basis_gates)
['sx', 'switch_case', 'x', 'if_else', 'measure', 'for_loop', 'delay', 'ecr', 'id', 'reset', 'rz']
single-qubit gate เริ่มต้นบน ibm_sherbrooke คือ rz, x และ sx และ two-qubit gate เริ่มต้นคือ ecr (echoed cross-resonance) CX gate ถูกสร้างจาก ecr gate ดังนั้นบน QPU บางตัว ecr ถูกระบุเป็น two-qubit basis gate ในขณะที่บางตัว cx เป็นค่าเริ่มต้น ecr gate คือส่วน entangling ของ cx gate นอกจาก control gate แล้ว ยังมีคำสั่ง delay และ measurement ด้วย
QPU มี basis gate เริ่มต้น แต่คุณสามารถเลือก Gate ใดก็ได้ตามต้องการ ตราบใดที่ให้ instruction หรือเพิ่ม pulse gate (ดู Create transpiler passes) basis gate เริ่มต้นคือ Gate ที่มีการทำ calibration บน QPU ไว้แล้ว จึงไม่จำเป็นต้องให้ instruction/pulse gate เพิ่มเติม ตัวอย่างเช่น บน QPU บางตัว cx คือ two-qubit gate เริ่มต้น และ ecr บางตัว ดู list ของ native gate และ operation ที่เป็นไปได้สำหรับรายละเอียดเพิ่มเติม
pass_manager = generate_preset_pass_manager(
optimization_level=1,
coupling_map=coupling_map,
basis_gates=basis_gates,
seed_transpiler=12345,
)
qc_t_cm_bg = pass_manager.run(qc)
qc_t_cm_bg.draw("mpl", idle_wires=False, fold=-1)
สังเกตว่า object CXGate ถูก decompose เป็น ecr gate และ single-qubit basis gate
อัตรา error ของ device
class Target สามารถประกอบด้วยข้อมูลเกี่ยวกับอัตรา error สำหรับการดำเนินการบน device
ตัวอย่างเช่น โค้ดต่อไปนี้ดึง properties ของ echoed cross-resonance (ECR) gate ระหว่าง Qubit 1 และ 0 (โปรดทราบว่า ECR gate มีทิศทาง):
target["ecr"][(1, 0)]
InstructionProperties(duration=5.333333333333332e-07, error=0.007494257741828603)
output แสดง duration ของ Gate (เป็นวินาที) และอัตรา error ของมัน เพื่อเปิดเผยข้อมูล error ให้ Transpiler สร้าง target model ด้วย basis_gates และ coupling_map จากข้างต้น และใส่ค่า error จาก Backend FakeSherbrooke
from qiskit.transpiler import Target
from qiskit.circuit.controlflow import IfElseOp, SwitchCaseOp, ForLoopOp
err_targ = Target.from_configuration(
basis_gates=basis_gates,
coupling_map=coupling_map,
num_qubits=target.num_qubits,
custom_name_mapping={
"if_else": IfElseOp,
"switch_case": SwitchCaseOp,
"for_loop": ForLoopOp,
},
)
for i, (op, qargs) in enumerate(target.instructions):
if op.name in basis_gates:
err_targ[op.name][qargs] = target.instruction_properties(i)
Transpile ด้วย target err_targ ใหม่ของเราเป็น target:
pass_manager = generate_preset_pass_manager(
optimization_level=1, target=err_targ, seed_transpiler=12345
)
qc_t_cm_bg_et = pass_manager.run(qc)
qc_t_cm_bg_et.draw("mpl", idle_wires=False, fold=-1)
เนื่องจาก target ประกอบด้วยข้อมูล error pass VF2PostLayout จะพยายามหา Qubit ที่เหมาะสมที่สุด ส่งผลให้ได้ circuit เดิมที่พบตั้งแต่แรกด้วย physical Qubit เดิม
ขั้นตอนถัดไป
- ทำความเข้าใจ การตั้งค่าเริ่มต้นและตัวเลือกการกำหนดค่าของ Transpilation
- ทบทวนหัวข้อ parameter ที่ใช้บ่อยสำหรับ transpilation
- ลองทำ guide Compare transpiler settings
- ดู เอกสาร Transpile API