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

ค่าเริ่มต้นและตัวเลือกการกำหนดค่าของ Transpilation

เวอร์ชันของแพคเกจ

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

qiskit[all]~=2.5.2
qiskit-ibm-runtime~=0.47.0

Abstract circuits ต้องถูก transpile เนื่องจาก QPU มีชุด basis gates ที่จำกัดและไม่สามารถรันการดำเนินการได้ทุกอย่าง ฟังก์ชันของ Transpiler คือการเปลี่ยนวงจรที่หลากหลายให้สามารถรันบน QPU ที่ระบุได้ ซึ่งทำโดยการแปลงวงจรเป็น basis gates ที่รองรับ และเพิ่ม SWAP gates ตามความจำเป็น เพื่อให้การเชื่อมต่อของวงจรตรงกับ QPU

ดังที่อธิบายไว้ใน Transpile ด้วย pass managers คุณสามารถสร้าง pass manager โดยใช้ฟังก์ชัน generate_preset_pass_manager และส่งวงจรหรือรายการวงจรไปยังเมธอด run เพื่อ transpile วงจรเหล่านั้น คุณสามารถเรียก generate_preset_pass_manager โดยส่งแค่ระดับการปรับแต่งและ Backend เพื่อใช้ค่าเริ่มต้นสำหรับตัวเลือกอื่นทั้งหมด หรือจะส่ง argument เพิ่มเติมเพื่อปรับแต่ง transpilation ได้

การใช้งานเบื้องต้นโดยไม่มีพารามิเตอร์

ในตัวอย่างนี้ เราส่งวงจรและ QPU เป้าหมายไปยัง Transpiler โดยไม่ระบุพารามิเตอร์เพิ่มเติม

สร้างวงจรและดูผลลัพธ์:

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
from qiskit import QuantumCircuit
from qiskit.circuit.library import grover_operator, DiagonalGate
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke

# Create circuit to test transpiler on
oracle = DiagonalGate([1] * 7 + [-1])
qc = QuantumCircuit(3)
qc.h([0, 1, 2])
qc = qc.compose(grover_operator(oracle))

# Add measurements to the circuit
qc.measure_all()

# View the circuit
qc.draw(output="mpl")

Output of the previous code cell

Transpile วงจรและดูผลลัพธ์:

from qiskit.transpiler import generate_preset_pass_manager

# Specify the QPU to target
backend = FakeSherbrooke()

# Transpile the circuit
pass_manager = generate_preset_pass_manager(
optimization_level=1, backend=backend
)
transpiled_circ = pass_manager.run(qc)

# View the transpiled circuit
transpiled_circ.draw(output="mpl", idle_wires=False)

Output of the previous code cell

พารามิเตอร์ทั้งหมดที่ใช้ได้

ต่อไปนี้คือพารามิเตอร์ทั้งหมดที่ใช้ได้สำหรับฟังก์ชัน generate_preset_pass_manager อาร์กิวเมนต์แบ่งเป็นสองประเภท คือ ประเภทที่อธิบายเป้าหมายของการ compile และประเภทที่มีผลต่อวิธีการทำงานของ Transpiler

พารามิเตอร์ทั้งหมดยกเว้น optimization_level เป็นตัวเลือก สำหรับรายละเอียดครบถ้วน ดู เอกสาร API ของ Transpiler

  • optimization_level (int) - ระดับการปรับแต่งที่จะดำเนินการกับวงจร เป็น integer ในช่วง (0 - 3) ระดับที่สูงกว่าจะสร้างวงจรที่ปรับแต่งมากขึ้น แต่ใช้เวลา transpilation นานกว่า ดู การตั้งค่าระดับการปรับแต่งของ Transpiler สำหรับรายละเอียดเพิ่มเติม

พารามิเตอร์สำหรับอธิบายเป้าหมายของการ compile:

argument เหล่านี้อธิบาย QPU เป้าหมายสำหรับการรันวงจร รวมถึงข้อมูลเช่น coupling map ของ QPU (ซึ่งอธิบายการเชื่อมต่อของ Qubit) basis gates ที่ QPU รองรับ และอัตราข้อผิดพลาดของ Gates

