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

Проходи транспілятора на основі ШІ

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime qiskit-ibm-transpiler

Проходи транспілятора на основі ШІ — це проходи, які слугують повноцінною заміною «традиційних» проходів Qiskit для деяких задач транспіляції. Вони нерідко дають кращі результати, ніж існуючі евристичні алгоритми (зокрема меншу глибину та кількість CNOT-вентилів), і водночас є значно швидшими за оптимізаційні алгоритми на кшталт розв'язувачів булевої виконуваності. Проходи транспілятора на основі ШІ можна запускати у локальному середовищі або в хмарі через Qiskit Transpiler Service — якщо ти маєш доступ до IBM Quantum® Premium Plan, Flex Plan або On-Prem (через IBM Quantum Platform API) Plan.

примітка

Проходи транспілятора на основі ШІ перебувають у статусі бета-версії та можуть змінюватися. Якщо маєш відгуки або хочеш зв'язатися з командою розробників, скористайся каналом у Qiskit Slack Workspace.

На сьогодні доступні такі проходи:

Проходи маршрутизації

  • AIRouting: вибір розміщення та маршрутизація схеми

Проходи синтезу схем

  • AICliffordSynthesis: синтез схем Кліффорда
  • AILinearFunctionSynthesis: синтез схем лінійних функцій
  • AIPermutationSynthesis: синтез схем перестановок
  • AIPauliNetworkSynthesis: синтез схем мережі Паулі

Щоб використовувати проходи транспілятора на основі ШІ, спочатку встанови пакет qiskit-ibm-transpiler. Більше інформації про доступні параметри можна знайти в документації API qiskit-ibm-transpiler.

Запуск проходів транспілятора на основі ШІ локально або в хмарі

Якщо хочеш безкоштовно використовувати проходи транспілятора на основі ШІ у локальному середовищі, встанови qiskit-ibm-transpiler з додатковими залежностями:

pip install qiskit-ibm-transpiler[ai-local-mode]

Без цих додаткових залежностей проходи транспілятора на основі ШІ запускаються в хмарі через Qiskit Transpiler Service (доступно лише для користувачів IBM Quantum Premium Plan, Flex Plan або On-Prem (через IBM Quantum Platform API) Plan). Після встановлення додаткових залежностей типовим режимом запуску проходів є локальна машина.

Прохід маршрутизації ШІ

Прохід AIRouting виконує функції як етапу розміщення, так і етапу маршрутизації. Його можна використовувати у PassManager таким чином:

from qiskit.transpiler import PassManager
from qiskit.circuit.library import efficient_su2
from qiskit_ibm_transpiler.ai.routing import AIRouting
from qiskit_ibm_runtime import QiskitRuntimeService

backend = QiskitRuntimeService().backend("ibm_torino")
ai_passmanager = PassManager(
[
AIRouting(
backend=backend,
optimization_level=2,
layout_mode="optimize",
local_mode=True,
)
]
)

circuit = efficient_su2(101, entanglement="circular", reps=1)

transpiled_circuit = ai_passmanager.run(circuit)

Тут backend визначає карту зв'язності для маршрутизації, optimization_level (1, 2 або 3) задає обчислювальні зусилля в процесі (вищий рівень зазвичай дає кращий результат, але займає більше часу), а layout_mode вказує спосіб вибору розміщення. layout_mode підтримує такі опції:

  • keep: Зберігає розміщення, задане попередніми проходами транспілятора (або використовує тривіальне розміщення, якщо воно не задане). Зазвичай застосовується лише тоді, коли схему потрібно запустити на конкретних кубітах пристрою. Часто дає гірші результати через менший простір для оптимізації.
  • improve: Використовує розміщення, задане попередніми проходами транспілятора, як відправну точку. Корисний, коли є хороше початкове здогадування щодо розміщення — наприклад, для схем, побудованих так, що вони приблизно відповідають карті зв'язності пристрою. Також стане в пригоді, якщо хочеш спробувати інші конкретні проходи розміщення в поєднанні з AIRouting.
  • optimize: Типовий режим. Найкраще підходить для загальних схем, де немає хороших здогадок щодо розміщення. Цей режим ігнорує попередні вибори розміщення.
  • local_mode: Цей прапорець визначає, де виконується прохід AIRouting. Якщо FalseAIRouting запускається віддалено через Qiskit Transpiler Service. Якщо True — пакет намагається запустити прохід у локальному середовищі з відкатом до хмарного режиму, якщо потрібні залежності не знайдено.

Проходи синтезу схем ШІ

Проходи синтезу схем ШІ дають змогу оптимізувати фрагменти схем різних типів (Clifford, Linear Function, Permutation, Pauli Network) шляхом їх повторного синтезу. Типовий спосіб використання проходу синтезу виглядає так:

from qiskit.transpiler import PassManager

from qiskit_ibm_transpiler.ai.routing import AIRouting
from qiskit_ibm_transpiler.ai.synthesis import AILinearFunctionSynthesis
from qiskit_ibm_transpiler.ai.collection import CollectLinearFunctions
from qiskit_ibm_transpiler.ai.synthesis import AIPauliNetworkSynthesis
from qiskit_ibm_transpiler.ai.collection import CollectPauliNetworks
from qiskit.circuit.library import efficient_su2

ibm_torino = QiskitRuntimeService().backend("ibm_torino")
ai_passmanager = PassManager(
[
AIRouting(
backend=ibm_torino,
optimization_level=3,
layout_mode="optimize",
local_mode=True,
), # Route circuit
CollectLinearFunctions(), # Collect Linear Function blocks
AILinearFunctionSynthesis(
backend=ibm_torino, local_mode=True
), # Re-synthesize Linear Function blocks
CollectPauliNetworks(), # Collect Pauli Networks blocks
AIPauliNetworkSynthesis(
backend=ibm_torino, local_mode=True
), # Re-synthesize Pauli Network blocks.
]
)

