AI transpiler passes
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime qiskit-ibm-transpiler
AI transpiler passes คือ passes ที่ทำหน้าที่แทนที่ passes แบบ "ดั้งเดิม" ของ Qiskit สำหรับงาน transpiling บางอย่าง โดยมักให้ผลลัพธ์ที่ดีกว่าอัลกอริทึมฮิวริสติกที่มีอยู่ (เช่น depth ต่ำกว่าและจำนวน CNOT น้อยกว่า) และยังเร็วกว่าอัลกอริทึมการปรับแต่งอย่าง Boolean satisfiability solvers มาก AI transpiler passes รันได้ในสภาพแวดล้อมเครื่องของตัวเอง
AI transpiler passes อยู่ในสถานะ beta release ซึ่งอาจมีการเปลี่ยนแปลง หากมีข้อเสนอแนะหรือต้องการติดต่อทีมพัฒนา สามารถใช้ Qiskit Slack Workspace channel นี้ได้เลย
passes ที่ใช้งานได้ในปัจจุบันมีดังนี้:
Routing passes
AIRouting: การเลือก layout และการ routing ของ Circuit
Circuit synthesis passes
AICliffordSynthesis: การ synthesis ของ Clifford CircuitAILinearFunctionSynthesis: การ synthesis ของ Linear Function CircuitAIPermutationSynthesis: การ synthesis ของ Permutation Circuit
ในการใช้งาน AI transpiler passes ต้องติดตั้ง package qiskit-ibm-transpiler ก่อน และสามารถดูข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกต่าง ๆ ได้ที่ qiskit-ibm-transpiler API documentation
รัน AI transpiler passes บนเครื่องหรือบนคลาวด์
ติดตั้ง qiskit-ibm-transpiler พร้อม dependencies เพิ่มเติมดังนี้:
pip install qiskit-ibm-transpiler[ai-local-mode]
เมื่อติดตั้ง dependencies เพิ่มเติมแล้ว โหมดเริ่มต้นในการรัน AI transpiler passes จะใช้เครื่องของตัวเอง
AI routing pass
AIRouting pass ทำหน้าที่ทั้งเป็น layout stage และ routing stage สามารถใช้ภายใน PassManager ได้ดังนี้:
from qiskit.transpiler import PassManager
from qiskit.circuit.library import efficient_su2
from qiskit_ibm_transpiler.ai.routing import AIRouting
from qiskit_ibm_runtime import QiskitRuntimeService
import logging
backend = QiskitRuntimeService().backend("ibm_fez")
ai_passmanager = PassManager(
[
AIRouting(
backend=backend,
optimization_level=2,
layout_mode="optimize",
local_mode=True,
)
]
)
circuit = efficient_su2(101, entanglement="circular", reps=1)
logging.getLogger(
"qiskit_ibm_transpiler.wrappers.ai_local_synthesis"
).setLevel(logging.WARNING)
transpiled_circuit = ai_passmanager.run(circuit)
Fetching 4 files: 0%| | 0/4 [00:00<?, ?it/s]
ในที่นี้ backend กำหนด coupling map ที่จะใช้ routing, optimization_level (1, 2 หรือ 3) กำหนดความพยายามในการคำนวณที่จะใช้ในกระบวนการ (ค่าสูงกว่ามักให้ผลดีกว่าแต่ใช้เวลานานกว่า) และ layout_mode กำหนดวิธีจัดการการเลือก layout
layout_mode มีตัวเลือกดังนี้:
keep: รักษา layout ที่กำหนดโดย transpiler passes ก่อนหน้า (หรือใช้ trivial layout หากไม่ได้กำหนด) มักใช้เฉพาะเมื่อ Circuit ต้องรันบน qubits เฉพาะของอุปกรณ์ มักให้ผลลัพธ์ที่แย่กว่าเพราะมีพื้นที่สำหรับการปรับแต่งน้อยกว่าimprove: ใช้ layout ที่กำหนดโดย transpiler passes ก่อนหน้าเป็นจุดเริ่มต้น เหมาะเมื่อมีการเดา layout เริ่มต้นที่ดี เช่น Circuit ที่สร้างขึ้นในลักษณะที่ใกล้เคียงกับ coupling map ของอุปกรณ์ ยังเหมาะหากต้องการลอง layout passes อื่น ๆ ร่วมกับAIRoutingpassoptimize: นี่คือโหมดเริ่มต้น ทำงานได้ดีที่สุดสำหรับ Circuit ทั่วไปที่อาจไม่มีการเดา layout ที่ดี โหมดนี้จะละเว้นการเลือก layout ก่อนหน้าlocal_mode: flag นี้กำหนดว่าAIRoutingpass จะรันที่ไหน ถ้าเป็นFalse,AIRoutingจะรันจากระยะไกลผ่าน Qiskit Transpiler Service ถ้าเป็นTruepackage จะพยายามรัน pass ในสภาพแวดล้อมเครื่องของตัวเอง โดยถ้าไม่พบ dependencies ที่จำเป็นจะ fallback ไปใช้โหมดคลาวด์
AI circuit synthesis passes
AI circuit synthesis passes ช่วยให้ปรับแต่งส่วนต่าง ๆ ของ Circuit ประเภทต่าง ๆ (Clifford, Linear Function, Permutation) ด้วยการ re-synthesize วิธีทั่วไปในการใช้ synthesis pass มีดังนี้:
from qiskit.transpiler import PassManager
from qiskit_ibm_transpiler.ai.routing import AIRouting
from qiskit_ibm_transpiler.ai.synthesis import AILinearFunctionSynthesis
from qiskit_ibm_transpiler.ai.collection import CollectLinearFunctions
from qiskit.circuit.library import efficient_su2
ibm_kingston = QiskitRuntimeService().backend("ibm_kingston")
ai_passmanager = PassManager(
[
AIRouting(
backend=ibm_kingston,
optimization_level=3,
layout_mode="optimize",
local_mode=True,
), # Route circuit
CollectLinearFunctions(), # Collect Linear Function blocks
AILinearFunctionSynthesis(
backend=ibm_kingston, local_mode=True
), # Re-synthesize Linear Function blocks
]
)
circuit = efficient_su2(10, entanglement="full", reps=1)
transpiled_circuit = ai_passmanager.run(circuit)
Fetching 127 files: 0%| | 0/127 [00:00<?, ?it/s]
การ synthesis จะเคารพ coupling map ของอุปกรณ์ โดยสามารถรันได้อย่างปลอดภัยหลัง routing passes อื่น ๆ โดยไม่รบกวน Circuit ดังนั้น Circuit โดยรวมจะยังคงเป็นไปตามข้อจำกัดของอุปกรณ์ ตามค่าเริ่มต้น การ synthesis จะแทนที่ sub-circuit เดิมเฉพาะเมื่อ sub-circuit ที่ synthesize ได้ดีกว่าเดิม (ปัจจุบันตรวจสอบเฉพาะจำนวน CNOT) แต่สามารถบังคับให้แทนที่เสมอได้โดยตั้งค่า replace_only_if_better=False
synthesis passes ต่อไปนี้สามารถ import ได้จาก qiskit_ibm_transpiler.ai.synthesis:
- AICliffordSynthesis: Synthesis สำหรับ Clifford circuits (บล็อกของ Gate
H,SและCX) ปัจจุบันรองรับสูงสุดเก้า qubit blocks - AILinearFunctionSynthesis: Synthesis สำหรับ Linear Function circuits (บล็อกของ Gate
CXและSWAP) ปัจจุบันรองรับสูงสุดเก้า qubit blocks - AIPermutationSynthesis: Synthesis สำหรับ Permutation circuits (บล็อกของ Gate
SWAP) ปัจจุบันรองรับ 65, 33 และ 27 qubit blocks
เราคาดว่าจะค่อย ๆ เพิ่มขนาดของ blocks ที่รองรับขึ้นเรื่อย ๆ
ทุก passes ใช้ thread pool เพื่อส่งคำขอหลายรายการพร้อมกัน ตามค่าเริ่มต้น จำนวน threads สูงสุดคือจำนวน cores บวกสี่ (ค่าเริ่มต้นของ Python object ThreadPoolExecutor) อย่างไรก็ตาม สามารถกำหนดค่าเองได้ด้วย argument max_threads เมื่อสร้าง pass ตัวอย่างเช่น บรรทัดต่อไปนี้สร้าง AILinearFunctionSynthesis pass ที่ใช้ threads สูงสุด 20 threads
AILinearFunctionSynthesis(backend=ibm_torino, max_threads=20) # Re-synthesize Linear Function blocks using 20 threads max
ยังสามารถตั้งค่า environment variable AI_TRANSPILER_MAX_THREADS เป็นจำนวน threads สูงสุดที่ต้องการ และ synthesis passes ทั้งหมดที่สร้างขึ้นหลังจากนั้นจะใช้ค่านั้น
เพื่อให้ AI synthesis passes สามารถ synthesize sub-circuit ได้ sub-circuit นั้นต้องอยู่บน connected subgraph ของ coupling map (วิธีหนึ่งคือใช้ routing pass ก่อนเก็บบล็อก แต่ไม่ใช่วิธีเดียว) synthesis passes จะตรวจสอบโดยอัตโนมัติว่า subgraph เฉพาะนั้นได้รับการรองรับหรือไม่ ถ้าไม่รองรับจะแสดง warning และปล่อย sub-circuit เดิมไว้โดยไม่เปลี่ยนแปลง
collection passes แบบกำหนดเองต่อไปนี้สำหรับ Cliffords, Linear Functions และ Permutations ที่ import ได้จาก qiskit_ibm_transpiler.ai.collection ยังทำงานร่วมกับ synthesis passes ได้ด้วย:
- CollectCliffords: เก็บ Clifford blocks เป็น
Instructionobjects และเก็บ sub-circuit เดิมเพื่อเปรียบเทียบหลัง synthesis - CollectLinearFunctions: เก็บบล็อกของ
SWAPและCXเป็นLinearFunctionobjects และเก็บ sub-circuit เดิมเพื่อเปรียบเทียบหลัง synthesis - CollectPermutations: เก็บบล็อกของ
SWAPcircuits เป็นPermutations
collection passes แบบกำหนดเองเหล่านี้จำกัดขนาดของ sub-circuits ที่เก็บให้รองรับกับ AI synthesis passes ได้ ดังนั้นจึงแนะนำให้ใช้หลัง routing passes และก่อน synthesis passes เพื่อการปรับแต่งโดยรวมที่ดีขึ้น
การ transpile Circuit แบบ Hybrid heuristic-AI
qiskit-ibm-transpiler ช่วยให้กำหนดค่า hybrid pass manager ที่รวมข้อดีของ heuristic ของ Qiskit และ AI transpiler passes เข้าด้วยกัน ฟีเจอร์นี้ทำงานคล้ายกับ Qiskit generate_pass_manager method วิธีทั่วไปในการใช้ generate_ai_pass_manager มีดังนี้:
from qiskit_ibm_transpiler import generate_ai_pass_manager
from qiskit.circuit.library import efficient_su2
from qiskit_ibm_runtime import QiskitRuntimeService
backend = QiskitRuntimeService().backend("ibm_kingston")
kingston_coupling_map = backend.coupling_map
su2_circuit = efficient_su2(101, entanglement="circular", reps=1)
ai_transpiler_pass_manager = generate_ai_pass_manager(
coupling_map=kingston_coupling_map,
ai_optimization_level=3,
optimization_level=3,
ai_layout_mode="optimize",
)
ai_su2_transpiled_circuit = ai_transpiler_pass_manager.run(su2_circuit)
ตัวเลือกต่อไปนี้ถูกใช้ในตัวอย่างนี้:
coupling_map- ระบุ coupling map ที่จะใช้สำหรับการ transpilationai_optimization_level- ระบุระดับการปรับแต่ง (1-3) ที่จะใช้สำหรับส่วน AI ของ PassManageroptimization_level- ระบุปริมาณการปรับแต่งที่จะทำกับ Circuit สำหรับส่วน heuristic ของ PassManagerai_layout_mode- ระบุวิธีที่ส่วน AI routing ของ PassManager จัดการ layout ดูที่ส่วน AI routing pass เพื่อตรวจสอบตัวเลือกการกำหนดค่าสำหรับ parameterai_layout_modeนี้
การอ้างอิง
การอ้างอิง ถ้าใช้ฟีเจอร์ AI จาก Qiskit Transpiler Service ในงานวิจัย ให้ใช้การอ้างอิงที่แนะนำดังนี้:
@misc{2405.13196,
Author = {David Kremer and Victor Villar and Hanhee Paik and Ivan Duran and Ismael Faro and Juan Cruz-Benito},
Title = {Practical and efficient quantum circuit synthesis and transpiling with Reinforcement Learning},
Year = {2024},
Eprint = {arXiv:2405.13196},
}