AI搭載トランスパイラが通過する
AIを活用したトランスパイラ・パスは、一部のトランスパイル処理において、「従来の」Qiskitパスのそのままの代替として機能するパスです。 これらは、既存のヒューリスティックアルゴリズム(探索深度やCNOT数の低減など)よりも優れた結果を出すことが多いだけでなく、ブール満足可能性ソルバーなどの最適化アルゴリズムよりもはるかに高速である。 AIトランスパイラは、ローカル環境で実行されます。
AIを搭載したトランスパイラー・パスはベータ版のリリース状態であり、変更される可能性がある。 フィードバックや開発チームへの連絡は、こちらの Qiskit Slack Workspaceチャンネルをご利用ください。
現在入手可能なパスは以下の通り:
ルーティング・パス
AIRouting:レイアウトの選択と回路配線
回路合成パス
AICliffordSynthesis:クリフォード回路合成AILinearFunctionSynthesis:線形関数回路合成AIPermutationSynthesis:順列回路合成
AIトランスパイラ・パスを使用するには、まずパッケージを qiskit-ibm-transpiler インストールしてください。 利用可能な各種オプションの詳細については、 qiskit-ibm-transpiler の API ドキュメントをご覧ください。
pip install qiskit-ibm-transpilerAIルーティングパス
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",
)
]
)
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)ここで、 backend は、どのカップリングマップをルーティングするかを決定し、 optimization_level (1、2、または3)は、プロセスに費やす計算工数を決定し(通常、高い方が良い結果が得られるが、時間がかかる)、 layout_mode は、レイアウト選択を処理する方法を指定する。
layout_mode には以下のオプションがある:
keep:これは、前のトランスパイラ・パスが設定したレイアウトを尊重します(設定されていない場合は、トリビアル・レイアウトを使用します)。 通常、デバイスの特定の量子ビットで回路を実行しなければならない場合にのみ使用される。 最適化の余地が少ないため、悪い結果を生むことが多い。improve:これは、前のトランスパイラ・パスが設定したレイアウトを出発点として使用します。 例えば、デバイスのカップリング・マップにほぼ沿うように回路が作られている場合など、レイアウトの初期推測がうまくいく場合に便利です。 また、他の特定のレイアウトパスをAIRoutingパスと組み合わせて試したい場合にも便利です。optimize:これはデフォルトのモードである。 レイアウトをうまく推測できないような一般的な回路に最適です。 このモードでは、以前のレイアウト選択は無視されます。
AI回路合成通過
AI回路合成パスにより、異なる回路タイプ (クリフォード、 線形関数、 パーミュテーション、パウリ・ネットワーク)の断片を再合成して最適化することができる。 合成パスの典型的な使い方は以下の通り:
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)合成はデバイスのカップリング・マップを尊重します。回路を乱すことなく、他の配線パスの後に安全に実行できるため、回路全体はデバイスの制約に従ったままです。 デフォルトでは、合成されたサブサーキットが元のサブサーキットを改善した場合にのみ、合成は元のサブサーキットを置き換えますが(現在はCNOTカウントのチェックのみ)、 replace_only_if_better=False を設定することで、常に回路を置き換えるように強制することができます。
以下の合成パスは qiskit_ibm_transpiler.ai.synthesis から入手可能です:
- AICliffordSynthesis : クリフォード回路(
H、S、CXゲートのブロック)の合成。 現在は9量子ビットブロックまで。 - AILinearFunctionSynthesis : 線形関数回路(
CXおよびSWAPゲートのブロック)の合成。 現在は9量子ビットブロックまで。 - AIPermutationSynthesis : パーミュテーション回路(
SWAPゲートのブロック)の合成。 現在、65、33、27量子ビット・ブロックで利用可能。 - AIPauliNetworkSynthesis :パウリネットワーク回路(
H、S、SX、CX、RX、RY、RZゲートのブロック)の合成。 現在は6量子ビットブロックまで。
今後、対応ブロックのサイズを徐々に大きくしていく予定だ。
すべてのパスは、スレッドプールを使って複数のリクエストを並行して送信する。 デフォルトでは、最大スレッド数はコア数+4( ThreadPoolExecutor Python オブジェクトのデフォルト値)。 しかし、パスのインスタンス化時に max_threads 引数で独自の値を設定することができます。 例えば、以下の行は AILinearFunctionSynthesis パスをインスタンス化し、最大20スレッドを使用できるようにしている。
AILinearFunctionSynthesis(backend=ibm_torino, max_threads=20) # Re-synthesize Linear Function blocks using 20 threads maxまた、環境変数 AI_TRANSPILER_MAX_THREADS 、希望する最大スレッド数に設定することもできる。その後にインスタンス化されたすべての合成パスは、その値を使用する。
AI合成パスがサブサーキットを合成するためには、そのサブサーキットがカップリング・マップの連結された部分グラフ上に配置されていなければならない(これを行う1つの方法は、ブロックを収集する前に配線パスを行うことであるが、これだけが唯一の方法ではない)。 合成パスは、特定の部分グラフがサポートされているかどうかを自動的にチェックし、サポートされていない場合は警告を発し、元の部分回路を変更しない。
qiskit_ibm_transpiler.ai.collection からインポートできる、クリフォード、一次関数、および順列のための以下のカスタムコレクションパスも、合成パスを補完します:
- CollectCliffords :クリフォード・ブロックを
Instructionオブジェクトとして収集し、合成後に比較するために元のサブ回路を保存します。 - CollectLinearFunctions :
SWAPとCXのブロックをLinearFunctionオブジェクトとして収集し、合成後に比較するために元のサブ回路を保存します。 - CollectPermutations :
SWAP回路のブロックをPermutationsとして収集する。 - CollectPauliNetworks :パウリ・ネットワーク・ブロックを収集し、合成後に比較するために元のサブ回路を保存します。
これらのカスタム収集パスは、収集されたサブ回路のサイズを制限するため、AI搭載の合成パスでサポートされます。 したがって、より良い全体最適化のためには、配線パスの後、合成パスの前に使用することを推奨する。
ハイブリッド・ヒューリスティック-AI回路トランスパイレーション
qiskit-ibm-transpiler 、QiskitのヒューリスティックパスとAIを搭載したトランスパイラーパスの長所を組み合わせたハイブリッドパスマネージャーを設定することができます。 この機能は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- PassManager のAIコンポーネントに使用する最適化のレベル(1~3)を指定する。optimization_level- PassManager のヒューリスティックな構成要素に対して、回路上でどの程度の最適化を行うかを指定する。ai_layout_mode- PassManager のAIルーティング部がどのようにレイアウトを処理するかを指定する。 このai_layout_modeパラメーターの設定オプションについては、 AIルーティングパスのセクションを参照してください。
引用
引用
研究において本パッケージ qiskit-ibm-transpiler のAIを活用した機能を利用する場合は、以下の推奨引用形式に従ってください:
@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},
}