การ transpile ด้วย pass managers
เวอร์ชันแพ็คเกจ
โค้ดในหน้านี้พัฒนาโดยใช้ requirements ต่อไปนี้ แนะนำให้ใช้เวอร์ชันเหล่านี้หรือใหม่กว่า
qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1
วิธีที่แนะนำในการ transpile Circuit คือการสร้าง staged pass manager และเรียกใช้เมธอด run โดยส่ง circuit เป็น input หน้านี้อธิบายวิธี transpile quantum circuits ด้วยแนวทางนี้
pass manager (แบบ staged) คืออะไร?
ในบริบทของ Qiskit SDK การ transpilation หมายถึงกระบวนการแปลง circuit ต้นฉบับให้อยู่ในรูปแบบที่เหมาะสมสำหรับการรันบนอุปกรณ์ควอนตัม โดยทั่วไปการ transpilation จะเกิดขึ้นเป็นลำดับขั้นตอนที่เรียกว่า transpiler passes โดย circuit จะถูกประมวลผลโดย transpiler pass แต่ละตัวตามลำดับ และผลลัพธ์ของ pass หนึ่งจะกลายเป็น input ของ pass ถัดไป ตัวอย่างเช่น pass หนึ่งอาจวิเคราะห์ circuit และรวม single-qubit gates ที่ต่อเนื่องกันทั้งหมด จากนั้น pass ถัดไปอาจสังเคร าะห์ gates เหล่านี้ให้อยู่ใน basis set ของอุปกรณ์เป้าหมาย transpiler passes ที่มาพร้อมกับ Qiskit อยู่ในโมดูล qiskit.transpiler.passes
pass manager คือออบเจ็กต์ที่เก็บรายการ transpiler passes และสามารถรันบน circuit ได้ สร้าง pass manager โดยสร้าง PassManager พร้อมรายการ transpiler passes เพื่อรันการ transpilation บน circuit ให้เรียกเมธอด run โดยส่ง circuit เป็น input
staged pass manager คือ pass manager ชนิดพิเศษที่แสดงถึงระดับของ abstraction ที่สูงกว่า pass manager ธรรมดา ในขณะที่ pass manager ธรรมดาประกอบด้วย transpiler passes หลายตัว staged pass manager ประกอบด้วย pass managers หลายตัว นี่เป็น abstraction ที่มีประโยชน์เพราะการ transpilation มักเกิดขึ้นในขั้นตอนที่ชัดเจน ตามที่อธิบายใน Transpiler stages โดยแต่ละขั้นตอนจะแสดงด้วย pass manager staged pass managers แสดงด้วยคลาส StagedPassManager ส่วนที่เหลือของหน้านี้อธิบายวิธีสร้างและปรับแต่ง (staged) pass managers
สร้าง preset staged pass manager
เพื่อสร้าง preset staged pass manager ที่มีค่าเริ่มต้นที่เหมาะสม ให้ใช้ฟังก์ชัน generate_preset_pass_manager:
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-ibm-runtime
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
backend = service.backend("ibm_fez")
pass_manager = generate_preset_pass_manager(
optimization_level=3, backend=backend
)
เพื่อ transpile circuit หรือรายการของ circuits ด้วย pass manager ให้ส่ง circuit หรือรายการของ circuits ไปยังเมธอด run มาลองทำกับ two-qubit circuit ที่ประกอบด้วย Hadamard ตามด้วย CX gates ที่อยู่ติดกันสองตัว:
from qiskit import QuantumRegister, QuantumCircuit
# Create a circuit
qubits = QuantumRegister(2, name="q")
circuit = QuantumCircuit(qubits)
a, b = qubits
circuit.h(a)
circuit.cx(a, b)
circuit.cx(b, a)
# Transpile it by calling the run method of the pass manager
transpiled = pass_manager.run(circuit)
# Draw it, excluding idle qubits from the diagram
transpiled.draw("mpl", idle_wires=False)
ดู Transpilation defaults and configuration options สำหรับคำอธิบายของ arguments ที่เป็นไปได้สำหรับฟังก์ชัน generate_preset_pass_manager arguments ของ generate_preset_pass_manager ตรงกับ arguments ของฟังก์ชัน transpile
ถ้า preset pass managers ไม่ตอบสนองความต้องการ สามารถปรับแต่งการ transpilation ได้โดยสร้าง (staged) pass managers หรือแม้แต่ transpilation passes ส่วนที่เหลือของหน้านี้อธิบายวิธีสร้าง pass managers สำหรับคำแนะนำในการสร้าง transpilation passes ดู Write your own transpiler pass
สร้าง pass manager เอง
โมดูล qiskit.transpiler.passes มี transpiler passes จำนวนมากที่สามารถใช้สร้าง pass managers ได้ เพื่อสร้าง pass manager ให้สร้าง PassManager พร้อมรายการ passes ตัวอย่างเช่น โค้ดต่อไปนี้สร้าง transpiler pass ที่รวม adjacent two-qubit gates และสังเคราะห์ให้อยู่ใน basis ของ Gate , และ
from qiskit.transpiler import PassManager
from qiskit.transpiler.passes import (
Collect2qBlocks,
ConsolidateBlocks,
UnitarySynthesis,
)
basis_gates = ["rx", "ry", "rxx"]
translate = PassManager(
[
Collect2qBlocks(),
ConsolidateBlocks(basis_gates=basis_gates),
UnitarySynthesis(basis_gates),
]
)
เพื่อแสดงให้เห็น pass manager นี้ในทางปฏิบัติ ให้ทดสอบกับ two-qubit circuit ที่ประกอบด้วย Hadamard ตามด้วย CX gates ที่อยู่ติดกันสองตัว:
from qiskit import QuantumRegister, QuantumCircuit
qubits = QuantumRegister(2, name="q")
circuit = QuantumCircuit(qubits)
a, b = qubits
circuit.h(a)
circuit.cx(a, b)
circuit.cx(b, a)
circuit.draw("mpl")
เพื่อรัน pass manager บน circuit ให้เรียกเมธอด run
translated = translate.run(circuit)
translated.draw("mpl")
สำหรับตัวอย่างขั้นสูงที่แสดงวิธีสร้าง pass manager เพื่อใช้เทคนิคการระงับข้อผิดพลาดที่เรียกว่า dynamical decoupling ดู Create a pass manager for dynamical decoupling
สร้าง staged pass manager
StagedPassManager คือ pass manager ที่ประกอบด้วย stages แต่ละ stage ซึ่งกำหนดโดย instance ของ PassManager สามารถสร้าง StagedPassManager โดยระบุ stages ที่ต้องการ ตัวอย่างเช่น โค้ดต่อไปนี้สร้าง staged pass manager ที่มีสอง stages คือ init และ translation โดย translation stage กำหนดด้วย pass manager ที่สร้างขึ้นก่อนหน้า
from qiskit.transpiler import PassManager, StagedPassManager
from qiskit.transpiler.passes import UnitarySynthesis, Unroll3qOrMore
basis_gates = ["rx", "ry", "rxx"]
init = PassManager(
[UnitarySynthesis(basis_gates, min_qubits=3), Unroll3qOrMore()]
)
staged_pm = StagedPassManager(
stages=["init", "translation"], init=init, translation=translate
)
ไม่มีข้อจำกัดสำหรับจำนวน stages ที่ใส่ใน staged pass manager
อีกวิธีที่มีประโยชน์ในการสร้าง staged pass manager คือเริ่มต้นจาก preset staged pass manager แล้วสลับบาง stages ออก ตัวอย่างเช่น โค้ดต่อไปน ี้สร้าง preset pass manager ที่มี optimization level 3 จากนั้นระบุ pre_layout stage แบบกำหนดเอง
import numpy as np
from qiskit.circuit.library import HGate, PhaseGate, RXGate, TdgGate, TGate
from qiskit.transpiler.passes import InverseCancellation
pass_manager = generate_preset_pass_manager(3, backend)
inverse_gate_list = [
HGate(),
(RXGate(np.pi / 4), RXGate(-np.pi / 4)),
(PhaseGate(np.pi / 4), PhaseGate(-np.pi / 4)),
(TGate(), TdgGate()),
]
logical_opt = PassManager(
[
InverseCancellation(inverse_gate_list),
]
)
# Add pre-layout stage to run extra logical optimization
pass_manager.pre_layout = logical_opt
ฟังก์ชัน stage generator อาจมีประโยชน์สำหรับการสร้าง pass managers แบบกำหนดเอง
ฟังก์ชันเหล่านี้สร้าง stages ที่ให้ฟังก์ชันการทำงานทั่วไปที่ใช้ใน pass managers จำนวนมาก
ตัวอย่างเช่น generate_embed_passmanager สามารถใช้สร้าง stage
เพื่อ "embed" Layout เริ่มต้นที่เลือกจาก layout pass ไปยังอุปกรณ์เป้าหมายที่ระบุ
ขั้นตอนถัดไป
- เขียน custom transpiler pass
- สร้าง pass manager สำหรับ dynamical decoupling
- เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับฟังก์ชัน
generate_preset_passmanagerดูหัวข้อ Transpilation default settings and configuration options - ลองดู Compare transpiler settings
- ทบทวน transpiler API documentation