ข้ามไปยังเนื้อหาหลัก
โครงการนี้อยู่ในช่วงเบต้า พบข้อผิดพลาด? สร้าง GitHub Issue มีคำถามหรือไอเดีย? ถามใน Discussions — ยินดีรับฟังความคิดเห็น!
คุณภาพการแปลในหน้านี้เป็นอย่างไร?

ติดตั้งและใช้งาน transpiler plugins

Package versions

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

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

เพื่ออำนวยความสะดวกในการพัฒนาและนำโค้ด transpilation แบบกำหนดเองกลับมาใช้ซ้ำโดยชุมชน Qiskit ในวงกว้าง Qiskit SDK รองรับ interface แบบ plugin ที่ช่วยให้แพ็กเกจ Python ของบุคคลที่สามสามารถประกาศว่าตนมีฟังก์ชัน transpilation ที่ขยายเพิ่มเติมซึ่งเข้าถึงได้ผ่าน Qiskit

ปัจจุบัน plugin ของบุคคลที่สามสามารถให้ฟังก์ชัน transpilation ที่ขยายเพิ่มเติมได้สามวิธี:

  • transpiler stage plugin ให้ pass manager ที่สามารถใช้แทนหนึ่งใน 6 ขั้นตอน ของ preset staged pass manager ได้แก่: init, layout, routing, translation, optimization และ scheduling

  • unitary synthesis plugin ให้ฟังก์ชันที่ขยายเพิ่มเติมสำหรับการสังเคราะห์ unitary gate

  • high-level synthesis plugin ให้ฟังก์ชันที่ขยายเพิ่มเติมสำหรับการสังเคราะห์ "high-level objects" เช่น linear functions หรือ Clifford operators โดย high-level objects แทนด้วย subclass ของคลาส Operation

ส่วนที่เหลือของหน้านี้อธิบายวิธีแสดงรายการ plugin ที่มีอยู่ ติดตั้ง plugin ใหม่ และใช้งาน plugin เหล่านั้น

แสดงรายการ plugin ที่มีอยู่และติดตั้ง plugin ใหม่​

Qiskit มี plugin ในตัวสำหรับ transpilation อยู่แล้ว หากต้องการติดตั้งเพิ่มเติม สามารถใช้ Python package manager ได้ ตัวอย่างเช่น อาจรัน pip install qiskit-toqm เพื่อติดตั้ง Qiskit TOQM routing stage plugin มี plugin ของบุคคลที่สามหลายตัวที่เป็นส่วนหนึ่งของ Qiskit ecosystem

แสดงรายการ transpiler stage plugins ที่มีอยู่​

ใช้ฟังก์ชัน list_stage_plugins โดยส่งชื่อของขั้นตอนที่ต้องการแสดงรายการ plugin

# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util