circuit = efficient_su2(10, entanglement="full", reps=1)

transpiled_circuit = ai_passmanager.run(circuit)

Синтез поважає карту зв'язності пристрою: його можна безпечно запускати після інших проходів маршрутизації, не порушуючи схему, тому загальна схема все одно відповідатиме обмеженням пристрою. За замовчуванням синтез замінює оригінальну підсхему лише тоді, коли синтезована підсхема є кращою (наразі перевіряється лише кількість CNOT), але це можна змінити, щоб заміна відбувалась завжди, задавши replace_only_if_better=False.

Наступні проходи синтезу доступні з qiskit_ibm_transpiler.ai.synthesis:

  • AICliffordSynthesis: синтез для схем Clifford (блоки вентилів H, S і CX). Наразі підтримуються блоки до дев'яти кубітів.
  • AILinearFunctionSynthesis: синтез для схем Linear Function (блоки вентилів CX і SWAP). Наразі підтримуються блоки до дев'яти кубітів.
  • AIPermutationSynthesis: синтез для схем Permutation (блоки вентилів SWAP). Наразі доступний для блоків на 65, 33 і 27 кубітів.
  • AIPauliNetworkSynthesis: синтез для схем мережі Паулі (блоки вентилів H, S, SX, CX, RX, RY і RZ). Наразі підтримуються блоки до шести кубітів.

Ми плануємо поступово збільшувати розмір підтримуваних блоків.

Усі проходи використовують пул потоків для паралельного надсилання кількох запитів. За замовчуванням максимальна кількість потоків дорівнює кількості ядер плюс чотири (типові значення для об'єкта Python ThreadPoolExecutor). Однак ти можеш задати власне значення за допомогою аргументу max_threads під час ініціалізації проходу. Наприклад, наступний рядок ініціалізує прохід AILinearFunctionSynthesis, дозволяючи йому використовувати максимум 20 потоків.

AILinearFunctionSynthesis(backend=ibm_torino, max_threads=20)  # Re-synthesize Linear Function blocks using 20 threads max

Також можна встановити змінну середовища AI_TRANSPILER_MAX_THREADS на потрібну максимальну кількість потоків — усі проходи синтезу, ініціалізовані після цього, використовуватимуть це значення.

Щоб проходи синтезу ШІ синтезували підсхему, вона має розташовуватися на зв'язному підграфі карти зв'язності (один зі способів це забезпечити — виконати прохід маршрутизації перед збором блоків, але це не єдиний варіант). Проходи синтезу автоматично перевіряють, чи підтримується конкретний підграф, і якщо ні — видають попередження та залишають оригінальну підсхему без змін.

Наведені нижче спеціальні проходи збору для Cliffords, лінійних функцій і перестановок, які можна імпортувати з qiskit_ibm_transpiler.ai.collection, доповнюють проходи синтезу:

  • CollectCliffords: збирає блоки Кліффорда як об'єкти Instruction і зберігає оригінальну підсхему для порівняння після синтезу.
  • CollectLinearFunctions: збирає блоки SWAP і CX як об'єкти LinearFunction і зберігає оригінальну підсхему для порівняння після синтезу.
  • CollectPermutations: збирає блоки схем SWAP як об'єкти Permutations.
  • CollectPauliNetworks: збирає блоки мережі Паулі і зберігає оригінальну підсхему для порівняння після синтезу.

Ці спеціальні проходи збору обмежують розміри зібраних підсхем так, щоб вони підтримувались проходами синтезу на основі ШІ. Тому рекомендується використовувати їх після проходів маршрутизації та перед проходами синтезу для кращої загальної оптимізації.

Гібридна транспіляція схем: евристика + ШІ

qiskit-ibm-transpiler дає змогу налаштувати гібридний менеджер проходів, який поєднує переваги евристичних підходів Qiskit та проходів транспілятора на основі ШІ. Ця функція поводиться подібно до методу Qiskit generate_pass_manager. Типовий спосіб використання generate_ai_pass_manager виглядає так:

from qiskit_ibm_transpiler import generate_ai_pass_manager
from qiskit.circuit.library import efficient_su2
from qiskit_ibm_runtime import QiskitRuntimeService

backend = QiskitRuntimeService().backend("ibm_torino")
torino_coupling_map = backend.coupling_map

su2_circuit = efficient_su2(101, entanglement="circular", reps=1)

ai_transpiler_pass_manager = generate_ai_pass_manager(
coupling_map=torino_coupling_map,
ai_optimization_level=3,
optimization_level=3,
ai_layout_mode="optimize",
)

ai_su2_transpiled_circuit = ai_transpiler_pass_manager.run(su2_circuit)

У цьому прикладі використовуються такі параметри:

  • coupling_map — вказує карту зв'язності для транспіляції.
  • ai_optimization_level — задає рівень оптимізації (1–3) для компонентів ШІ у PassManager.
  • optimization_level — визначає ступінь оптимізації схеми для евристичних компонентів PassManager.
  • ai_layout_mode — визначає, як частина маршрутизації ШІ в PassManager обробляє розміщення. Зверни увагу на розділ Прохід маршрутизації ШІ, щоб переглянути параметри конфігурації для ai_layout_mode.

Обмеження

Докладнішу інформацію про обмеження, що застосовуються до проходів транспілятора на основі ШІ, можна знайти в документації Qiskit Transpiler Service.

Цитування

Якщо ти використовуєш будь-яку функцію на основі ШІ з Qiskit Transpiler Service у своїх дослідженнях, скористайся рекомендованим цитуванням.