พารามิเตอร์เหล่านี้หลายตัวถูกอธิบายอย่างละเอียดใน พารามิเตอร์ที่ใช้บ่อยสำหรับ transpilation

พารามิเตอร์ QPU (`Backend`)

Backend parameters - หากระบุ backend ไม่จำเป็นต้องระบุ target หรือตัวเลือก backend อื่นใด ในทำนองเดียวกัน หากระบุ target ก็ไม่จำเป็นต้องระบุ backend หรือตัวเลือก backend อื่นใด

  • backend (Backend) - หากตั้งค่านี้ transpiler จะคอมไพล์วงจรอินพุตไปยังอุปกรณ์นี้ หากมีการตั้งค่าตัวเลือกอื่นที่ส่งผลต่อการตั้งค่านี้ เช่น coupling_map จะแทนที่การตั้งค่าจาก backend
  • target (Target) - เป้าหมาย transpiler ของ backend โดยปกติจะระบุเป็นส่วนหนึ่งของอาร์กิวเมนต์ backend แต่หากคุณสร้างอ็อบเจ็กต์ Target เองด้วยตนเอง สามารถระบุได้ที่นี่ ซึ่งจะแทนที่ target จาก backend
  • backend_properties (BackendProperties) - คุณสมบัติที่ส่งคืนโดย QPU รวมถึงข้อมูลเกี่ยวกับ gate errors, readout errors, qubit coherence times และอื่นๆ ค้นหา QPU ที่ให้ข้อมูลนี้ได้โดยรัน backend.properties()
  • timing_constraints (Dict[str, int] | None) - ข้อจำกัดฮาร์ดแวร์ควบคุมที่เป็นทางเลือกสำหรับความละเอียดของเวลาคำสั่ง ข้อมูลนี้มาจากการกำหนดค่าของ QPU หาก QPU ไม่มีข้อจำกัดใดๆ เกี่ยวกับการจัดสรรเวลาคำสั่ง timing_constraints จะเป็น None และจะไม่มีการปรับใดๆ QPU อาจรายงานชุดข้อจำกัด ได้แก่:
    • granularity: ค่าจำนวนเต็มที่แสดงความละเอียดขั้นต่ำของ pulse gate ในหน่วย dt pulse gate ที่ผู้ใช้กำหนดเองควรมีระยะเวลาที่เป็นจำนวนเท่าของค่า granularity นี้
    • min_length: ค่าจำนวนเต็มที่แสดงความยาวขั้นต่ำของ pulse gate ในหน่วย dt pulse gate ที่ผู้ใช้กำหนดเองควรมีความยาวมากกว่าความยาวนี้
    • pulse_alignment: ค่าจำนวนเต็มที่แสดงความละเอียดของเวลาที่ gate instruction เริ่มทำงาน gate instructions ควรเริ่มที่เวลาซึ่งเป็นจำนวนเท่าของค่านี้
    • acquire_alignment: ค่าจำนวนเต็มที่แสดงความละเอียดของเวลาที่ measure instruction เริ่มทำงาน measure instruction ควรเริ่มที่เวลาซึ่งเป็นจำนวนเท่าของค่านี้
พารามิเตอร์ Layout และ topology
  • basis_gates (List[str] | None) - รายการชื่อ basis gate สำหรับ unroll ตัวอย่างเช่น ['u1', 'u2', 'u3', 'cx'] ถ้าเป็น None จะไม่ทำการ unroll

  • coupling_map (CouplingMap | List[List[int]]) - Directed coupling map (อาจเป็นแบบกำหนดเอง) สำหรับเป้าหมายใน mapping ถ้า coupling map มีความสมมาตร ต้องระบุทั้งสองทิศทาง รองรับรูปแบบเหล่านี้:

    • CouplingMap instance

    • List - ต้องให้เป็น adjacency matrix โดยแต่ละ entry ระบุ two-qubit interactions ที่ directed ทั้งหมดที่ QPU รองรับ ตัวอย่างเช่น: [[0, 1], [0, 3], [1, 2], [1, 5], [2, 5], [4, 1], [5, 3]]

  • inst_map (List[InstructionScheduleMap] | None) - การแมปการดำเนินการของวงจรไปยังตารางเวลาพัลส์ หากเป็น None จะใช้ instruction_schedule_map ของ QPU

