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

การ 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

Having trouble remembering pass manager details? Try asking Qiskit Code Assistant.

ถ้า 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 RyR_y, RzR_z และ RxxR_{xx}

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 ไปยังอุปกรณ์เป้าหมายที่ระบุ

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

คำแนะนำ
Source: IBM Quantum docs — updated 1 เม.ย. 2569
English version on doQumentation — updated 7 พ.ค. 2569
This translation based on the English version of 11 มี.ค. 2569