ドライランジョブ
ドライランジョブは、QPU時間を使用せずに、IBM Quantum® Compute Service を通じてワークロードを実行します。実際に実行する前に、ドライランジョブを使用して次のことができます。
-
**実際のQPUでジョブが消費する使用量を取得します。
-
ジョブを検証します。 Quantum Compute は、実際のジョブと同様にジョブのパラメータをチェックします。
-
回路タイミングスケジュールを取得します(リクエストした場合)。実際に実行する前にジョブをデバッグできます。
ドライランジョブとは異なり、ローカルテスト(フェイク・バックエンドと Qiskit Aer)はお使いのマシン上で実行されるため、使用量、サービス側の検証、サービスのタイミング情報は提供できません。2つのアプローチの比較については、モックデバイスとフェイク・バックエンドの比較を参照してください。
- ドライランジョブには
qiskit-ibm-runtimev0.51.0 以降が必要です。 - ドライランジョブはすべてのリージョンで利用できますが、Flex、Premium、On-Prem プランでのみ利用できます。Open プランおよび Pay-As-You-Go プランでは利用できません。
仕組み
ドライランジョブを実行するには、プリミティブの run() メソッドに dry_run=True を渡します。
backend = service.backend("ibm_phoenix")
isa_circuit = pm.run(circuit) # transpiled for ibm_phoenix
sampler = Sampler(mode=backend)
job = sampler.run([isa_circuit], dry_run=True)
job.result() # wait for completion
print(job.usage())
dry_run は run() メソッドの引数であり(デフォルトは False)、ランタイムオプションではありません。すべてのプリミティブで利用できます。
ドライランジョブには次の特徴があります。
-
お使いのマシンではなく、クラウド上の IBM Quantum Compute Service で実行されます。
-
スナップショットだけでなく、実際のQPUのキャリブレーションデータを使用します。
-
結果は想定されるスキーマを保ち、実際のQPUからの結果の想定される形状に従いますが、ランダム化されたモックデータを含みます。実際の測定結果やシミュレートされた測定結果ではないため、物理的な正しさの確認には使用しないでください。
-
処理はサーバー上で行われるため、ジョブがすぐに完了しない場合があります。
回路サイズ、ショット数、その他の制限は、そのプログラムの通常のジョブと同じです。
バックエンドがすでにモックデバイスである場合でも、dry_run=True は機能します。
使用量の確認
完了したドライランジョブの使用量は、同じジョブが実際のQPUで消費する使用量と同じです。ただし、ドライランジョブの後、実際のQPUでのジョブの前にキャリブレーションデータが大きく変化するまれなケースは除きます。
-
job.usage()は使用量を秒単位で返します。 -
job.metrics()["usage"]は、使用量のステータスとともに同じデータを返します。
ドライランの使用量には課金されず、プランの割り当てを消費せず、いかなる制限にもカウントされません。
ドライランジョブで job.usage_estimation を使用しないでください。job.usage() を使用してください。
job.usage() は使用量の計算が確定するまで 0 を返すため、読み取る前にジョブの完了を待ってください。
回路タイミングスケジュール
回路タイミングスケジュールをリクエストするには、実際のジョブと同じオプションを使用します。詳細については、回路タイミングの可視化を参照してください。
制限事項
-
job mode と batch mode のみ。 ドライランジョブは job mode と batch mode でのみ実行できます。
-
Flex、Premium、On-Prem プランのみ。 ドライランジョブは Open プランおよび Pay-As-You-Go プランでは利用できません。
モックデバイス
モックデバイスはドライランジョブの裏側の実装です。ドライランジョブはデフォルトでモックデバイスを表示しませんが、次のような場合には目にすることがあります。
-
モックデバイスのみにアクセスするよう構成されたインスタンス。 例:
service.backend("ibm_phoenix")を使用してibm_phoenixでドライランジョブを送信しようとしても、インスタンスがibm_phoenixにアクセスできない場合は、QiskitBackendNotFoundErrorが発生します。その場合は、service.backend("mock_phoenix")でモックデバイスを直接選択してください。 -
Compute resources。 モックデバイスは、Compute resources ページではデフォルトで非表示です。ページ上の表にはモックデバイスを含めるフィルターオプションがありますが、モックデバイスにアクセスできるのは Flex、Premium、On-Prem プランのみです。
-
Workloads の表。 モックデバイスからのジョブは、Workloads ページではデフォルトで非表示です。表には、それらを表示するためのフィルターオプション(漏斗アイコン)があります。
-
Python API。
service.backends()とservice.jobs()は、include_mocks=Trueを指定して呼び出さない限り、モックデバイスを除外します。IBMBackend.is_mockは、バックエンドがモックデバイスかどうかを示します。service.least_busy()がモックデバイスを返すことはありません。
モックデバイスとフェイク・バックエンドの比較
名前は似ていますが、モックデバイスとフェイク・バックエンドは異なるものです。フェイク・バックエンドは、お使いのPython環境内のローカルなオブジェクトです。モックデバイスは、IBM Quantum Compute Service 内のクラウドリソースです。
モックデバイス(例:mock_phoenix) | フェイク・バックエンド(例:FakeManilaV2) | |
|---|---|---|
| 概要 | IBM Quantum Compute Service 内のデバイス | qiskit_ibm_runtime.fake_provider 内のPythonクラス |
| 実行場所 | クラウド(サービス内) | ローカル(お使いのマシン上) |
| 取得方法 | service.backend("mock_phoenix")、または run(..., dry_run=True) による自動取得 | from qiskit_ibm_runtime.fake_provider import ... |
| アカウントとインスタンス | 特定のプランのみ(Flex、Premium、On-Prem) | すべてのインスタンスとプラン |
| キャリブレーション | ライブデータで、常に実際のデバイスと一致 | インストールされたパッケージに同梱された固定スナップショット |
| 結果 | 想定されるスキーマを持つランダム化されたデータ。シミュレーションではない | スナップショットのノイズモデルを使用したノイズありシミュレーション |
| 物理的に意味のある結果 | いいえ。正しさの確認には使用しないでください | ノイズモデルの範囲内でおおよそ有意 |
| 使用量の報告 | あり | なし |
| 課金、またはプランの割り当てや制限へのカウント | なし | なし |
| ジョブの検証 | 実際のジョブと同様に、サービスが実施 | クライアントがチェックする範囲に限られる |
| タイミングスケジュール | リクエストにより利用可能 | 利用不可 |
| 実行モード | job mode と batch mode のみ。Session はブロックされる | Session の構文は受け付けられるが無視される(ローカルモードには実際のSessionやバッチがない) |
| 完了 | サーバー上で非同期に処理 | ローカルで実行され、完了時に返される |
| プラットフォームのインターフェースとAPIの一覧での表示 | デフォルトでは非表示(Compute resources、Workloads の表、backends()、jobs())。オプトインで表示 | 表示されない(サービスには何も送信されないため) |
選び方
-
ジョブがどれだけの使用量を消費するか、またはサービスがそれを受け付けるかを知りたい場合は、ドライランジョブを使用します。
-
出力がどのようになるかを知りたい場合や、オフラインで作業したい場合は、フェイク・バックエンドまたは Aer を使用します。
-
その両方を行うには、フェイク・バックエンドで回路と結果を反復的に改善し、実際のQPUの前の最終チェックとしてドライランを実行します。
よくある混同点
-
モックデバイスはシミュレーターではありません。 出力はランダムであるため、
mock_phoenixでBell回路をサンプリングしても、Bell分布は返されません。現実的なノイズありの出力が必要な場合は、フェイク・バックエンドを使用してください。 -
フェイク・バックエンドはライブのデバイスではありません。 そのキャリブレーションはスナップショットであり、古くなっている場合があります。モックデバイスは実際のキャリブレーションを追跡するため、トランスパイルされた回路とタイミングは、QPUが現在扱うものと一致します。
-
どちらも実際のハードウェアでは実行されません。 どちらもQPU時間を消費しませんが、サービスを経由するのはドライランジョブだけです。
-
usage_estimationはドライランの見積もりではありません。 ドライランジョブでは、job.usage()が、実際のQPUでジョブに課金される使用量(秒)を返します。
ユースケース
学生とコース
管理者は、インスタンスの作成または編集時にQPUカスタマイズのトグルを使用して、インスタンスをモックデバイスのみに制限します。これにより学生は、実際のQPU時間やRUを消費することなく、ペイロードをエンドツーエンドで検証できます。インスタンスはモックデバイスにのみアクセスできるため、学生はモック名でバックエンドを選択します。
backend = service.backend("mock_phoenix")
sampler = Sampler(mode=backend)
job = sampler.run([isa_circuit], dry_run=True)
プロジェクトの計画
プロジェクトを開始しようとしているチームは、プランや割り当てを選択する前に、代表的なジョブをドライランして、プロジェクトに必要なRUを確認します。
backend = service.backend("ibm_phoenix")
sampler = Sampler(mode=backend)
job = sampler.run([isa_circuit], dry_run=True)
job.result()
print(job.usage())
実際のQPUで実行する前の最終チェック
dry_run=True でパラメータを検証し、タイミングスケジュールを確認してから、その引数を外して実際のQPUで実行します。コードの他の部分は変更する必要がありません。
sampler = Sampler(mode=backend)
# Pre-flight check
job = sampler.run([isa_circuit], dry_run=True)
job.result()
# Real run - same code, without dry_run
job = sampler.run([isa_circuit])
次のステップ
- ローカルテストモードで、お使いのマシン上でプログラムをテストします。
- ワークロードの使用量がどのように測定されるかを学びます。
- 回路タイミングスケジュールを可視化します。
- リソース単位と利用可能なプランを理解します。