Installer et utiliser des plugins de transpilation
Versions des paquets
Le code de cette page a été développé avec les dépendances suivantes. Nous recommandons d'utiliser ces versions ou des versions plus récentes.
qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1
Pour faciliter le développement et la réutilisation de code de transpilation personnalisé par la communauté Qiskit, le SDK Qiskit propose une interface de plugins qui permet à des paquets Python tiers de déclarer qu'ils fournissent des fonctionnalités de transpilation étendues accessibles via Qiskit.
Actuellement, les plugins tiers peuvent enrichir la transpilation de trois façons :
- Un plugin de phase de transpilation fournit un gestionnaire de passes pouvant remplacer l'une des 6 phases d'un gestionnaire de passes par phases prédéfini :
init,layout,routing,translation,optimizationetscheduling. - Un plugin de synthèse unitaire offre des fonctionnalités étendues pour la synthèse de portes unitaires.
- Un plugin de synthèse de haut niveau offre des fonctionnalités étendues pour la synthèse d'« objets de haut niveau » tels que les fonctions linéaires ou les opérateurs de Clifford. Ces objets de haut niveau sont représentés par des sous-classes de la classe Operation.
Le reste de cette page explique comment lister les plugins disponibles, en installer de nouveaux et les utiliser.
Lister les plugins disponibles et en installer de nouveaux
Qiskit intègre déjà quelques plugins de transpilation. Pour en installer d'autres, tu peux utiliser ton gestionnaire de paquets Python. Par exemple, tu peux exécuter pip install qiskit-toqm pour installer le plugin de phase de routage Qiskit TOQM. Plusieurs plugins tiers font partie de l'écosystème Qiskit.
Lister les plugins de phase de transpilation disponibles
Utilise la fonction list_stage_plugins en lui passant le nom de la phase dont tu veux lister les plugins.
# 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']
Si qiskit-toqm était installé, toqm apparaîtrait dans la liste des plugins de routing.
Lister les plugins de synthèse unitaire disponibles
Utilise la fonction unitary_synthesis_plugin_names.
from qiskit.transpiler.passes.synthesis import unitary_synthesis_plugin_names
unitary_synthesis_plugin_names()
['aqc', 'clifford', 'default', 'gridsynth', 'sk']
Lister les plugins de synthèse de haut niveau disponibles
Utilise la fonction high_level_synthesis_plugin_names en lui passant le nom du type d'« objet de haut niveau » à synthétiser. Ce nom correspond à l'attribut name de la classe Operation représentant le type d'objet à synthétiser.
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']
Tu peux utiliser la classe HighLevelSynthesisPluginManager pour lister les noms de tous les plugins de synthèse de haut niveau :
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']
Utiliser un plugin
Dans cette section, nous montrons comment utiliser des plugins de transpilation. Les exemples de code utilisent des plugins fournis avec Qiskit, mais les plugins installés depuis des paquets tiers s'utilisent de la même façon.
Utiliser un plugin de phase de transpilation
Pour utiliser un plugin de phase de transpilation, indique son nom dans l'argument approprié de generate_preset_pass_manager ou de transpile. Cet argument se forme en ajoutant _method au nom de la phase de transpilation. Par exemple, pour utiliser le plugin de routage lookahead, on passe lookahead à l'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"
)
Utiliser un plugin de synthèse unitaire
Pour utiliser un plugin de synthèse unitaire, indique son nom dans l'argument unitary_synthesis_method de generate_preset_pass_manager ou de 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"]
),
)
La synthèse unitaire est utilisée dans les phases init, translation et optimization du gestionnaire de passes par phases retourné par generate_preset_pass_manager ou utilisé dans transpile. Consulte Phases du transpiler pour une description de ces phases.
Utilise l'argument unitary_synthesis_plugin_config, un dictionnaire libre, pour passer des options à la méthode de synthèse unitaire. La documentation de la méthode de synthèse doit expliquer les options qu'elle prend en charge. Consulte cette liste pour accéder à la documentation des plugins de synthèse unitaire intégrés.
Utiliser un plugin de synthèse de haut niveau
Commence par créer un objet HLSConfig pour stocker les noms des plugins à utiliser pour différents objets de haut niveau. Par exemple :
from qiskit.transpiler.passes import HLSConfig
hls_config = HLSConfig(clifford=["layers"], linear_function=["pmh"])
Ce bloc de code crée une configuration de synthèse de haut niveau qui utilise le plugin layers
pour synthétiser des objets Clifford et le plugin pmh pour synthétiser des objets
LinearFunction. Les noms des arguments nommés correspondent à l'attribut
name de la classe Operation représentant le type d'objet à synthétiser.
Pour chaque objet de haut niveau, les plugins de la liste sont essayés dans l'ordre jusqu'à ce que l'un d'eux réussisse (dans l'exemple ci-dessus, chaque liste ne contient qu'un seul plugin).
En plus de spécifier un plugin par son nom, tu peux également passer un tuple (nom, options), où le second élément est un dictionnaire contenant les options du plugin. La documentation de la méthode de synthèse doit expliquer les options qu'elle prend en charge. Consulte cette liste pour accéder à la documentation des plugins de synthèse de haut niveau intégrés.
Une fois l'objet HLSConfig créé, passe-le via l'argument
hls_config à generate_preset_pass_manager ou à transpile :
pass_manager = generate_preset_pass_manager(
optimization_level=3, backend=backend, hls_config=hls_config
)
La synthèse de haut niveau est utilisée dans les phases init, translation et optimization du gestionnaire de passes par phases retourné par generate_preset_pass_manager ou utilisé dans transpile. Consulte Phases du transpiler pour une description de ces phases.
Prochaines étapes
- Créer un plugin de transpilation.
- Consulte les tutoriels pour des exemples de transpilation et d'exécution de circuits quantiques.