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

พารามิเตอร์ที่ใช้บ่อยสำหรับการ transpile

Package versions

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

qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1

หน้านี้อธิบายพารามิเตอร์ที่ใช้บ่อยกว่าสำหรับการ transpile ในเครื่อง พารามิเตอร์เหล่านี้ตั้งค่าผ่าน arguments ของ generate_preset_pass_manager หรือ transpile

ระดับการประมาณค่า

คุณสามารถใช้ approximation degree เพื่อระบุว่าต้องการให้ circuit ผลลัพธ์ตรงกับ circuit ที่ต้องการ (input) มากแค่ไหน ค่านี้เป็น float ในช่วง (0.0 - 1.0) โดย 0.0 คือการประมาณค่าสูงสุด และ 1.0 (ค่าเริ่มต้น) คือไม่มีการประมาณค่า ค่าที่น้อยกว่าจะแลกความแม่นยำของ output กับความสะดวกในการรัน (นั่นคือ Gate น้อยลง) ค่าเริ่มต้นคือ 1.0

ในการสังเคราะห์ unitary สอง-Qubit (ใช้ในขั้นตอนเริ่มต้นของทุกระดับและสำหรับขั้นตอน optimization ที่ optimization level 3) ค่านี้ระบุ target fidelity ของการ decompose ผลลัพธ์ กล่าวคือ ข้อผิดพลาดเท่าไรที่เกิดขึ้นเมื่อ matrix representation ของ circuit ถูกแปลงเป็น discrete gates หาก approximation degree มีค่าน้อยกว่า (ประมาณมากกว่า) circuit ผลลัพธ์จากการสังเคราะห์จะต่างจาก input matrix มากกว่า แต่ก็มีแนวโน้มที่จะมี Gate น้อยกว่า (เนื่องจาก arbitrary two-qubit operation ใดๆ สามารถ decompose ได้อย่างสมบูรณ์ด้วย CX gate สูงสุดสามตัว) และรันได้ง่ายกว่า

เมื่อ approximation degree น้อยกว่า 1.0 Circuit ที่มี CX gate หนึ่งหรือสองตัวอาจถูกสังเคราะห์ ทำให้ข้อผิดพลาดจากฮาร์ดแวร์น้อยลง แต่ข้อผิดพลาดจากการประมาณค่าเพิ่มขึ้น เนื่องจาก CX เป็น Gate ที่มีราคาแพงที่สุดในแง่ของข้อผิดพลาด จึงอาจเป็นประโยชน์ที่จะลดจำนวนลงโดยแลกกับ fidelity ในการสังเคราะห์ (เทคนิคนี้ถูกใช้เพื่อเพิ่ม quantum volume บนอุปกรณ์ IBM®: Validating quantum computers using randomized model circuits)

ตัวอย่างเช่น เราสร้าง UnitaryGate สอง-Qubit แบบสุ่มซึ่งจะถูกสังเคราะห์ในขั้นตอนเริ่มต้น การตั้งค่า approximation_degree น้อยกว่า 1.0 อาจสร้าง circuit ที่เป็นการประมาณค่า นอกจากนี้เราต้องระบุ basis_gates เพื่อให้วิธีการสังเคราะห์รู้ว่า Gate ไหนที่สามารถใช้สำหรับการสังเคราะห์แบบประมาณค่า

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
from qiskit import QuantumCircuit, QuantumRegister
from qiskit.circuit.library import UnitaryGate
from qiskit.quantum_info import random_unitary
from qiskit.transpiler import generate_preset_pass_manager

UU = random_unitary(4, seed=12345)
rand_U = UnitaryGate(UU)

qubits = QuantumRegister(2, name="q")
qc = QuantumCircuit(qubits)
qc.append(rand_U, qubits)
pass_manager = generate_preset_pass_manager(
optimization_level=1,
approximation_degree=0.85,
basis_gates=["sx", "rz", "cx"],
)
approx_qc = pass_manager.run(qc)
print(approx_qc.count_ops()["cx"])
2

ผลลัพธ์คือ 2 เนื่องจากการประมาณค่าต้องใช้ CX gate น้อยกว่า

Seed ของตัวสร้างตัวเลขสุ่ม

บางส่วนของ Transpiler เป็น stochastic ดังนั้นการรัน transpile ซ้ำๆ อาจคืนผลลัพธ์ที่แตกต่างกัน เพื่อให้ได้ผลลัพธ์ที่ reproducible คุณสามารถตั้งค่า seed สำหรับ pseudorandom number generator โดยใช้ argument seed_transpiler การรันซ้ำๆ โดยใช้ seed เดียวกันจะคืนผลลัพธ์เดียวกัน

ตัวอย่าง:

pass_manager = generate_preset_pass_manager(
optimization_level=1, seed_transpiler=11, basis_gates=["sx", "rz", "cx"]
)
optimized_1 = pass_manager.run(qc)
optimized_1.draw("mpl")

