Transpilieren mit Pass-Managern
Der Code auf dieser Seite wurde unter Berücksichtigung der folgenden Anforderungen entwickelt. Wir empfehlen die Verwendung dieser oder neuerer Versionen.
qiskit[all]~=2.5.2 qiskit-ibm-runtime~=0.47.0
Es wird empfohlen, einen Schaltkreis zu transpilieren, indem man einen gestuften Passmanager erstellt und dann dessen Methode run mit dem Schaltkreis als Eingabe ausführt. Auf dieser Seite wird erklärt, wie man Quantenschaltungen auf diese Weise transpilieren kann.
Was ist ein (gestufter) Passmanager?
Im Zusammenhang mit dem Qiskit SDK bezieht sich die Transpilierung auf den Prozess der Umwandlung einer Eingabeschaltung in eine Form, die für die Ausführung auf einem Quantengerät geeignet ist. Die Transpilierung erfolgt in der Regel in einer Abfolge von Schritten, den so genannten Transpilerdurchläufen. Die Schaltung wird von jedem Transpiler-Durchgang nacheinander bearbeitet, wobei der Ausgang eines Durchgangs der Eingang für den nächsten ist. Beispielsweise könnte ein Durchgang die Schaltung durchlaufen und alle aufeinanderfolgenden Sequenzen von Ein-Qubit-Gattern zusammenführen, und der nächste Durchgang könnte diese Gatter dann in die Basismenge des Zielbauelements synthetisieren. Die in Qiskit enthaltenen Transpilerpässe befinden sich im qiskit.transpiler.passes modul.
Ein Pass-Manager ist ein Objekt, das eine Liste von Transpiler-Pässen speichert und diese auf einer Schaltung ausführen kann. Erstellen Sie einen Passmanager, indem Sie eine PassManager mit einer Liste von Transpilerpässen initialisiert. Um die Transpilation für einen Stromkreis durchzuführen, rufen Sie die Methode run methode mit einer Schaltung als Eingabe auf.
Ein gestufter Passmanager ist eine besondere Art von Passmanager, der eine höhere Abstraktionsebene als ein normaler Passmanager darstellt. Während ein normaler Passmanager aus mehreren Transpilerpässen besteht, setzt sich ein gestufter Passmanager aus mehreren Passmanagern zusammen. Dies ist eine nützliche Abstraktion, da die Transpilierung typischerweise in diskreten Stufen erfolgt, wie in Transpiler-Stufen beschrieben, wobei jede Stufe durch einen Passmanager repräsentiert wird. Staged Pass Manager werden durch die Klasse StagedPassManager klasse. Im weiteren Verlauf dieser Seite wird beschrieben, wie Sie (abgestufte) Passmanager erstellen und anpassen können.
Voreingestellten Staged Pass Manager generieren
Um einen voreingestellten Staged-Pass-Manager mit sinnvollen Standardwerten zu erstellen, verwenden Sie die generate_preset_pass_manager Funktion.
In diesen Beispielen wird das FakeSherbrooke``qiskit_ibm_runtime Mock-Backend von verwendet, Sie können es jedoch mit jedem Qiskit-kompatiblen echten oder simulierten Backend ausprobieren. Ihre Ergebnisse können davon abweichen.
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
)Um einen Stromkreis oder eine Liste von Stromkreisen mit einem Passmanager zu übertragen, übergeben Sie den Stromkreis oder die Liste von Stromkreisen an die Methode run . Wir wollen dies an einer Zwei-Qubit-Schaltung ausprobieren, die aus einem Hadamard- und zwei benachbarten CX-Gattern besteht:
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)Output:
Eine Beschreibung der möglichen Argumente für die Funktion generate_preset_pass_manager finden Sie unter Standardeinstellungen und Konfigurationsoptionen für die Transpilierung. Die Argumente für generate_preset_pass_manager entsprechen den Argumenten für die transpile funktion.
Wenn die voreingestellten Passmanager Ihren Anforderungen nicht genügen, können Sie die Transpilierung anpassen, indem Sie (abgestufte) Passmanager oder sogar Transpilierungspässe erstellen. Im weiteren Verlauf dieser Seite wird beschrieben, wie Sie Passmanager erstellen. Anleitungen zum Erstellen von Transpilierpässen finden Sie unter Schreiben Sie Ihren eigenen Transpilierpass.
Erstellen Sie Ihren eigenen Pass-Manager
Das qiskit.transpiler.passes modul enthält viele Transpilerpässe, die zur Erstellung von Pass-Managern verwendet werden können. Um einen Passmanager zu erstellen, initialisieren Sie eine PassManager mit einer Liste von Pässen. Der folgende Code erzeugt beispielsweise einen Transpiler-Durchgang, der benachbarte Zwei-Qubit-Gatter zusammenführt und sie dann zu einer Basis von , , und gattern synthetisiert.
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),
]
)Um diesen Passmanager in Aktion zu demonstrieren, testen Sie ihn an einer Zwei-Qubit-Schaltung, die aus einem Hadamard- und zwei benachbarten CX-Gattern besteht:
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")Output:
Um den Passmanager auf dem Stromkreis laufen zu lassen, rufen Sie die Methode run auf.
translated = translate.run(circuit)
translated.draw("mpl")Output:
Ein fortgeschrittenes Beispiel, das zeigt, wie man einen Durchlaufmanager erstellt, um die als dynamische Entkopplung bekannte Fehlerunterdrückungstechnik zu implementieren, finden Sie unter Erstellen eines Durchlaufmanagers für dynamische Entkopplung.
Erstellen Sie einen gestaffelten Pass-Manager
Ein StagedPassManager ist ein Passmanager, der aus einzelnen Stufen besteht, wobei jede Stufe durch eine PassManager Instanz definiert ist. Sie können eine StagedPassManager erstellen, indem Sie die gewünschten Stufen angeben. Der folgende Code erstellt zum Beispiel einen gestuften Passmanager mit zwei Stufen, init und translation. Die Stufe translation wird durch den zuvor erstellten Passmanager definiert.
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
)Es gibt keine Begrenzung für die Anzahl der Etappen, die Sie in einen Etappenpass-Manager eingeben können.
Eine weitere nützliche Methode zur Erstellung eines gestaffelten Pass-Managers besteht darin, mit einem voreingestellten gestaffelten Pass-Manager zu beginnen und dann einige der Stufen auszutauschen. Der folgende Code erzeugt beispielsweise einen voreingestellten Passmanager mit Optimierungsstufe 3 und gibt dann eine benutzerdefinierte pre_layout Stufe an.
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_optDie Funktionen des Stufengenerators können für die Erstellung von benutzerdefinierten Pass-Managern nützlich sein.
Sie erzeugen Stufen, die gemeinsame Funktionen für viele Passmanager bieten.
Zum Beispiel, generate_embed_passmanager verwendet werden, um eine Stufe zu erzeugen zum "Einbetten" einer ausgewählten Ausgangsdatei Layout aus einem Layout-Durchgang in das angegebene Zielgerät.
Nächste Schritte
- Schreiben Sie einen benutzerdefinierten Transpiler-Pass.
- Erstellen Sie einen Passmanager für die dynamische Entkopplung.
- Weitere Informationen zur Funktion
generate_preset_passmanagerfinden Sie unter dem Thema Transpilations-Standardeinstellungen und Konfigurationsoptionen. - Probieren Sie die Anleitung zum Vergleichen der Transpiler-Einstellungen aus.
- Lesen Sie die Dokumentation zur Transpiler-API.