พารามิเตอร์สำหรับมีผลต่อวิธีการทำงานของ Transpiler

พารามิเตอร์เหล่านี้ส่งผลต่อขั้นตอน transpilation เฉพาะ บางตัวอาจส่งผลต่อหลายขั้นตอน แต่ถูกระบุไว้ภายใต้ขั้นตอนเดียวเพื่อความง่าย ถ้าคุณระบุ argument เช่น initial_layout สำหรับ Qubit ที่ต้องการใช้ ค่านั้นจะ override pass ทั้งหมดที่อาจเปลี่ยนมัน กล่าวคือ Transpiler จะไม่เปลี่ยนสิ่งที่คุณระบุด้วยตนเอง สำหรับรายละเอียดเกี่ยวกับขั้นตอนเฉพาะ ดู ขั้นตอนของ Transpiler

ขั้นตอน Initialization
  • hls_config (HLSConfig) - class การกำหนดค่า HLSConfig แบบ optional ที่ส่งต่อโดยตรงไปยัง transformation pass HighLevelSynthesis class การกำหนดค่านี้ช่วยให้คุณระบุรายการ synthesis algorithms และพารามิเตอร์สำหรับ high-level objects ต่างๆ

  • init_method (str) - ชื่อ plugin สำหรับใช้ในขั้นตอน initialization โดยค่าเริ่มต้นไม่ใช้ external plugin คุณดูรายการ plugins ที่ติดตั้งได้โดยรัน list_stage_plugins() พร้อม init สำหรับ argument ชื่อ stage

  • unitary_synthesis_method (str) - ชื่อ unitary synthesis method ที่จะใช้ โดยค่าเริ่มต้นจะใช้ default คุณดูรายการ plugins ที่ติดตั้งได้โดยรัน unitary_synthesis_plugin_names()

  • unitary_synthesis_plugin_config (dict) - พจนานุกรมการกำหนดค่าเสริมที่ส่งตรงไปยังปลั๊กอินการสังเคราะห์ unitary โดยค่าเริ่มต้น การตั้งค่านี้ไม่มีผลใดๆ เนื่องจากเมธอดการสังเคราะห์ unitary เริ่มต้นไม่รับการกำหนดค่าที่กำหนดเอง การใช้การกำหนดค่าที่กำหนดเองควรจำเป็นเฉพาะเมื่อระบุปลั๊กอินการสังเคราะห์ unitary ด้วยอาร์กิวเมนต์ unitary_synthesis เนื่องจากสิ่งนี้กำหนดเองสำหรับปลั๊กอินการสังเคราะห์ unitary แต่ละตัว ให้ดูเอกสารของปลั๊กอินนั้นสำหรับวิธีใช้ตัวเลือกนี้

ขั้นตอนเลย์เอาต์
  • initial_layout (Layout | Dict | List) - ตำแหน่งเริ่มต้นของ virtual qubits บน physical qubits ถ้า layout นี้ทำให้วงจรเข้ากันได้กับข้อจำกัดของ coupling_map ก็จะถูกนำไปใช้ แต่ layout สุดท้ายไม่ได้รับประกันว่าจะเหมือนเดิม เนื่องจาก Transpiler อาจสลับ qubits ผ่าน swaps หรือวิธีอื่น สำหรับรายละเอียดครบถ้วน ดู ส่วน Initial layout

  • layout_method (str) - ชื่อของ layout selection pass (default, dense, sabre และ trivial) นอกจากนี้ยังสามารถเป็นชื่อ external plugin ที่ใช้สำหรับขั้นตอน layout ได้ ดูรายการ plugin ที่ติดตั้งไว้ได้โดยรัน list_stage_plugins() โดยใส่ layout เป็นอาร์กิวเมนต์ stage_name ค่าเริ่มต้นคือ sabre