_needed = {"qiskit": "qiskit", "qiskit_ibm_runtime": "qiskit-ibm-runtime"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
from qiskit.transpiler.preset_passmanagers.plugin import list_stage_plugins

list_stage_plugins("layout")
['default', 'dense', 'sabre', 'trivial']
list_stage_plugins("routing")
['basic', 'default', 'lookahead', 'none', 'sabre']

หากติดตั้ง qiskit-toqm ไว้ toqm จะปรากฏในรายการ routing plugins

แสดงรายการ unitary synthesis plugins ที่มีอยู่​

ใช้ฟังก์ชัน unitary_synthesis_plugin_names

from qiskit.transpiler.passes.synthesis import unitary_synthesis_plugin_names

unitary_synthesis_plugin_names()
['aqc', 'clifford', 'default', 'gridsynth', 'sk']

แสดงรายการ high-level synthesis plugins ที่มีอยู่​

ใช้ฟังก์ชัน high_level_synthesis_plugin_names โดยส่งชื่อของประเภท "high-level object" ที่ต้องการสังเคราะห์ ชื่อนี้สอดคล้องกับ attribute name ของคลาส Operation ที่แทนประเภทของออบเจ็กต์ที่กำลังสังเคราะห์

from qiskit.transpiler.passes.synthesis import (
high_level_synthesis_plugin_names,
)

high_level_synthesis_plugin_names("clifford")
['ag', 'bm', 'default', 'greedy', 'layers', 'lnn', 'rb_default']

สามารถใช้คลาส HighLevelSynthesisPluginManager เพื่อแสดงรายการชื่อของ high-level synthesis plugins ทั้งหมด:

from qiskit.transpiler.passes.synthesis.plugin import (
HighLevelSynthesisPluginManager,
)

HighLevelSynthesisPluginManager().plugins.names()
['FullAdder.default',
'FullAdder.ripple_c04',
'FullAdder.ripple_v95',
'HalfAdder.default',
'HalfAdder.qft_d00',
'HalfAdder.ripple_c04',
'HalfAdder.ripple_r25',
'HalfAdder.ripple_v95',
'IntComp.default',
'IntComp.noaux',
'IntComp.twos',
'ModularAdder.default',
'ModularAdder.modular_v17',
'ModularAdder.qft_d00',
'ModularAdder.ripple_c04',
'ModularAdder.ripple_v95',
'Multiplier.cumulative_h18',
'Multiplier.default',
'Multiplier.qft_r17',
'PauliEvolution.default',
'PauliEvolution.rustiq',
'WeightedSum.default',
'annotated.default',
'clifford.ag',
'clifford.bm',
'clifford.default',
'clifford.greedy',
'clifford.layers',
'clifford.lnn',
'linear_function.default',
'linear_function.kms',
'linear_function.pmh',
'mcmt.default',
'mcmt.noaux',
'mcmt.vchain',
'mcmt.xgate',
'mcx.1_clean_b95',
'mcx.1_clean_kg24',
'mcx.1_dirty_kg24',
'mcx.2_clean_kg24',
'mcx.2_dirty_kg24',
'mcx.default',
'mcx.gray_code',
'mcx.n_clean_m15',
'mcx.n_dirty_i15',
'mcx.noaux_hp24',
'mcx.noaux_v24',
'permutation.acg',
'permutation.basic',
'permutation.default',
'permutation.kms',
'permutation.token_swapper',
'qft.default',
'qft.full',
'qft.line',
'clifford.rb_default']

ใช้งาน plugin​

ในส่วนนี้จะแสดงวิธีใช้งาน transpiler plugins ในตัวอย่างโค้ด เราใช้ plugin ที่มากับ Qiskit แต่ plugin ที่ติดตั้งจากแพ็กเกจของบุคคลที่สามก็ใช้งานในลักษณะเดียวกัน

ใช้งาน transpiler stage plugin​

ในการใช้งาน transpiler stage plugin ให้ระบุชื่อของ plugin พร้อมกับ argument ที่เหมาะสมใน generate_preset_pass_manager หรือ transpile โดย argument จะเกิดจากการต่อ _method ต่อท้ายชื่อขั้นตอน transpilation ตัวอย่างเช่น หากต้องการใช้ lookahead routing plugin ให้ระบุ lookahead ใน argument routing_method

หมายเหตุ

ตัวอย่างเหล่านี้ใช้ mock backend FakeSherbrooke จาก qiskit_ibm_runtime แต่คุณสามารถลองใช้กับ real หรือ fake backend ที่รองรับ Qiskit ตัวใดก็ได้ ผลลัพธ์อาจแตกต่างกัน

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

backend = FakeSherbrooke()

pass_manager = generate_preset_pass_manager(
optimization_level=3, backend=backend, routing_method="lookahead"
)

ใช้งาน unitary synthesis plugin​

ในการใช้งาน unitary synthesis plugin ให้ระบุชื่อของ plugin เป็น argument unitary_synthesis_method ใน generate_preset_pass_manager หรือ transpile:

pass_manager = generate_preset_pass_manager(
optimization_level=3,
backend=backend,
unitary_synthesis_method="sk",
unitary_synthesis_plugin_config=dict(
basis_gates=["cz", "id", "rz", "sx", "x"]
),
)

Unitary synthesis ถูกใช้ในขั้นตอน init, translation และ optimization ของ staged pass manager ที่คืนค่าจาก generate_preset_pass_manager หรือที่ใช้ใน transpile ดู Transpiler stages สำหรับคำอธิบายของขั้นตอนเหล่านี้

ใช้ argument unitary_synthesis_plugin_config ซึ่งเป็น dictionary ที่กำหนดคีย์ได้อิสระ เพื่อส่งตัวเลือกสำหรับวิธี unitary synthesis เอกสารของวิธี synthesis ควรอธิบายตัวเลือกที่รองรับ ดู รายการนี้ สำหรับลิงก์ไปยังเอกสารของ unitary synthesis plugins ในตัว

ใช้งาน high-level synthesis plugin​

ขั้นแรก สร้าง HLSConfig เพื่อ จัดเก็บชื่อของ plugin ที่จะใช้กับ high-level objects ต่าง ๆ ตัวอย่างเช่น:

from qiskit.transpiler.passes import HLSConfig

hls_config = HLSConfig(clifford=["layers"], linear_function=["pmh"])

โค้ดเซลล์นี้สร้างการตั้งค่า high-level synthesis ที่ใช้ layers plugin สำหรับการสังเคราะห์ออบเจ็กต์ Clifford และ pmh plugin สำหรับการสังเคราะห์ ออบเจ็กต์ LinearFunction ชื่อของ keyword arguments สอดคล้องกับ attribute name ของคลาส Operation ที่แทนประเภทของออบเจ็กต์ที่กำลังสังเคราะห์ สำหรับ high-level object แต่ละตัว รายการของ plugin ที่กำหนดไว้จะถูกลองตามลำดับจนกว่าจะมีตัวหนึ่งสำเร็จ (ในตัวอย่างข้างต้น แต่ละรายการมี plugin เพียงตัวเดียว)

นอกจากการระบุ plugin โดยชื่อ ยังสามารถส่ง tuple (name, options) โดยที่ element ที่สองของ tuple คือ dictionary ที่มีตัวเลือกสำหรับ plugin เอกสารของวิธี synthesis ควรอธิบายตัวเลือกที่รองรับ ดู รายการนี้ สำหรับลิงก์ไปยังเอกสารของ high-level synthesis plugins ในตัว

เมื่อสร้างออบเจ็กต์ HLSConfig แล้ว ให้ส่งเป็น argument hls_config ใน generate_preset_pass_manager หรือ transpile:

pass_manager = generate_preset_pass_manager(
optimization_level=3, backend=backend, hls_config=hls_config
)

High-level synthesis ถูกใช้ในขั้นตอน init, translation และ optimization ของ staged pass manager ที่คืนค่าจาก generate_preset_pass_manager หรือที่ใช้ใน transpile ดู Transpiler stages สำหรับคำอธิบายของขั้นตอนเหล่านี้

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

คำแนะนำ