トランスパイルのデフォルト設定と構成オプション
パッケージバージョン
このページのコードは、以下の要件を用いて開発されました。 これらのバージョン以上を使用することを推奨します。
qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1
抽象回路は、QPU がサポートするベースゲートの種類が限られており、任意の操作を実行できないため、トランスパイルが必要です。Transpiler の役割は、任意の回路を指定した QPU 上で実行できるように変換することです。これは、回路をサポートされているベースゲートに変換し、回路の接続性が QPU のものと一致するように必要に応じて SWAP ゲートを導入することで行われます。
パスマネージャーを使ったトランスパイル で説明されているように、generate_preset_pass_manager 関数を使って パスマネージャー を作成し、回路または回路のリストをその run メソッドに渡してトランスパイルできます。generate_preset_pass_manager を呼び出す際は、最適化レベルと Backend のみを指定して他のオプションにはデフォルト値を使用することも、追加の引数を渡してトランスパイルを細かく調整することもできます。
パラメーターを指定しない基本的な使い方
この例では、追加のパラメーターを指定せずに回路とターゲット QPU を Transpiler に渡します。
回路を作成して結果を確認します:
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
from qiskit import QuantumCircuit
from qiskit.circuit.library import grover_operator, DiagonalGate
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke
# Create circuit to test transpiler on
oracle = DiagonalGate([1] * 7 + [-1])
qc = QuantumCircuit(3)
qc.h([0, 1, 2])
qc = qc.compose(grover_operator(oracle))
# Add measurements to the circuit
qc.measure_all()
# View the circuit
qc.draw(output="mpl")
回路をトランスパイルして結果を確認します:
from qiskit.transpiler import generate_preset_pass_manager
# Specify the QPU to target
backend = FakeSherbrooke()
# Transpile the circuit
pass_manager = generate_preset_pass_manager(
optimization_level=1, backend=backend
)
transpiled_circ = pass_manager.run(qc)
# View the transpiled circuit
transpiled_circ.draw(output="mpl", idle_wires=False)
利用可能なすべてのパラメーター
以下に、generate_preset_pass_manager 関数で利用可能なすべてのパラメーターを示します。引数には 2 つの種類があります:コンパイルのターゲットを説明するものと、Transpiler の動作に影響を与えるものです。
optimization_level 以外のすべてのパラメーターはオプションです。詳細については、Transpiler API ドキュメント を参照してください。
optimization_level(int) - 回路に対して実行する最適化の度合い。範囲 (0 - 3) の整数。レベルが高いほど、より最 適化された回路が生成されますが、トランスパイルに要する時間が長くなります。詳細については Transpiler の最適化レベルの設定 を参照してください。
コンパイルターゲットを説明するパラメーター:
これらの引数は、回路を実行するターゲット QPU を説明するもので、QPU のカップリングマップ(Qubit の接続性を表す)、QPU がサポートするベースゲート、ゲートのエラー率などの情報が含まれます。
これらのパラメーターの多くは、トランスパイルでよく使用されるパラメーター で詳しく説明されています。
QPU (Backend) パラメーター
Backend) パラメーターBackend パラメーター - backend を指定した場合、target やその他の Backend オプションを指定する必要はありません。同様に、target を指定した場合は、backend やその他の Backend オプションを指定する必要はありません。
backend(Backend) - これが設定されると、Transpiler は入力回路をこのデバイス向けにコンパイルします。coupling_mapなど、この設定に影響する他のオプションが設定されている場合は、backendの設定を上書きします。target(Target) - Backend の Transpiler ターゲット。通常は backend 引数の一部として指定されますが、Target オブジェクトを手動で構築した場合はここで指定できます。これはbackendのターゲットを上書きします。backend_properties(BackendProperties) - QPU から返されるプロパティで、ゲートエラー、読み出しエラー、Qubit のコヒーレンス時間などの情報を含みます。この情報を提供する QPU はbackend.properties()を実行して確認できます。timing_constraints(Dict[str, int] | None) - 命令の時間分解能に関するハードウェアの制約(オプション)。この情報は QPU の設定から提供されます。QPU が命令の時間割り当てに制約を持たない場合、timing_constraintsはNoneとなり、調整は行われません。QPU が報告する可能性のある制約には次のものがあります:granularity: dt 単位での最小パルスゲート分解能を表す整数値。ユーザー定義のパルスゲートは、この粒度値の倍数となる継続時間を持つ必要があります。min_length: dt 単位での最小パルスゲート長を表す整数値。ユーザー定義のパルスゲートはこの長さより長くなければなりません。pulse_alignment: ゲート命令の開始時刻の時間分解能を表す整数値。ゲート命令はこの値の倍数の時刻に開始する必要があります。acquire_alignment: 測定命令の開始時刻の時間分解能を表す整数値。測定命令はこの値の倍数の時刻に開始する必要があります。
レイアウトとトポロジーのパラメーター
basis_gates(List[str] | None) - 展開するベースゲート名のリスト。例:['u1', 'u2', 'u3', 'cx']。Noneの場合は展開しません。coupling_map(CouplingMap | List[List[int]]) - マッピングでターゲットとする有向カップリングマップ(カスタムも可)。カップリングマップが対称の場合、両方向を指定する必要があります。以下の形式がサポートされています:- CouplingMap インスタンス
- リスト - 隣接行列として指定する必要があり、各エントリが QPU でサポートされる有向 2-Qubit インタラクションをすべて指定します。例:[[0, 1], [0, 3], [1, 2], [1, 5], [2, 5], [4, 1], [5, 3]]
inst_map(List[InstructionScheduleMap] | None) - 回路操作からパルススケジュールへのマッピング。Noneの場合、QPU のinstruction_schedule_mapが使用されます。
Transpiler の動作に影響するパラメーター
これらのパラメーターは特定のトランスパイルステージに影響します。一部のパラメーターは複数のステージに影響す る場合がありますが、わかりやすさのために 1 つのステージのみに記載しています。使用したい Qubit の initial_layout など引数を指定した場合、その値はそれを変更する可能性のあるすべてのパスを上書きします。つまり、手動で指定したものは Transpiler によって変更されません。特定のステージの詳細については、Transpiler のステージ を参照してください。
初期化ステージ
hls_config(HLSConfig) -HighLevelSynthesis変換パスに直接渡されるオプションの設定クラスHLSConfig。この設定クラスを使用すると、さまざまな高レベルオブジェクトの合成アルゴリズムとそのパラメーターのリストを指定できます。init_method(str) - 初期化ステージで使用するプラグイン名。デフォルトでは外部プラグインは使用されません。インストール済みプラグインの一覧は、ステージ名引数にinitを指定してlist_stage_plugins()を実行することで確認できます。unitary_synthesis_method(str) - 使用するユニタリ合成メソッドの名前。デフォルトではdefaultが使用されます。インストール済みプラグインの一覧はunitary_synthesis_plugin_names()を実行することで確認できます。unitary_synthesis_plugin_config(dict) - ユニタリ合成プラグインに直接渡されるオプションの設定辞書。デフォルトのユニタリ合成メソッドはカスタム設定を受け付けないため 、デフォルトではこの設定は効果がありません。カスタム設定の適用が必要なのは、unitary_synthesis引数でユニタリ合成プラグインが指定されている場合に限ります。これは各ユニタリ合成プラグインに固有のため、このオプションの使い方についてはプラグインのドキュメントを参照してください。
レイアウトステージ
initial_layout(Layout | Dict | List) - 物理 Qubit 上の仮想 Qubit の初期配置。このレイアウトがcoupling_mapの制約と互換性がある場合に使用されます。Transpiler が SWAP などによって Qubit を入れ替える可能性があるため、最終的なレイアウトが同じになるとは限りません。詳細については、初期レイアウトのセクション を参照してください。layout_method(str) - レイアウト選択パスの名前(default、dense、sabre、trivial)。レイアウトステージで使用する外部プラグイン名を指定することもできます。インストール済みプラグインの一覧は、stage_name引数にlayoutを指定してlist_stage_plugins()を実行することで確認できます。デフォルト値はsabreです。
ルーティングステージ
routing_method(str) - ルーティングパスの名前(basic、lookahead、default、sabre、none)。ルーティングステージで使用する外部プラグイン名を指定することもできます。インストール済みプラグインの一覧は、stage_name引数にroutingを指定してlist_stage_plugins()を実行することで確認できます。デフォルト値はsabreです。
変換ステージ
translation_method(str) - 変換パスの名前(default、synthesis、translator、ibm_backend、ibm_dynamic_circuits、ibm_fractional)。変換ステージで使用する外部プラグイン名を指定することもできます。インストール済みプラグインの一覧は、stage_name引数にtranslationを指定してlist_stage_plugins()を実行することで確認できます。デフォルト値はtranslatorです。
最適化ステージ
approximation_degree(float、範囲 0-1 | None) - 回路近似に使用するヒューリスティックなダイヤル(1.0 = 近似なし、0.0 = 最大近似)。デフォルト値は 1.0 です。Noneを指定すると、報告されたエラー率に近似度が設定されます。詳細については 近似度のセクション を参照してください。optimization_method(str) - 最適化ステージで使用するプラグイン名。デフォルトでは外部プラグインは使用されません。インストール済みプラグインの一覧は、stage_name引数にoptimizationを指定してlist_stage_plugins()を実行することで確認できます。
スケジューリングステージ
scheduling_method(str) - スケジューリングパスの名前。スケジューリングステージで使用する外部プラグイン名を指定することもできます。インストール済みプラグインの一覧は、stage_name引数にschedulingを指定してlist_stage_plugins()を実行することで確認できます。- 'as_soon_as_possible': Qubit リソース上でできるだけ早く命令を貪欲にスケジュールします(エイリアス:
asap)。 - 'as_late_as_possible': 命令を遅くスケジュールします。つまり、可能な限り Qubit を基底状態に保ちます(エイリアス:
alap)。これがデフォルトです。
- 'as_soon_as_possible': Qubit リソース上でできるだけ早く命令を貪欲にスケジュールします(エイリアス:
Transpiler の実行
seed_transpiler(int) - Transpiler の確率的部分に使用する乱数シードを設定します。
上記のパラメーターをいずれも指定しない場合、以下のデフォルト値が使用されます。詳細については、メソッドの API リファレンスページ を参照してください:
generate_preset_pass_manager(
optimization_level=1,
backend=None,
target=None,
basis_gates=None,
coupling_map=None,
initial_layout=None,
layout_method=None,
routing_method=None,
translation_method=None,
scheduling_method=None,
approximation_degree=1.0,
seed_transpiler=None,
unitary_synthesis_method="default",
unitary_synthesis_plugin_config=None,
hls_config=None,
init_method=None,
optimization_method=None,
)
<qiskit.transpiler.passmanager.StagedPassManager at 0x7fa3e6dab110>
次のステップ
- 最適化レベルの設定 の方法を学びましょう。
- よく使用されるパラメーター をさらに確認しましょう。
- Qiskit Runtime を使用する際の最適化レベルの設定方法 を学びましょう。
- パスマネージャーを使ったトランスパイル のトピックを参照してください。
- 例については、量子コンピューターの表現 を参照してください。
- Qiskit Runtime を使った Qiskit パターンワークフローの一部として 回路のトランスパイル方法 を学びましょう。
- Transpile API ドキュメント を確認してください。