トランスパイラ向けの量子コンピュータを表現する
このページのコードは、以下の要件に基づいて開発された。 これらのバージョンまたは新しいバージョンの使用をお勧めします。
qiskit[all]~=2.5.1 qiskit-ibm-runtime~=0.47.0
抽象回路を特定のQPU(量子プロセッシング・ユニット)上で動作するISA回路に変換するには、トランスパイラがQPUに関する特定の情報を必要とする。 この情報は、ジョブの投入を計画している BackendV2 (またはレガシー BackendV1) オブジェクトと、バックエンドの Target 属性の2箇所にあります。
- デバイスコンテナには、デバイス
Targetに関連するすべての制約が含まれます。これには、サポートされている命令セット、量子ビットの接続性、パルスやタイミング情報などが含まれます。 - デフォルト
Targetで をBackend保持し、追加情報(例:)を含み、量子回路ジョブの提出InstructionScheduleMapインターフェースを提供する。
また、特定のユースケースがある場合や、トランスパイラがより最適化された回路を生成するのに役立つと思われる場合など、トランスパイラが使用する情報を明示的に提供することもできます。
トランスパイラが特定のハードウェアに最適な回路を生成する精度は、 Target または Backend がその制約に関する情報をどれだけ持っているかに依存します。
基礎となる移調アルゴリズムの多くは確率的であるため、より良い回路が見つかる保証はない。
このページでは、QPU情報をトランスパイラに渡すいくつかの例を紹介します。
デフォルト構成
トランスパイラの最も単純な使い方は、 Backend または Target を提供することで、すべてのQPU情報を提供することである。 トランスパイラがどのように機能するかをよりよく理解するために、次のように回路を構成し、異なる情報でトランスパイルする。
必要なライブラリをインポートし、QPUをインスタンス化する: 抽象回路を特定のプロセッサ上で動作するISA回路に変換するために、トランスパイラにはプロセッサに関する特定の情報が必要です。 通常、この情報は Backend または Target に格納され、それ以上の情報は必要ない。 ただし、特定のユースケースがある場合や、トランスパイラがより最適化された回路を生成するのに役立つと思われる場合など、トランスパイラが使用する情報を明示的に提供することもできます。
このトピックでは、トランスパイラに情報を渡すいくつかの例を紹介します。
これらの例では、 qiskit_ibm_runtimeFakeSherbrooke モックバックエンドのターゲットを使用しています。 ただし、Qiskitと互換性のある実機またはシミュレータであれば、どのバックエンドでも試すことができます。 実際の結果は異なる場合があります。
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke
backend = FakeSherbrooke()
target = backend.target回路例では efficient_su2 のインスタンスを使用する。
from qiskit.circuit.library import efficient_su2
qc = efficient_su2(12, entanglement="circular", reps=1)
qc.draw("mpl")Output:
この例では、デフォルトの設定を使用して、 backend の target にトランスパイルしている。これは、回路をバックエンドで動作するものに変換するために必要なすべての情報を提供するものである。
from qiskit.transpiler import generate_preset_pass_manager
pass_manager = generate_preset_pass_manager(
optimization_level=1, target=target, seed_transpiler=12345
)
qc_t_target = pass_manager.run(qc)
qc_t_target.draw("mpl", idle_wires=False, fold=-1)Output:
この例は、このトピックの後半セクションで、最適な回路構築のためにトランスパイラに渡すべき必須情報として、結合マップとサポートされる命令セットが挙げられることを示すために使用される。 QPUは通常、タイミングやスケジューリングなど、渡されないその他の情報についてデフォルト設定を選択できます。
結合マップ
カップリング・マップは、どの量子ビットが連結しているかを示すグラフであり、したがってそれらの間に2量子ビットのゲートがある。 つまり、2量子ビットのゲートは一方向にしか進まない。 しかしトランスパイラーは、1量子ビットのゲートを追加することで、いつでもゲートの方向を反転させることができる。 SWAPゲートを導入して量子情報を移動させれば、接続性が制限されていても、抽象的な量子回路は常にこのグラフ上で表現できる。
抽象回路から得られる量子ビットは仮想量子ビットと呼ばれ、結合マップ上の量子ビットは物理量子ビットである。 トランスパイラーは、仮想量子ビットと物理量子ビットの間のマッピングを提供する。 移籍の最初のステップのひとつであるレイアウト段階で、このマッピングが行われる。
ルーティング・ステージはレイアウト・ステージ (実際の量子ビットを選択するステージ)とデフォルトでは絡み合っているが、このトピックでは簡単にするために別々のステージとして扱う。 配線とレイアウトの組み合わせは、 量子ビット・マッピングと呼ばれる。 これらのステージの詳細については、 Transpiler stagesのトピックを参照してください。
coupling_map キーワードを引数に渡すと、トランスパイラへの影響を見ることができる:
coupling_map = target.build_coupling_map()
pass_manager = generate_preset_pass_manager(
optimization_level=0, coupling_map=coupling_map, seed_transpiler=12345
)
qc_t_cm_lv0 = pass_manager.run(qc)
qc_t_cm_lv0.draw("mpl", idle_wires=False, fold=-1)Output:
上に示したように、複数のSWAPゲート(それぞれ3つのCXゲートで構成)が挿入されており、現在のデバイスでは多くのエラーが発生する。 実際の量子ビットトポロジー上でどの量子ビットが選択されているかを見るには、Qiskit Visualizationsの plot_circuit_layout :
from qiskit.visualization import plot_circuit_layout
plot_circuit_layout(qc_t_cm_lv0, backend, view="physical")Output:
これは、我々の仮想量子ビット0-11が物理量子ビット0-11のラインに些細なことでマッピングされたことを示している。 optimization_level=1ルーティングが必要な場合は VF2Layout 。
pass_manager = generate_preset_pass_manager(
optimization_level=1, coupling_map=coupling_map, seed_transpiler=12345
)
qc_t_cm_lv1 = pass_manager.run(qc)
qc_t_cm_lv1.draw("mpl", idle_wires=False, fold=-1)Output:
これでSWAPゲートが挿入されなくなり、選択される物理量子ビットは target 。
from qiskit.visualization import plot_circuit_layout
plot_circuit_layout(qc_t_cm_lv1, backend, view="physical")Output:
これでレイアウトはリング状になった。 このレイアウトは回路の接続性を尊重しているため、SWAPゲートは存在せず、実行回路としてははるかに優れている。
サポートされている命令
すべての量子コンピュータは、限られた命令セットをサポートする。 回路内のすべてのゲートは、この集合の要素に変換されなければならない。 このゲートセットは、単一量子ビットゲートと二量子ビットゲートで構成されるべきであり、それらが普遍ゲートセットを提供する。つまり、あらゆる量子操作がそれらのゲートに分解できることを意味する。 これは BasisTranslatorによって行われ、この情報を提供するためにトランスパイラへのキーワード引数として指定できます basis_gates 。
basis_gates = list(target.operation_names)
print(basis_gates)Output:
['sx', 'switch_case', 'if_else', 'rz', 'for_loop', 'ecr', 'id', 'reset', 'measure', 'x', 'delay']
のデフォルトの1量子 FakeSherbrooke ビットゲートは rz、 x、 であり sx、デフォルトの2量子ビットゲートは (エコー・クロス ecr 共鳴)である。 CXゲートはゲート ecr から構成されているため、QPUによっては ecr が2量子ビット基底ゲートとして指定される一方、他のQPUでは cx がデフォルトとなっている。 ゲート ecr は、ゲートの*絡み合う *cx 部分である。 制御ゲートに加えて、および measurement 命令 delay もあります。
QPUにはデフォルトの基底ゲートがありますが、命令を提供するかパルスゲートを追加すれば、任意のゲートを選択できます( トランスペイラパスの作成を参照) デフォルトの基底ゲートとは、QPU上でキャリブレーションが完了しているゲートを指すため、追加の命令/パルスゲートを提供する必要はない。 例えば、一部のQPUではデフォルトの2 cx 量子ビットゲートはであり、他のQPUでは ecr である。 詳細については、利用可能なネイティブゲートと演算の一覧を参照してください。
pass_manager = generate_preset_pass_manager(
optimization_level=1,
coupling_map=coupling_map,
basis_gates=basis_gates,
seed_transpiler=12345,
)
qc_t_cm_bg = pass_manager.run(qc)
qc_t_cm_bg.draw("mpl", idle_wires=False, fold=-1)Output:
オブジェクト CXGate はゲートと単一量子ビット ecr 基底ゲートに分解されていることに注意してください。
デバイスエラー率
Target クラスは、デバイスに対する操作のエラー率に関する情報を含むことができる。
例えば、以下のコードはqubit 1と0の間のエコー交差共鳴(ECR)ゲートのプロパティを取得します(ECRゲートは指向性であることに注意してください):
target["ecr"][(1, 0)]Output:
InstructionProperties(duration=5.333333333333332e-07, error=0.007494257741828603)
出力には、ゲートの継続時間(秒)とエラー率が表示される。 トランスパイラにエラー情報を提供するには、上記の basis_gates と coupling_map を使ってターゲットモデルを構築し、バックエンド FakeSherbrooke からのエラー値を入力します。
from qiskit.transpiler import Target
from qiskit.circuit.controlflow import IfElseOp, SwitchCaseOp, ForLoopOp
err_targ = Target.from_configuration(
basis_gates=basis_gates,
coupling_map=coupling_map,
num_qubits=target.num_qubits,
custom_name_mapping={
"if_else": IfElseOp,
"switch_case": SwitchCaseOp,
"for_loop": ForLoopOp,
},
)
for i, (op, qargs) in enumerate(target.instructions):
if op.name in basis_gates:
err_targ[op.name][qargs] = target.instruction_properties(i)新しいターゲット err_targ をターゲットとしたトランスパイル:
pass_manager = generate_preset_pass_manager(
optimization_level=1, target=err_targ, seed_transpiler=12345
)
qc_t_cm_bg_et = pass_manager.run(qc)
qc_t_cm_bg_et.draw("mpl", idle_wires=False, fold=-1)Output:
ターゲットにはエラー情報が含まれているため、 VF2PostLayout パスでは使用する最適な量子ビットを見つけようとし、その結果、同じ物理量子ビットで元々見つかっていた回路と同じ回路ができる。
次のステップ
- トランスパイラルのデフォルト設定と構成オプションを理解する。
- トランスピレーションでよく使用されるパラメータ 」のトピックを確認してください。
- トランスパイラ設定の比較ガイドをお試しください。
- Transpile API ドキュメントを参照してください。