Transpilacja z menedżerami przejść
Wersje pakietów
Kod na tej stronie został opracowany przy użyciu poniższych wymagań. Zalecamy korzystanie z tych lub nowszych wersji.
qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1
Zalecanym sposobem transpilacji Circuit-u jest utworzenie etapowego menedżera przejść (staged pass manager), a następnie wywołanie jego metody run z Circuit-em jako argumentem. Ta strona wyjaśnia, jak transpilować obwody kwantowe w ten sposób.
Co to jest (etapowy) menedżer przejść?
W kontekście Qiskit SDK transpilacja oznacza proces przekształcania wejściowego Circuit-u do postaci nadającej się do wykonania na urządzeniu kwantowym. Transpilacja odbywa się zazwyczaj w sekwencji kroków zwanych przejściami Transpilera (transpiler passes). Circuit jest przetwarzany przez każde przejście Transpilera kolejno, a wyjście jednego przejścia staje się wejściem następnego. Na przykład jedno przejście może przejrzeć Circuit i scalić wszystkie kolejne sekwencje bramek jednoQubitowych, a następne przejście może zsyntetyzować te Gate-y w zbiorze bazowym docelowego urządzenia. Przejścia Transpilera dostarczone z Qiskit znajdują się w module qiskit.transpiler.passes.
Menedżer przejść (pass manager) to obiekt przechowujący listę przejść Transpilera i mogący je wykonywać na Circuit-ach. Utwórz menedżer przejść, inicjując obiekt PassManager z listą przejść Transpilera. Aby uruchomić transpilację na Circuit-cie, wywołaj metodę run z Circuit-em jako argumentem.
Etapowy menedżer przejść (staged pass manager) to szczególny rodzaj menedżera przejść reprezentujący wyższy poziom abstrakcji niż zwykły menedżer przejść. Podczas gdy zwykły menedżer przejść składa się z kilku przejść Transpilera, etapowy menedżer przejść składa się z kilku menedżerów przejść. Jest to przydatna abstrakcja, ponieważ transpilacja odbywa się zazwyczaj w odrębnych etapach, opisanych w Etapach Transpilera, przy czym każdy etap reprezentowany jest przez menedżer przejść. Etapowe menedżery przejść są reprezentowane przez klasę StagedPassManager. Pozostała część tej strony opisuje, jak tworzyć i dostosowywać (etapowe) menedżery przejść.
Generowanie wstępnie zdefiniowanego etapowego menedżera przejść
Aby utworzyć wstępnie zdefiniowany etapowy menedżer przejść z rozsądnymi ustawieniami domyślnymi, użyj funkcji 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
)
Aby transpilować Circuit lub listę Circuit-ów za pomocą menedżera przejść, przekaż Circuit lub listę Circuit-ów do metody run. Zróbmy to na dwuQubitowym Circuit-cie składającym się z bramki Hadamarda, po której następują dwie sąsiednie bramki CX:
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)
Opis możliwych argumentów funkcji generate_preset_pass_manager znajdziesz w Domyślnych ustawieniach transpilacji i opcjach konfiguracji. Argumenty funkcji generate_preset_pass_manager odpowiadają argumentom funkcji transpile.
Jeśli wstępnie zdefiniowane menedżery przejść nie spełniają twoich potrzeb, dostosuj transpilację, tworząc własne (etapowe) menedżery przejść, a nawet własne przejścia transpilacji. Pozostała część tej strony opisuje, jak tworzyć menedżery przejść. Instrukcje dotyczące tworzenia własnych przejść transpilacji znajdziesz w Napisz własne przejście Transpilera.
Utwórz własny menedżer przejść
Moduł qiskit.transpiler.passes zawiera wiele przejść Transpilera, których można użyć do tworzenia menedżerów przejść. Aby utworzyć menedżer przejść, zainicjuj obiekt PassManager z listą przejść. Na przykład poniższy kod tworzy przejście Transpilera, które scala sąsiednie dwuQubitowe Gate-y, a następnie syntetyzuje je w bazie bramek , 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),
]
)
Aby zademonstrować ten menedżer przejść w działaniu, przetestuj go na dwuQubitowym Circuit-cie składającym się z bramki Hadamarda, po której następują dwie sąsiednie Gate-y CX:
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")
Aby uruchomić menedżer przejść na Circuit-cie, wywołaj metodę run.
translated = translate.run(circuit)
translated.draw("mpl")
Bardziej zaawansowany przykład pokazujący, jak utworzyć menedżer przejść w celu implementacji techniki tłumienia błędów zwanej dynamicznym odsprzęganiem (dynamical decoupling), znajdziesz w Utwórz menedżer przejść dla dynamicznego odsprzęgania.
Utwórz etapowy menedżer przejść
StagedPassManager to menedżer przejść składający się z poszczególnych etapów, przy czym każdy etap jest zdefiniowany przez instancję PassManager. Możesz utworzyć StagedPassManager, określając żądane etapy. Na przykład poniższy kod tworzy etapowy menedżer przejść z dwoma etapami: init i translation. Etap translation jest zdefiniowany przez menedżer przejść utworzony wcześniej.
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
)
Nie ma ograniczeń co do liczby etapów w etapowym menedżerze przejść.
Innym przydatnym sposobem tworzenia etapowego menedżera przejść jest rozpoczęcie od wstępnie zdefiniowanego etapowego menedżera przejść, a następnie wymienienie niektórych etapów. Na przykład poniższy kod generuje wstępnie zdefiniowany menedżer przejść z poziomem optymalizacji 3, a następnie określa własny etap pre_layout.
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
Funkcje generatorów etapów mogą być przydatne do budowania własnych menedżerów przejść.
Generują etapy zapewniające typową funkcjonalność używaną w wielu menedżerach przejść.
Na przykład generate_embed_passmanager może być użyta do wygenerowania etapu „osadzania" wybranego początkowego Layout z przejścia układu w określonym urządzeniu docelowym.
Kolejne kroki
- Napisz własne przejście Transpilera.
- Utwórz menedżer przejść dla dynamicznego odsprzęgania.
- Aby dowiedzieć się więcej o funkcji
generate_preset_passmanager, zapoznaj się z tematem Domyślne ustawienia transpilacji i opcje konfiguracji. - Wypróbuj przewodnik Porównaj ustawienia Transpilera.
- Zapoznaj się z dokumentacją API Transpilera.