Transpilează cu pass managers
Versiuni de pachete
Codul de pe această pagină a fost dezvoltat folosind următoarele cerințe. Recomandăm utilizarea acestor versiuni sau a unora mai noi.
qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1
Modalitatea recomandată de a transpila un Circuit este să creezi un staged pass manager și apoi să execuți metoda run cu circuitul ca intrare. Această pagină explică cum să transpilezi circuite cuantice în acest mod.
Ce este un (staged) pass manager?
În contextul SDK-ului Qiskit, transpilarea se referă la procesul de transformare a unui Circuit de intrare într-o formă potrivită pentru execuție pe un dispozitiv cuantic. Transpilarea are loc, de obicei, într-o secvență de pași numiți transpiler passes. Circuitul este procesat de fiecare transpiler pass în ordine, iar ieșirea unui pass devine intrarea următorului. De exemplu, un pass ar putea parcurge circuitul și îmbina toate secvențele consecutive de Gate-uri cu un singur Qubit, iar apoi pasul următor ar putea sintetiza aceste Gate-uri în setul de bază al dispozitivului țintă. Transpiler passes incluse în Qiskit se află în modulul qiskit.transpiler.passes.
Un pass manager este un obiect care stochează o listă de transpiler passes și le poate executa pe un Circuit. Creează un pass manager prin inițializarea unui PassManager cu o listă de transpiler passes. Pentru a rula transpilarea pe un Circuit, apelează metoda run cu un Circuit ca intrare.
Un staged pass manager este un tip special de pass manager care reprezintă un nivel de abstractizare superior față de un pass manager obișnuit. În timp ce un pass manager obișnuit este compus din mai multe transpiler passes, un staged pass manager este compus din mai multe pass managers. Aceasta este o abstractizare utilă deoarece transpilarea are loc, de obicei, în etape discrete, după cum este descris în Etapele Transpiler-ului, fiecare etapă fiind reprezentată de un pass manager. Staged pass managers sunt reprezentate de clasa StagedPassManager. Restul acestei pagini descrie cum să creezi și să personalizezi (staged) pass managers.
Generează un staged pass manager preset
Pentru a crea un staged pass manager preset cu valori implicite rezonabile, folosește funcția 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
)
Pentru a transpila un Circuit sau o listă de circuite cu un pass manager, transmite circuitul sau lista de circuite metodei run. Să facem asta pe un Circuit cu doi Qubiți constând dintr-un Hadamard urmat de două Gate-uri CX adiacente:
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)
Consultă Valori implicite de transpilare și opțiuni de configurare pentru o descriere a posibilelor argumente ale funcției generate_preset_pass_manager. Argumentele pentru generate_preset_pass_manager corespund argumentelor funcției transpile.
Dacă pass managers preset nu îți satisfac nevoile, personalizează transpilarea creând (staged) pass managers sau chiar transpilation passes. Restul acestei pagini descrie cum să creezi pass managers. Pentru instrucțiuni despre cum să creezi transpilation passes, consultă Scrie-ți propriul transpiler pass.
Creează propriul tău pass manager
Modulul qiskit.transpiler.passes include multe transpiler passes care pot fi folosite pentru a crea pass managers. Pentru a crea un pass manager, inițializează un PassManager cu o listă de passes. De exemplu, următorul cod creează un transpiler pass care îmbină Gate-urile adiacente cu doi Qubiți și apoi le sintetizează într-o bază formată din Gate-urile , și .
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),
]
)
Pentru a demonstra acest pass manager în acțiune, testează-l pe un Circuit cu doi Qubiți constând dintr-un Hadamard urmat de două Gate-uri CX adiacente:
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")
Pentru a rula pass manager-ul pe Circuit, apelează metoda run.
translated = translate.run(circuit)
translated.draw("mpl")
Pentru un exemplu mai avansat care arată cum să creezi un pass manager pentru a implementa tehnica de suprimare a erorilor cunoscută sub numele de dynamical decoupling, consultă Creează un pass manager pentru dynamical decoupling.
Creează un staged pass manager
Un StagedPassManager este un pass manager compus din etape individuale, unde fiecare etapă este definită de o instanță PassManager. Poți crea un StagedPassManager specificând etapele dorite. De exemplu, următorul cod creează un staged pass manager cu două etape, init și translation. Etapa translation este definită de pass manager-ul creat anterior.
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
)
Nu există o limită pentru numărul de etape pe care le poți adăuga într-un staged pass manager.
O altă modalitate utilă de a crea un staged pass manager este să începi cu un staged pass manager preset și apoi să înlocuiești unele dintre etape. De exemplu, următorul cod generează un pass manager preset cu nivelul de optimizare 3, apoi specifică o etapă pre_layout personalizată.
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
Funcțiile generator de etape pot fi utile pentru construirea unor pass managers personalizate.
Acestea generează etape care oferă funcționalități comune folosite în multe pass managers.
De exemplu, generate_embed_passmanager poate fi folosit pentru a genera o etapă
care „înglobează" un Layout inițial selectat dintr-un layout pass în dispozitivul țintă specificat.
Pași următori
- Scrie un transpiler pass personalizat.
- Creează un pass manager pentru dynamical decoupling.
- Pentru a afla mai multe despre funcția
generate_preset_passmanager, consultă subiectul Setări implicite de transpilare și opțiuni de configurare. - Încearcă ghidul Compară setările Transpiler-ului.
- Consultă documentația API a Transpiler-ului.