Transpile dengan pass manager
Versi paket
Kode di halaman ini dikembangkan menggunakan kebutuhan berikut. Kami merekomendasikan menggunakan versi ini atau yang lebih baru.
qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1
Cara yang direkomendasikan untuk melakukan transpilasi sebuah Circuit adalah membuat staged pass manager lalu menjalankan metode run-nya dengan Circuit sebagai input. Halaman ini menjelaskan cara melakukan transpilasi sirkuit kuantum dengan cara tersebut.
Apa itu (staged) pass manager?β
Dalam konteks Qiskit SDK, transpilasi mengacu pada proses mengubah sebuah Circuit input menjadi bentuk yang sesuai untuk dieksekusi di perangkat kuantum. Transpilasi biasanya terjadi dalam serangkaian langkah yang disebut transpiler passes. Circuit diproses oleh setiap transpiler pass secara berurutan, dengan output dari satu pass menjadi input untuk pass berikutnya. Misalnya, satu pass bisa menelusuri Circuit dan menggabungkan semua urutan Gate single-Qubit yang berurutan, lalu pass berikutnya bisa mensintesis Gate-Gate tersebut ke dalam basis set perangkat target. Transpiler passes yang disertakan dengan Qiskit ada di modul qiskit.transpiler.passes.
Pass manager adalah objek yang menyimpan daftar transpiler passes dan bisa menjalankannya pada sebuah Circuit. Buat pass manager dengan menginisialisasi PassManager dengan daftar transpiler passes. Untuk menjalankan transpilasi pada sebuah Circuit, panggil metode run dengan Circuit sebagai input.
Staged pass manager adalah jenis pass manager khusus yang merepresentasikan tingkat abstraksi di atas pass manager biasa. Sementara pass manager biasa terdiri dari beberapa transpiler passes, staged pass manager terdiri dari beberapa pass manager. Ini adalah abstraksi yang berguna karena transpilasi biasanya terjadi dalam tahap-tahap diskrit, sebagaimana dijelaskan di Transpiler stages, di mana setiap tahap direpresentasikan oleh sebuah pass manager. Staged pass managers direpresentasikan oleh kelas StagedPassManager. Sisa halaman ini menjelaskan cara membuat dan mengkustomisasi (staged) pass managers.
Buat preset staged pass managerβ
Untuk membuat preset staged pass manager dengan nilai default yang masuk akal, gunakan fungsi 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
)
Untuk melakukan transpilasi sebuah Circuit atau daftar Circuit dengan pass manager, berikan Circuit atau daftar Circuit ke metode run. Mari kita coba pada sebuah Circuit dua Qubit yang terdiri dari Hadamard diikuti dua Gate CX yang berdekatan:
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)
Lihat Transpilation defaults and configuration options untuk deskripsi argumen yang mungkin untuk fungsi generate_preset_pass_manager. Argumen untuk generate_preset_pass_manager cocok dengan argumen fungsi transpile.
Jika preset pass managers tidak memenuhi kebutuhanmu, kustomisasi transpilasi dengan membuat (staged) pass managers atau bahkan transpilation passes. Sisa halaman ini menjelaskan cara membuat pass managers. Untuk instruksi cara membuat transpilation passes, lihat Write your own transpiler pass.
Buat pass manager sendiriβ
Modul qiskit.transpiler.passes mencakup banyak transpiler passes yang bisa digunakan untuk membuat pass managers. Untuk membuat pass manager, inisialisasi PassManager dengan daftar passes. Misalnya, kode berikut membuat transpiler pass yang menggabungkan Gate dua Qubit yang berdekatan lalu mensintesisnya ke dalam basis , , dan .
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),
]
)
Untuk mendemonstrasikan pass manager ini dalam aksi, uji pada sebuah Circuit dua Qubit yang terdiri dari Hadamard diikuti dua Gate CX yang berdekatan:
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")
Untuk menjalankan pass manager pada Circuit, panggil metode run.
translated = translate.run(circuit)
translated.draw("mpl")
Untuk contoh yang lebih lanjut yang menunjukkan cara membuat pass manager untuk mengimplementasikan teknik error suppression yang dikenal sebagai dynamical decoupling, lihat Create a pass manager for dynamical decoupling.
Buat staged pass managerβ
StagedPassManager adalah pass manager yang terdiri dari tahap-tahap individual, di mana setiap tahap didefinisikan oleh sebuah instance PassManager. Kamu bisa membuat StagedPassManager dengan menentukan tahap-tahap yang diinginkan. Misalnya, kode berikut membuat staged pass manager dengan dua tahap, init dan translation. Tahap translation didefinisikan oleh pass manager yang sebelumnya sudah dibuat.
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
)
Tidak ada batas jumlah tahap yang bisa kamu masukkan dalam staged pass manager.
Cara lain yang berguna untuk membuat staged pass manager adalah dimulai dengan preset staged pass manager lalu mengganti beberapa tahapnya. Misalnya, kode berikut menghasilkan preset pass manager dengan optimization level 3, lalu menentukan tahap pre_layout yang dikustomisasi.
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
Fungsi stage generator mungkin berguna untuk membangun pass managers yang dikustomisasi.
Fungsi-fungsi ini menghasilkan tahap yang menyediakan fungsionalitas umum yang digunakan di banyak pass managers.
Misalnya, generate_embed_passmanager bisa digunakan untuk menghasilkan sebuah tahap guna "menanamkan" Layout awal yang dipilih dari sebuah layout pass ke perangkat target yang ditentukan.
Langkah berikutnyaβ
- Tulis transpiler pass yang dikustomisasi.
- Buat pass manager untuk dynamical decoupling.
- Untuk mempelajari lebih lanjut tentang fungsi
generate_preset_passmanager, lihat topik Transpilation default settings and configuration options. - Coba panduan Compare transpiler settings.
- Tinjau dokumentasi API transpiler.