Перейти до основного вмісту

Встановлення та використання плагінів транспілятора

Package versions

The code on this page was developed using the following requirements. We recommend using these versions or newer.

qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1

Щоб сприяти розробці та повторному використанню кастомного коду транспіляції ширшою спільнотою користувачів Qiskit, Qiskit SDK підтримує інтерфейс плагінів, що дозволяє стороннім пакетам Python оголошувати про надання розширеної функціональності транспіляції, доступної через Qiskit.

На даний момент сторонні плагіни можуть надавати розширену функціональність транспіляції трьома способами:

  • Плагін етапу транспілятора надає менеджер проходів, що може використовуватися замість одного з 6 етапів наперед визначеного поетапного менеджера проходів: init, layout, routing, translation, optimization та scheduling.
  • Плагін унітарного синтезу надає розширену функціональність для синтезу унітарних вентилів.
  • Плагін синтезу високого рівня надає розширену функціональність для синтезу "об'єктів високого рівня", таких як лінійні функції або оператори Кліффорда. Об'єкти високого рівня представлені підкласами класу Operation.

Решта сторінки описує, як переглядати доступні плагіни, встановлювати нові та використовувати їх.

Перегляд доступних плагінів та встановлення нових

Qiskit вже включає деякі вбудовані плагіни для транспіляції. Щоб встановити більше, ти можеш використовувати менеджер пакетів Python. Наприклад, можна виконати pip install qiskit-toqm для встановлення плагіну етапу маршрутизації Qiskit TOQM. Низка сторонніх плагінів є частиною екосистеми Qiskit.

Перегляд доступних плагінів етапів транспілятора

Використовуй функцію list_stage_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']

Якщо б qiskit-toqm було встановлено, то toqm з'явився б у списку плагінів routing.

Перегляд доступних плагінів унітарного синтезу

Використовуй функцію unitary_synthesis_plugin_names.

from qiskit.transpiler.passes.synthesis import unitary_synthesis_plugin_names

unitary_synthesis_plugin_names()
['aqc', 'clifford', 'default', 'gridsynth', 'sk']

Перегляд доступних плагінів синтезу високого рівня

Використовуй функцію high_level_synthesis_plugin_names, передаючи ім'я типу "об'єкта високого рівня" для синтезу. Ім'я відповідає атрибуту name класу Operation, що представляє тип об'єкта для синтезу.

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']

Ти можеш використовувати клас HighLevelSynthesisPluginManager для виведення імен всіх плагінів синтезу високого рівня:

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']

Використання плагіна

У цьому розділі показано, як використовувати плагіни транспілятора. У прикладах коду ми використовуємо плагіни, що входять до складу Qiskit, але плагіни зі сторонніх пакетів використовуються так само.

Використання плагіна етапу транспілятора

Щоб використовувати плагін етапу транспілятора, вкажи його ім'я у відповідному аргументі generate_preset_pass_manager або transpile. Аргумент формується додаванням _method до назви етапу транспіляції. Наприклад, щоб використовувати плагін маршрутизації lookahead, потрібно вказати lookahead для аргументу 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"
)

Використання плагіна унітарного синтезу

Щоб використовувати плагін унітарного синтезу, вкажи його ім'я як аргумент unitary_synthesis_method у generate_preset_pass_manager або 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"]
),
)

Унітарний синтез використовується на етапах init, translation та optimization поетапного менеджера проходів, що повертається generate_preset_pass_manager або використовується в transpile. Опис цих етапів дивись у розділі Етапи транспілятора.

Використовуй аргумент unitary_synthesis_plugin_config — словник вільного формату — для передачі параметрів методу унітарного синтезу. Документація методу синтезу повинна пояснювати параметри, що він підтримує. Дивись цей список для посилань на документацію вбудованих плагінів унітарного синтезу.

Використання плагіна синтезу високого рівня

Спочатку створи об'єкт HLSConfig для зберігання імен плагінів для використання з різними об'єктами високого рівня. Наприклад:

from qiskit.transpiler.passes import HLSConfig

hls_config = HLSConfig(clifford=["layers"], linear_function=["pmh"])

Цей блок коду створює конфігурацію синтезу високого рівня, що використовує плагін layers для синтезу об'єктів Clifford та плагін pmh для синтезу об'єктів LinearFunction. Імена аргументів-ключових слів відповідають атрибуту name класу Operation, що представляє тип об'єкта для синтезу. Для кожного об'єкта високого рівня задані плагіни перебираються послідовно, доки один із них не спрацює (у наведеному вище прикладі кожен список містить лише один плагін).

Крім вказання плагіна за його іменем, ти можеш передати кортеж (ім'я, параметри), де другий елемент кортежу — словник з параметрами для плагіна. Документація методу синтезу повинна пояснювати параметри, що він підтримує. Дивись цей список для посилань на документацію вбудованих плагінів синтезу високого рівня.

Після створення об'єкта HLSConfig передай його як аргумент hls_config у generate_preset_pass_manager або transpile:

pass_manager = generate_preset_pass_manager(
optimization_level=3, backend=backend, hls_config=hls_config
)

Синтез високого рівня використовується на етапах init, translation та optimization поетапного менеджера проходів, що повертається generate_preset_pass_manager або використовується в transpile. Опис цих етапів дивись у розділі Етапи транспілятора.

Наступні кроки

Рекомендація