ジョブをバッチで実行する
このページ上のコードは、以下の要件に基づいて開発されました。 これらのバージョンまたはそれ以降のバージョンを使用することを推奨します。
qiskit[all]~=2.3.0 qiskit-ibm-runtime~=0.43.1
バッチモードを使用して、複数のプリミティブジョブを同時に送信します。 以下は、バッチの使用例である。
バッチを使用する設定
バッチを開始する前に、 IBM Quantum Compute クライアントを設定し、サービスとして初期化する必要があります
from qiskit_ibm_runtime import (
QiskitRuntimeService,
Batch,
SamplerV2 as Sampler,
EstimatorV2 as Estimator,
Executor,
)
service = QiskitRuntimeService()バッチを開く
コンテキスト・マネージャー with Batch(...) を使うか、あるいは Batch クラスを初期化することで開くことができます。 バッチを開始する際には、 backend オブジェクトを渡して QPU を指定する必要があります。 バッチは、最初のジョブが実行を開始した時点で開始される。
バッチクラス
backend = service.least_busy(operational=True, simulator=False)
batch = Batch(backend=backend)
estimator = Estimator(mode=batch)
sampler = Sampler(mode=batch)
executor = Executor(mode=batch)
# Close the batch because no context manager was used.
batch.close()コンテキスト・マネージャー
コンテキストマネージャーは自動的にバッチを開いたり閉じたりする。
from qiskit_ibm_runtime import (
Batch,
SamplerV2 as Sampler,
EstimatorV2 as Estimator,
Executor,
)
backend = service.least_busy(operational=True, simulator=False)
with Batch(backend=backend):
estimator = Estimator()
sampler = Sampler()
executor = Executor()バッチ長
max_time パラメータでバッチの最大生存時間(TTL)を定義できる。 これは、最長ジョブの実行時間を上回るはずである。 このタイマーは、バッチが開始されたときにスタートする。 その値に達すると、そのバッチは終了する。 実行中のジョブはすべて終了するが、キューに残っているジョブは失敗する。
with Batch(backend=backend, max_time="25m"):
...また、設定できないインタラクティブ・タイム・トゥ・ライブ(インタラクティブTTL)値もある(すべてのプランで1分)。 そのウィンドウ内にバッチジョブがキューに入っていない場合、バッチは一時的に無効化される。
デフォルトの最大TTL値:
インスタンス・タイプ | デフォルトの最大TTL |
|---|---|
| すべての有料プラン | 8 時間 |
| 開く | 10 分間 |
バッチの最大TTLまたは対話的TTLを決定するには、「 バッチの詳細を決定する 」の指示に従い、それぞれ max_time または interactive_timeout の値を探す。
バッチを閉じる
コンテキストマネージャーを終了すると、バッチは自動的に終了する。 バッチコンテキストマネージャーが終了すると、バッチは「進行中、新規ジョブは受け付けない」ステータスになる。 これは、最大TTL値に達するまで、実行中またはキューに入っているすべてのジョブの処理をバッチが終了することを意味する。 すべてのジョブが完了すると、バッチは直ちに閉じられる。 閉じたバッチにジョブを投入することはできません。
以下のコードでは、Estimator や Sampler の PUB、およびバックエンドなど、独自の情報を指定する必要があります。
with Batch(backend=backend) as batch:
estimator = Estimator()
sampler = Sampler()
job1 = estimator.run([estimator_pub])
job2 = sampler.run([sampler_pub])
# The batch is no longer accepting jobs but the submitted job will run to completion.
result = job1.result()
result2 = job2.result()コンテキストマネージャーを使用していない場合は、手動でバッチを閉じる。 バッチを開いたままにしておいて、後でさらにジョブを投入すると、後続のジョブが実行を開始する前に最大TTLに達してしまい、キャンセルされる可能性がある。 バッチへのジョブ投入が終わったら、すぐにバッチを閉じることができる。 バッチが batch.close() で閉じられると、新しいジョブは受け付けられなくなるが、すでに投入されたジョブは完了するまで実行され、その結果を取り出すことができる。
batch = Batch(backend=backend)
# If using qiskit-ibm-runtime earlier than 0.24.0, change `mode=` to `batch=`
estimator = Estimator(mode=batch)
sampler = Sampler(mode=batch)
job1 = estimator.run([estimator_pub])
job2 = sampler.run([sampler_pub])
print(f"Result1: {job1.result()}")
print(f"Result2: {job2.result()}")
# Manually close the batch. Running and queued jobs will run to completion.
batch.close()Output:
Result1: PrimitiveResult([PubResult(data=DataBin(evs=np.ndarray(<shape=(3, 2), dtype=float64>), stds=np.ndarray(<shape=(3, 2), dtype=float64>), ensemble_standard_error=np.ndarray(<shape=(3, 2), dtype=float64>), shape=(3, 2)), metadata={'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32})], metadata={'dynamical_decoupling': {'enable': False, 'sequence_type': 'XX', 'extra_slack_distribution': 'middle', 'scheduling_method': 'alap'}, 'twirling': {'enable_gates': False, 'enable_measure': True, 'num_randomizations': 'auto', 'shots_per_randomization': 'auto', 'interleave_randomizations': True, 'strategy': 'active-accum'}, 'resilience': {'measure_mitigation': True, 'zne_mitigation': False, 'pec_mitigation': False}, 'version': 2})
Result2: PrimitiveResult([SamplerPubResult(data=DataBin(meas=BitArray(<shape=(3, 2), num_shots=4096, num_bits=2>), meas0=BitArray(<shape=(3, 2), num_shots=4096, num_bits=133>), shape=(3, 2)), metadata={'circuit_metadata': {}})], metadata={'execution': {'execution_spans': ExecutionSpans([DoubleSliceSpan(<start='2026-02-15 07:58:55', stop='2026-02-15 07:59:02', size=24576>)])}, 'version': 2})
バッチの詳細を決定する
対話型や最大TTLなど、バッチの設定やステータスの包括的な概要については、 batch.details() method。
from qiskit_ibm_runtime import (
QiskitRuntimeService,
batch,
SamplerV2 as Sampler,
)
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)
with Batch(backend=backend) as batch:
print(batch.details())Output:
{'id': '970fe01d-d2cf-45f0-b32b-f886b987a462', 'backend_name': 'ibm_torino', 'interactive_timeout': 1, 'max_time': 28800, 'active_timeout': 28800, 'state': 'open', 'accepting_jobs': True, 'last_job_started': None, 'last_job_completed': None, 'started_at': None, 'closed_at': None, 'activated_at': None, 'mode': 'batch', 'usage_time': None}
並列処理のためにジョブを再構成する
バッチ処理による並列処理を利用するためにジョブを再構成する方法は複数あります。 次の例では、長い回路リストを複数のジョブに分割し、バッチとして実行することで並列処理を利用する方法を示しています。
from qiskit_ibm_runtime import SamplerV2 as Sampler, Batch
from qiskit.circuit.random import random_circuit
max_circuits = 100
circuits = [pm.run(random_circuit(5, 5)) for _ in range(5 * max_circuits)]
for circuit in circuits:
circuit.measure_active()
all_partitioned_circuits = []
for i in range(0, len(circuits), max_circuits):
all_partitioned_circuits.append(circuits[i : i + max_circuits])
jobs = []
start_idx = 0
with Batch(backend=backend):
sampler = Sampler()
for partitioned_circuits in all_partitioned_circuits:
job = sampler.run(partitioned_circuits)
jobs.append(job)プリミティブ内で を backend=backend 設定すると、バッチまたはセッションコンテキスト内であっても、プログラムはジョブモードで実行されます。 Qiskit Runtime 以降、設定 backend=backend は非推奨となりました。 v0.24.0 代わりに、パラメータ mode を使用してください。
次のステップ
- 「 エラー軽減オプションとEstimatorプリミティブの組み合わせ 」チュートリアルにある例を試してみてください。
- Batch API リファレンスを確認する。
- IBM® のQPUにジョブを送信する際は、ジョブの制限事項を理解しておく必要があります。
- 実行モードに関するよくある質問を確認する。