ขั้นตอน Routing
  • routing_method (str) - ชื่อของ routing pass (basic, lookahead, default, sabre หรือ none) นอกจากนี้ยังสามารถเป็นชื่อ external plugin ที่ใช้สำหรับขั้นตอน routing ได้ ดูรายการ plugin ที่ติดตั้งไว้ได้โดยรัน list_stage_plugins() โดยใส่ routing เป็นอาร์กิวเมนต์ stage_name ค่าเริ่มต้นคือ sabre
ขั้นตอน Translation
  • translation_method (str) - ชื่อของ translation pass (default, synthesis, translator, ibm_backend, ibm_dynamic_circuits, ibm_fractional) นี่อาจเป็นชื่อปลั๊กอินภายนอกที่ใช้สำหรับขั้นตอนการแปล คุณสามารถดูรายการปลั๊กอินที่ติดตั้งได้โดยการรัน list_stage_plugins() โดยใช้ translation สำหรับอาร์กิวเมนต์ stage_name ค่าเริ่มต้นคือ translator
ขั้นตอนการปรับให้เหมาะสม
  • approximation_degree (float ในช่วง 0-1 | None) - ตัวปรับฮิวริสติกที่ใช้สำหรับการประมาณค่าวงจร (1.0 = ไม่มีการประมาณค่า, 0.0 = การประมาณค่าสูงสุด) ค่าเริ่มต้นคือ 1.0 การระบุ None จะตั้งค่าระดับการประมาณให้เท่ากับอัตราความผิดพลาดที่รายงาน ดู ส่วน Approximation degree สำหรับรายละเอียดเพิ่มเติม

  • optimization_method (str) - ชื่อปลั๊กอินที่ใช้สำหรับขั้นตอนการปรับให้เหมาะสม โดยค่าเริ่มต้นจะไม่ใช้ปลั๊กอินภายนอก คุณสามารถดูรายการปลั๊กอินที่ติดตั้งได้โดยการรัน list_stage_plugins() โดยใช้ optimization สำหรับอาร์กิวเมนต์ stage_name

ขั้นตอนการจัดตารางเวลา
  • scheduling_method (str) - ชื่อของ scheduling pass นี่อาจเป็นชื่อปลั๊กอินภายนอกที่ใช้สำหรับขั้นตอนการจัดตารางเวลา คุณสามารถดูรายการปลั๊กอินที่ติดตั้งได้โดยการรัน list_stage_plugins() โดยใช้ scheduling สำหรับอาร์กิวเมนต์ stage_name

    • 'as_soon_as_possible': จัดตารางเวลาคำสั่งแบบโลภ (greedy) ให้เร็วที่สุดเท่าที่จะทำได้บนทรัพยากรคิวบิต (ชื่อย่อ: asap)

    • 'as_late_as_possible': จัดตารางเวลาคำสั่งให้ช้าลง กล่าวคือ รักษาคิวบิตให้อยู่ในสถานะกราวด์เมื่อเป็นไปได้ (ชื่อย่อ: alap) นี่คือค่าเริ่มต้น

การรันตัวแปลง (transpiler)
  • seed_transpiler (int) - กำหนด random seed สำหรับส่วนที่เป็น stochastic ของ transpiler

ค่าเริ่มต้นต่อไปนี้จะถูกใช้ถ้าคุณไม่ระบุพารามิเตอร์ใดข้างต้น ดูหน้า API reference ของเมธอดสำหรับข้อมูลเพิ่มเติม:

generate_preset_pass_manager(
optimization_level=1,
backend=None,
target=None,
basis_gates=None,
coupling_map=None,
initial_layout=None,
layout_method=None,
routing_method=None,
translation_method=None,
scheduling_method=None,
approximation_degree=1.0,
seed_transpiler=None,
unitary_synthesis_method="default",
unitary_synthesis_plugin_config=None,
hls_config=None,
init_method=None,
optimization_method=None,
)
<qiskit.transpiler.passmanager.StagedPassManager at 0x7fa51ff33590>

ขั้นตอนต่อไป

คำแนะนำ