Проходи транспілятора на основі ШІ
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime qiskit-ibm-transpiler
Проходи транспілятора на основі ШІ — це проходи, які слугують повноцінною заміною «традиційних» проходів Qiskit для деяких задач транспіляції. Вони нерідко дають кращі результати, ніж існуючі евристичні алгоритми (зокрема меншу глибину та кількість CNOT-вентилів), і водночас є значно швидшими за оптимізаційні алгоритми на кшталт розв'язувачів булевої виконуваності. Проходи транспілятора на основі ШІ запускаються у локальному середовищі.
Проходи транспілятора на основі ШІ перебувають у статусі бета-версії та можуть змінюватися. Якщо маєш відгуки або хочеш зв'язатися з командою розробників, скористайся каналом у Qiskit Slack Workspace.
На сьогодні доступні такі проходи:
Проходи маршрутизації
AIRouting: вибір розміщення та маршрутизація схеми
Проходи синтезу схем
AICliffordSynthesis: синтез схем КліффордаAILinearFunctionSynthesis: синтез схем лінійних функційAIPermutationSynthesis: синтез схем перестановок
Щоб використовувати проходи транспілятора на основі ШІ, спочатку встанови пакет qiskit-ibm-transpiler. Більше інформації про доступні параметри можна знайти в документації API qiskit-ibm-transpiler.
Запуск проходів транспілятора на основі ШІ локально або в хмарі
Спочатку встанови qiskit-ibm-transpiler з додатковими залежностями:
pip install qiskit-ibm-transpiler[ai-local-mode]
Після встановлення додаткових залежностей типовим режимом запуску проходів є локальна машина.
Прохід маршрутизації ШІ
Прохід 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
import logging
backend = QiskitRuntimeService().backend("ibm_fez")
ai_passmanager = PassManager(
[
AIRouting(
backend=backend,
optimization_level=2,
layout_mode="optimize",
local_mode=True,
)
]
)
circuit = efficient_su2(101, entanglement="circular", reps=1)
logging.getLogger(
"qiskit_ibm_transpiler.wrappers.ai_local_synthesis"
).setLevel(logging.WARNING)
transpiled_circuit = ai_passmanager.run(circuit)
Fetching 4 files: 0%| | 0/4 [00:00<?, ?it/s]
Тут backend визначає карту зв'язності для маршрутизації, optimization_level (1, 2 або 3) задає обчислювальні зусилля в процесі (вищий рівень зазвичай дає кращий результат, але займає більше часу), а layout_mode вказує спосіб вибору розміщення.
layout_mode підтримує такі опції:
keep: Зберігає розміщення, задане попередніми проходами транспілятора (або використовує тривіальне розміщення, якщо воно не задане). Зазвичай застосовується лише тоді, коли схему потрібно запустити на конкретних кубітах пристрою. Часто дає гірші результати через менший простір для оптимізації.improve: Використовує розміщення, задане попередніми проходами транспілятора, як відправну точку. Корисний, коли є хороше початкове здогадування щодо розміщення — наприклад, для схем, побудованих так, що вони приблизно відповідають карті зв'язності пристрою. Також стане в пригоді, якщо хочеш спробувати інші конкретні проходи розміщення в поєднанні зAIRouting.optimize: Типовий режим. Найкраще підходить для загальних схем, де немає хороших здогадок щодо розміщення. Цей режим ігнорує попередні вибори розміщення.local_mode: Цей прапорець визначає, де виконується прохідAIRouting. ЯкщоFalse—AIRoutingзапускається віддалено через 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.circuit.library import efficient_su2
ibm_kingston = QiskitRuntimeService().backend("ibm_kingston")
ai_passmanager = PassManager(
[
AIRouting(
backend=ibm_kingston,
optimization_level=3,
layout_mode="optimize",
local_mode=True,
), # Route circuit
CollectLinearFunctions(), # Collect Linear Function blocks
AILinearFunctionSynthesis(
backend=ibm_kingston, local_mode=True
), # Re-synthesize Linear Function blocks
]
)
circuit = efficient_su2(10, entanglement="full", reps=1)
transpiled_circuit = ai_passmanager.run(circuit)
Fetching 127 files: 0%| | 0/127 [00:00<?, ?it/s]
Синтез поважає карту зв'язності пристрою: його можна безпечно запускати після інших проходів маршрутизації, не порушуючи схему, тому загальна схема все одно відповідатиме обмеженням пристрою. За замовчуванням синтез замінює оригінальну підсхему лише тоді, коли синтезована підсхема є кращою (наразі перевіряється лише кількість 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_kingston")
kingston_coupling_map = backend.coupling_map
su2_circuit = efficient_su2(101, entanglement="circular", reps=1)
ai_transpiler_pass_manager = generate_ai_pass_manager(
coupling_map=kingston_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 у своїх дослідженнях, використовуй таке рекомендоване цитування:
@misc{2405.13196,
Author = {David Kremer and Victor Villar and Hanhee Paik and Ivan Duran and Ismael Faro and Juan Cruz-Benito},
Title = {Practical and efficient quantum circuit synthesis and transpiling with Reinforcement Learning},
Year = {2024},
Eprint = {arXiv:2405.13196},
}