Często używane parametry transpilacji
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
Ta strona opisuje niektóre z częściej używanych parametrów lokalnej transpilacji. Parametry te konfiguruje się za pomocą argumentów przekazywanych do generate_preset_pass_manager lub transpile.
Stopień aproksymacji
Możesz użyć stopnia aproksymacji, aby określić, jak dokładnie chcesz, by wynikowy Circuit odpowiadał pożądanemu (wejściowemu) Circuit. Jest to liczba zmiennoprzecinkowa z zakresu (0.0–1.0), gdzie 0.0 oznacza maksymalną aproksymację, a 1.0 (domyślnie) — brak aproksymacji. Mniejsze wartości zamieniają dokładność wyjścia na łatwość wykonania (czyli mniejszą liczbę Gate'ów). Wartość domyślna to 1.0.
W syntezie unitarnej dwu-Qubitowej (stosowanej na początkowych etapach wszystkich poziomów oraz na etapie optymalizacji przy poziomie optymalizacji 3) wartość ta określa docelową wierność dekompozycji wyjściowej. Inaczej mówiąc, jak duży błąd zostaje wprowadzony przy konwersji macierzowej reprezentacji Circuit na dyskretne Gate'y. Jeśli stopień aproksymacji jest niższy (większa aproksymacja), wynikowy Circuit z syntezy będzie się bardziej różnić od macierzy wejściowej, ale prawdopodobnie będzie miał mniej Gate'ów (ponieważ dowolna dwu-Qubitowa operacja może zostać dokładnie zdekomponowana przy użyciu co najwyżej trzech Gate'ów CX) i będzie łatwiejszy do wykonania.
Gdy stopień aproksymacji jest mniejszy niż 1.0, mogą zostać zsyntetyzowane Circuit z jednym lub dwoma Gate'ami CX, co prowadzi do mniejszego błędu sprzętowego kosztem błędu aproksymacji. Ponieważ CX jest najbardziej kosztownym Gate'em pod względem błędu, może być korzystne zmniejszenie ich liczby kosztem wierności w syntezie (technika ta była stosowana w celu zwiększenia quantum volume na urządzeniach IBM®: Validating quantum computers using randomized model circuits).
Jako przykład generujemy losowy dwu-Qubitowy UnitaryGate, który zostanie zsyntetyzowany na początkowym etapie. Ustawienie approximation_degree poniżej 1.0 może wygenerować aproksymowany Circuit. Musimy też podać basis_gates, aby metoda syntezy wiedziała, których Gate'ów może użyć do aproksymowanej syntezy.
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
from qiskit import QuantumCircuit, QuantumRegister
from qiskit.circuit.library import UnitaryGate
from qiskit.quantum_info import random_unitary
from qiskit.transpiler import generate_preset_pass_manager
UU = random_unitary(4, seed=12345)
rand_U = UnitaryGate(UU)
qubits = QuantumRegister(2, name="q")
qc = QuantumCircuit(qubits)
qc.append(rand_U, qubits)
pass_manager = generate_preset_pass_manager(
optimization_level=1,
approximation_degree=0.85,
basis_gates=["sx", "rz", "cx"],
)
approx_qc = pass_manager.run(qc)
print(approx_qc.count_ops()["cx"])
2
Wynikiem jest 2, ponieważ aproksymacja wymaga mniejszej liczby Gate'ów CX.
Ziarno generatora liczb losowych
Niektóre części Transpilera są stochastyczne, więc kolejne uruchomienia transpilacji mogą zwracać różne wyniki. Aby uzyskać powtarzalny wynik, możesz ustawić ziarno dla generatora liczb pseudolosowych za pomocą argumentu seed_transpiler. Kolejne uruchomienia z tym samym ziarnem będą zwracać te same wyniki.
Przykład:
pass_manager = generate_preset_pass_manager(
optimization_level=1, seed_transpiler=11, basis_gates=["sx", "rz", "cx"]
)
optimized_1 = pass_manager.run(qc)
optimized_1.draw("mpl")
Wstępny układ
Przed transpilacją Qubity zawarte w twoim Circuit są wirtualnymi Qubitami, które niekoniecznie odpowiadają fizycznym Qubitom na docelowym Backend. Możesz określić wstępne mapowanie wirtualnych Qubitów na fizyczne Qubity za pomocą argumentu initial_layout. Pamiętaj, że końcowy układ Qubitów może różnić się od wstępnego, ponieważ Transpiler może przestawiać Qubity przy użyciu bramek swap lub innych metod.
W poniższym przykładzie konstruujemy wstępny układ dla atrapowego Backend FakeSherbrooke, tworząc obiekt Layout. Nasz układ mapuje pierwszy Qubit naszego Circuit na Qubit 5 Sherbrooke, a drugi Qubit naszego Circuit na Qubit 6 Sherbrooke. Zauważ, że fizyczne Qubity są zawsze reprezentowane przez liczby całkowite.
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke
from qiskit.transpiler import Layout
backend = FakeSherbrooke()
a, b = qubits
initial_layout = Layout({a: 5, b: 6})
pass_manager = generate_preset_pass_manager(
optimization_level=1, backend=backend, initial_layout=initial_layout
)
transpiled_circ = pass_manager.run(qc)
transpiled_circ.draw("mpl", idle_wires=False)
Oprócz podawania obiektu Layout możesz też przekazać listę liczb całkowitych, gdzie -ty element listy zawiera fizyczny Qubit, na który powinien zostać zmapowany -ty Qubit. Na przykład:
initial_layout = [5, 6]
pass_manager = generate_preset_pass_manager(
optimization_level=1, backend=backend, initial_layout=initial_layout
)
transpiled_circ = pass_manager.run(qc)
transpiled_circ.draw("mpl", idle_wires=False)
Możesz użyć funkcji plot_error_map, aby wygenerować diagram grafu urządzenia z informacjami o błędach i oznaczonymi fizycznymi Qubitami. Podobne diagramy możesz też przeglądać na stronie Compute resources.
from qiskit.visualization import plot_error_map
plot_error_map(backend, figsize=(30, 24))
Opcje etapów i wtyczek Transpilera
Te opcje mają sufiks _method. Wpływają na sposób działania Transpilera i są używane do uzyskania lepszych, innych lub konkretnych wyników z Transpilera.
-
init_method(str) — Wtyczka używana na etapie inicjalizacji. -
layout_method(str) — Pass wyboru układu (trivial,dense,sabre). Może to być również nazwa zewnętrznej wtyczki używanej na etapie układu. -
optimization_method(str) — Wtyczka używana na etapie optymalizacji. -
routing_method(str) — Nazwa passa routingu (basic,lookahead,default,sabre,none). Może to być również nazwa zewnętrznej wtyczki używanej na etapie routingu. -
scheduling_method(str) — Nazwa passa harmonogramowania. Może to być również nazwa zewnętrznej wtyczki używanej na etapie harmonogramowania.as_soon_as_possible: Harmonogramuje instrukcje zachłannie: tak wcześnie, jak to możliwe na zasobie Qubitowym (alias:asap).as_late_as_possible: Harmonogramuje instrukcje późno. Oznacza to, że Qubity są utrzymywane w stanie podstawowym tak długo, jak to możliwe (alias:alap).
-
translation_method(str) — Nazwa passa translacji (unroller,translator,synthesis). Może to być również nazwa zewnętrznej wtyczki używanej na etapie translacji. -
unitary_synthesis_method(str) — Nazwa metody syntezy unitarnej do użycia. Domyślnie używana jest metodadefault.
Aby wyświetlić listę wszystkich zainstalowanych wtyczek dla danego etapu, uruchom list_stage_plugins("stage_name"). Na przykład, jeśli chcesz zobaczyć listę wszystkich zainstalowanych wtyczek dla etapu routingu, uruchom list_stage_plugins(routing).
Kolejne kroki
- Zapoznaj się z tematem Domyślne opcje i ustawienia konfiguracji.
- Dowiedz się, jak ustawić poziom optymalizacji.
- Wypróbuj przewodnik Porównanie ustawień Transpilera.
- Zapoznaj się z dokumentacją API Transpilera.