Output of the previous code cell

Layout เริ่มต้น

ก่อนการ transpile Qubit ที่อยู่ใน Circuit ของคุณเป็น virtual qubit ที่ไม่จำเป็นต้องตรงกับ physical qubit บน Backend เป้าหมาย คุณสามารถระบุการ mapping เริ่มต้นของ virtual qubit ไปยัง physical qubit โดยใช้ argument initial_layout โปรดทราบว่า layout ของ Qubit ในตอนท้ายอาจแตกต่างจาก layout เริ่มต้น เนื่องจาก Transpiler อาจสลับ Qubit โดยใช้ swap gates หรือวิธีอื่นๆ

ในตัวอย่างด้านล่าง เราสร้าง initial layout สำหรับ FakeSherbrooke mock backend โดยการสร้าง object Layout layout ของเรา map Qubit แรกของ Circuit ไปยัง Qubit 5 ของ Sherbrooke และ map Qubit ที่สองของ Circuit ไปยัง Qubit 6 ของ Sherbrooke โปรดทราบว่า physical qubit จะแสดงเป็น integer เสมอ

from qiskit_ibm_runtime.fake_provider import FakeSherbrooke
from qiskit.transpiler import Layout

backend = FakeSherbrooke()

a, b = qubits
initial_layout = Layout({a: 5, b: 6})

pass_manager = generate_preset_pass_manager(
optimization_level=1, backend=backend, initial_layout=initial_layout
)
transpiled_circ = pass_manager.run(qc)

transpiled_circ.draw("mpl", idle_wires=False)

Output of the previous code cell

นอกจากการระบุ Layout object แล้ว คุณยังสามารถส่ง list ของ integer ได้ โดย element ที่ ii ของ list จะมี physical qubit ที่ Qubit ที่ ii ควร map ไปยัง ตัวอย่างเช่น:

initial_layout = [5, 6]

pass_manager = generate_preset_pass_manager(
optimization_level=1, backend=backend, initial_layout=initial_layout
)
transpiled_circ = pass_manager.run(qc)

transpiled_circ.draw("mpl", idle_wires=False)

Output of the previous code cell

คุณสามารถใช้ฟังก์ชัน plot_error_map เพื่อสร้างแผนภาพของ device graph พร้อมข้อมูลข้อผิดพลาดและ physical qubit ที่มีป้ายกำกับ คุณยังสามารถดูแผนภาพที่คล้ายกันได้ที่หน้า Compute resources

from qiskit.visualization import plot_error_map

plot_error_map(backend, figsize=(30, 24))

Output of the previous code cell

ตัวเลือก stage และ plugin ของ Transpiler

ตัวเลือกเหล่านี้มี suffix _method ตัวเลือกเหล่านี้มีอิทธิพลต่อวิธีที่ Transpiler ทำงานและใช้เพื่อพยายามให้ได้ output ที่ดีกว่า แตกต่าง หรือเฉพาะเจาะจงจาก Transpiler

  • init_method (str) - Plugin ที่ใช้สำหรับ initialization stage

  • layout_method (str) - Layout selection pass (trivial, dense, sabre) ซึ่งยังสามารถเป็นชื่อ external plugin ที่จะใช้สำหรับ layout stage ได้

  • optimization_method (str) - Plugin ที่ใช้สำหรับ optimization stage

  • routing_method (str) - ชื่อของ routing pass (basic, lookahead, default, sabre, none) ซึ่งยังสามารถเป็นชื่อ external plugin ที่จะใช้สำหรับ routing stage ได้

  • scheduling_method (str) - ชื่อของ scheduling pass ซึ่งยังสามารถเป็นชื่อ external plugin ที่จะใช้สำหรับ scheduling stage ได้

    • as_soon_as_possible: Schedule instructions แบบ greedy: เร็วที่สุดเท่าที่เป็นไปได้บน qubit resource (alias: asap)
    • as_late_as_possible: Schedule instructions ช้า นั่นคือ รักษา qubit ให้อยู่ใน ground state เมื่อเป็นไปได้ (alias: alap)
  • translation_method (str) - ชื่อของ translation pass (unroller, translator, synthesis) ซึ่งยังสามารถเป็นชื่อ external plugin ที่จะใช้สำหรับ translation stage ได้

  • unitary_synthesis_method (str) - ชื่อของวิธี unitary synthesis ที่จะใช้ โดยค่าเริ่มต้นจะใช้ default

หมายเหตุ

เพื่อดูรายการ plugin ที่ติดตั้งทั้งหมดสำหรับ stage ที่กำหนด ให้รัน list_stage_plugins("stage_name") ตัวอย่างเช่น ถ้าต้องการดูรายการ plugin ที่ติดตั้งทั้งหมดสำหรับ routing stage ให้รัน list_stage_plugins(routing)

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

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