Instalacja i użycie wtyczek Transpilera
Wersje pakietów
Kod na tej stronie został opracowany przy użyciu poniższych zależności. Zalecamy korzystanie z tych wersji lub nowszych.
qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1
Aby ułatwić tworzenie i ponowne wykorzystywanie niestandardowego kodu transpilacji przez szerszą społeczność użytkowników Qiskit, Qiskit SDK obsługuje interfejs wtyczek, który umożliwia zewnętrznym pakietom Pythona zadeklarowanie, że udostępniają rozszerzoną funkcjonalność transpilacji dostępną przez Qiskit.
Aktualnie zewnętrzne wtyczki mogą udostępniać rozszerzoną funkcjonalność transpilacji na trzy sposoby:
- Wtyczka etapu Transpilera dostarcza menedżer przebiegów, który można użyć zamiast jednego z 6 etapów wstępnie skonfigurowanego podzielonego na etapy menedżera przebiegów:
init,layout,routing,translation,optimizationischeduling. - Wtyczka syntezy unitarnej dostarcza rozszerzoną funkcjonalność syntezy unitarnych bramek.
- Wtyczka syntezy wysokiego poziomu dostarcza rozszerzoną funkcjonalność syntezy „obiektów wysokiego poziomu", takich jak funkcje liniowe lub operatory Clifforda. Obiekty wysokiego poziomu są reprezentowane przez podklasy klasy Operation.
Pozostała część strony opisuje, jak wylistować dostępne wtyczki, zainstalować nowe i jak ich używać.
Lista dostępnych wtyczek i instalacja nowych
Qiskit zawiera już kilka wbudowanych wtyczek do transpilacji. Aby zainstalować więcej, możesz użyć menedżera pakietów Pythona. Na przykład możesz uruchomić pip install qiskit-toqm, aby zainstalować wtyczkę etapu routingu Qiskit TOQM. Wiele zewnętrznych wtyczek jest częścią ekosystemu Qiskit.
Lista dostępnych wtyczek etapów Transpilera
Użyj funkcji list_stage_plugins, podając nazwę etapu, którego wtyczki chcesz wylistować.
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
from qiskit.transpiler.preset_passmanagers.plugin import list_stage_plugins
list_stage_plugins("layout")
['default', 'dense', 'sabre', 'trivial']
list_stage_plugins("routing")
['basic', 'default', 'lookahead', 'none', 'sabre']
Gdyby zainstalowano qiskit-toqm, toqm pojawiłoby się na liście wtyczek routing.
Lista dostępnych wtyczek syntezy unitarnej
Użyj funkcji unitary_synthesis_plugin_names.
from qiskit.transpiler.passes.synthesis import unitary_synthesis_plugin_names
unitary_synthesis_plugin_names()
['aqc', 'clifford', 'default', 'gridsynth', 'sk']
Lista dostępnych wtyczek syntezy wysokiego poziomu
Użyj funkcji high_level_synthesis_plugin_names, podając nazwę typu „obiektu wysokiego poziomu" do syntezy. Nazwa odpowiada atrybutowi name klasy Operation reprezentującej typ syntetyzowanego obiektu.
from qiskit.transpiler.passes.synthesis import (
high_level_synthesis_plugin_names,
)
high_level_synthesis_plugin_names("clifford")
['ag', 'bm', 'default', 'greedy', 'layers', 'lnn', 'rb_default']
Możesz użyć klasy HighLevelSynthesisPluginManager, aby wylistować nazwy wszystkich wtyczek syntezy wysokiego poziomu:
from qiskit.transpiler.passes.synthesis.plugin import (
HighLevelSynthesisPluginManager,
)
HighLevelSynthesisPluginManager().plugins.names()
['FullAdder.default',
'FullAdder.ripple_c04',
'FullAdder.ripple_v95',
'HalfAdder.default',
'HalfAdder.qft_d00',
'HalfAdder.ripple_c04',
'HalfAdder.ripple_r25',
'HalfAdder.ripple_v95',
'IntComp.default',
'IntComp.noaux',
'IntComp.twos',
'ModularAdder.default',
'ModularAdder.modular_v17',
'ModularAdder.qft_d00',
'ModularAdder.ripple_c04',
'ModularAdder.ripple_v95',
'Multiplier.cumulative_h18',
'Multiplier.default',
'Multiplier.qft_r17',
'PauliEvolution.default',
'PauliEvolution.rustiq',
'WeightedSum.default',
'annotated.default',
'clifford.ag',
'clifford.bm',
'clifford.default',
'clifford.greedy',
'clifford.layers',
'clifford.lnn',
'linear_function.default',
'linear_function.kms',
'linear_function.pmh',
'mcmt.default',
'mcmt.noaux',
'mcmt.vchain',
'mcmt.xgate',
'mcx.1_clean_b95',
'mcx.1_clean_kg24',
'mcx.1_dirty_kg24',
'mcx.2_clean_kg24',
'mcx.2_dirty_kg24',
'mcx.default',
'mcx.gray_code',
'mcx.n_clean_m15',
'mcx.n_dirty_i15',
'mcx.noaux_hp24',
'mcx.noaux_v24',
'permutation.acg',
'permutation.basic',
'permutation.default',
'permutation.kms',
'permutation.token_swapper',
'qft.default',
'qft.full',
'qft.line',
'clifford.rb_default']
Używanie wtyczki
W tej sekcji pokazujemy, jak używać wtyczek Transpilera. W przykładach kodu używamy wtyczek dostarczanych z Qiskit, ale wtyczki zainstalowane z zewnętrznych pakietów używa się w ten sam sposób.
Używanie wtyczki etapu Transpilera
Aby użyć wtyczki etapu Transpilera, podaj jej nazwę jako odpowiedni argument w generate_preset_pass_manager lub transpile. Argument tworzy się przez dodanie _method do nazwy etapu transpilacji. Na przykład, aby użyć wtyczki routingu lookahead, należy podać lookahead jako argument routing_method:
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, routing_method="lookahead"
)
Używanie wtyczki syntezy unitarnej
Aby użyć wtyczki syntezy unitarnej, podaj jej nazwę jako argument unitary_synthesis_method w generate_preset_pass_manager lub transpile:
pass_manager = generate_preset_pass_manager(
optimization_level=3,
backend=backend,
unitary_synthesis_method="sk",
unitary_synthesis_plugin_config=dict(
basis_gates=["cz", "id", "rz", "sx", "x"]
),
)
Synteza unitarna jest używana na etapach init, translation i optimization podzielonego na etapy menedżera przebiegów zwracanego przez generate_preset_pass_manager lub używanego w transpile. Opis tych etapów znajdziesz w Etapach Transpilera.
Użyj argumentu unitary_synthesis_plugin_config, czyli słownika o dowolnej strukturze, aby przekazać opcje dla metody syntezy unitarnej. Dokumentacja metody syntezy powinna wyjaśniać obsługiwane opcje. Ta lista zawiera linki do dokumentacji wbudowanych wtyczek syntezy unitarnej.
Używanie wtyczki syntezy wysokiego poziomu
Najpierw utwórz obiekt HLSConfig, aby przechowywać nazwy wtyczek do użycia dla różnych obiektów wysokiego poziomu. Na przykład:
from qiskit.transpiler.passes import HLSConfig
hls_config = HLSConfig(clifford=["layers"], linear_function=["pmh"])
Ten fragment kodu tworzy konfigurację syntezy wysokiego poziomu, która używa wtyczki layers
do syntezy obiektów Clifford i wtyczki pmh do syntezy
obiektów LinearFunction. Nazwy argumentów słów kluczowych odpowiadają
atrybutowi name klasy Operation reprezentującej typ syntetyzowanego obiektu.
Dla każdego obiektu wysokiego poziomu podane wtyczki są kolejno wypróbowywane, dopóki jedna z nich
nie zakończy się sukcesem (w powyższym przykładzie każda lista zawiera tylko jedną wtyczkę).
Oprócz podawania wtyczki przez jej nazwę, możesz zamiast tego przekazać krotkę (name, options), gdzie drugi element krotki to słownik zawierający opcje dla wtyczki. Dokumentacja metody syntezy powinna wyjaśniać obsługiwane opcje. Ta lista zawiera linki do dokumentacji wbudowanych wtyczek syntezy wysokiego poziomu.
Gdy obiekt HLSConfig zostanie utworzony, przekaż go jako argument
hls_config do generate_preset_pass_manager lub transpile:
pass_manager = generate_preset_pass_manager(
optimization_level=3, backend=backend, hls_config=hls_config
)
Synteza wysokiego poziomu jest używana na etapach init, translation i optimization podzielonego na etapy menedżera przebiegów zwracanego przez generate_preset_pass_manager lub używanego w transpile. Opis tych etapów znajdziesz w Etapach Transpilera.
Kolejne kroki
- Utwórz wtyczkę Transpilera.
- Sprawdź samouczki, aby zobaczyć przykłady transpilacji i uruchamiania obwodów kwantowych.