ジョブの監視またはキャンセル
このガイドでは、ジョブのステータスを監視し、使用状況情報を表示し、ジョブをキャンセルする方法について説明します。この情報には、IBM Quantum® Platform を通じても、Qiskit を使用してプログラムでもアクセスできます。
パッケージのバージョン
このページのコードは、以下の要件を使用して開発されました。 これらのバージョン以降を使用することをお勧めします。
qiskit-ibm-runtime~=0.46.1
ジョブを監視する
これらのメソッドを使用して、送信したジョブのステータスを確認し、結果を取得し、ジョブとその実行に関する詳細を表示します。
- Qiskit でジョブを監視する
- IBM Quantum Platform でジョブを監視する
job インスタンスは、監視のためのいくつかのメソッドを提供します。
| メソッド | 説明 |
|---|---|
job.status() | 現在のジョブ・ステータスを確認する |
job.job_id() | 一意のジョブ識別子を取得する |
job.result() | ジョブの結果を取得する(完了するまでブロックする呼び出し) |
job.wait_for_final_state() | ジョブが終了状態に達するまでブロックする |
Workloads ページ に移動し、Status 列を確認します。ジョブのステータスは次のいずれかで表示されます。
- Pending:ジョブは QPU での実行を待機しています
- In progress:ジョブは現在実行中です
- Completed:ジョブは正常に終了しました
- Failed:ジョブでエラーが発生しました
- Canceled:ユーザーがジョブをキャンセルしました
ジョブ名または行をクリックすると詳細ビューが開き、結果やエラーメッセージなどの情報を確認できます。
ジョブが「In progress」のままである理由
数秒しかかからないはずのジョブ(job modeまたはbatch modeのいずれを使用している場合でも)が、(Qiskit では RUNNING と呼ばれる)In progress ステータスに、想定よりもはるかに長くとどまっていることに気づくかもしれません。これは正常であり、ジョブがその全時間を使用量として消費していることを意味するわけではありません。これは、ジョブが QPU にスケジュールされる仕組みによるものです。
-
すべてのジョブは、QPU で実行される前に古典的な前処理を必要とします。ジョブは、この古典処理が開始されるとすぐに In progress(
RUNNING)に移行します。QPU での実行が開始されたときではありません。 -
この古典処理の大部分は並列に実行されるため、複数のジョブが同時に In progress になることがあります。
-
ただし、QPU で一度に実行できるジョブは1つだけです。複数のジョブが古典処理を終えて実行の準備が整うと、それらは QPU の順番待ちをする必要があります。これは QPU コンテンション と呼ばれます。コンテンションが高い場合、ジョブは実際に必要とする数秒の QPU 時間よりも顕著に長く In progress のままになることがあります。
-
コンテンションは、キャリブレーションなどのシステムメンテナンスタスクが QPU 上で実行されている場合にも発生することがあります。メンテナンスタスクが完了し QPU が利用可能になるまで、ジョブは In progress のままになります。
このため、ジョブが In progress で費やす経過時間(壁時計時間)は、その使用量とは異なります。推定使用量 と 最大実行時間 はいずれも、QPU がジョブの実行のためにロックされている時間のみに基づいており、そのため上記のマルチスレッド古典処理は除外されます。In progress の時間が長くても、報告される使用量やコストが増加するわけではありません。
session modeは異なります
前述の動作は、job mode と batch mode に適用されます。session mode では、セッションのアクティブなウィンドウ中、ユーザーは backend への排他的アクセス権を持ち、キャリブレーションジョブを含む他のジョブは実行できません。したがって、QPU コンテンションが発生するのは、自分自身のセッションジョブ間のみです。さらに、QPU の容量はセッションの期間中予約されるため、セッションの使用量は、ジョブが実際に実行されているかどうかにかかわらず、セッションがアクティブである間の経過時間として測定されます。詳細については、ワークロードの使用量 を参照してください。
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"qiskit_ibm_runtime": "qiskit-ibm-runtime"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
# Retrieve a job by ID
job = service.job("<job_id>")
# Get job ID (useful for saving for later retrieval)
print(f"Job ID: {job.job_id()}")
# Check current status
print(f"Status: {job.status()}")
# Wait for job to complete (blocking call)
job.wait_for_final_state()
print("Job completed")
# Get results
results = job.result()
print(results)
残り使用量を確認する
プランの使用量クォータの残りを追跡します。
- Qiskit で使用量を確認する
- IBM Quantum Platform で使用量を確認する
service.usage() メソッドを使用して、現在アクティブなインスタンスの使用状況情報を取得します。
Instances ページ に移動し、確認したいプランに対応するタブを選択してください。プランの合計使用時間と残り時間が表示されます。
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
# Get usage information for the current active instance
usage = service.usage()
print(usage)
ジョブメトリクスを表示する
バッチおよびセッションのワークロードメトリクスを含む、ジョブ送信の概要を取得します。
- Qiskit でジョブメトリクスを取得する
- IBM Quantum Platform でジョブメトリクスを表示する
service.jobs() メソッドをフィルターとともに使用して、送信したジョブに関する情報(送信されたジョブの数、そのステータス、作成日時など)を取得します。以下の例では、過去7日間に送信されたすべてのジョブを取得し、それらのジョブの合計使用量を計算します。
Analytics ページ に移動して、次のようなデータを確認・ダウンロードできます。
- 合計使用量
- インスタンス、量子コンピューター、ユーザーでフィルタリングされた使用量
- ジョブ、バッチ、セッションワークロードの数
注:Analytics ページには、自分が所有または管理しているアカウントについてのみアクセスできます。
from datetime import datetime, timedelta
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
# Retrieve all jobs in the last 7 days
seven_days_ago = datetime.now() - timedelta(days=7)
jobs = service.jobs(limit=None, created_after=seven_days_ago)
# To retrieve all jobs in a Session or Batch, use the session_id filter
# jobs = service.jobs(session_id="<session id>")
total_usage = 0
for job in jobs:
total_usage += job.usage()
print(f"{len(jobs)} jobs were submitted in the last 7 days.")
print(f"Total usage was {total_usage} seconds")
後でジョブ結果を取得する
ジョブ ID を保存しておけば、セッションを終了した後でも結果を後から取得できます。
- Qiskit で結果を取得する
- IBM Quantum Platform で結果を取得する
ジョブを送信したときにジョブ ID を保存していた場合は、service.job(<job_id>) を使用して後で取得します。ジョブ ID がない場合や、複数のジョブを一度に取得したい場合(廃止された QPU からのジョブを含む)は、代わりにオプションのフィルターを指定して service.jobs() を使用してください。
利用可能なフィルターについては、QiskitRuntimeService.jobs の API ドキュメントを参照してください。
この例では、特定の backend で実行された最近の結果を取得する方法を示します。
- Workloads ページ に移動します。
- 検索またはフィルターオプションを使用して、名前、日付、またはステータスでジョブを見つけます。
- ジョブをクリックして、その結果と詳細を表示します。
Backend のプロパティを取得する
- Qiskit で backend のプロパティを取得する
- IBM Quantum Platform で backend のプロパティを取得する
job.properties() を使用して、ジョブの実行時点のエラー率などの backend プロパティを取得できます。
この例では、特定の qubit(0)についての / 時間とエラー率を含め、ジョブが実行された時点で有効だった backend プロパティを取得する方法を示します。
service.jobs() は、非推奨の qiskit-ibm-provider パッケージから実行されたジョブも返します。より古い(同様に非推奨の)qiskit-ibmq-provider パッケージによって送信されたジョブは、もはや利用できません。
ジョブの実行時点だけでなく、ジョブの作成時点における backend のキャリブレーションデータも確認できます。
- Workloads ページ に移動します
- ワークロードをクリックして詳細ページを開きます
- Quantum computer の項目の下にある「View calibration history」をクリックします
- ドロップダウンメニューを使用して、表示するデータを「At job execution start」から「At job creation」に切り替えます
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
# Uncomment the next line to retrieve a specific job by ID
# job = service.job("<job_id>")
# Optionally retrieve multiple jobs with filters
# Use `limit` to retrieve a specific number of jobs. The default `limit` is 10.
my_backend = "<your-backend>"
recent_jobs = service.jobs(backend_name=my_backend, limit=10)
print(f"Retrieved {len(recent_jobs)} recent jobs from {my_backend}\n")
# Get results from all jobs
for job in recent_jobs:
print(f"Job ID: {job.job_id()}")
print(f"Status: {job.status()}")
# Retrieve results if the job is complete
if str(job.status()) == "DONE":
try:
results = job.result()
print(f"Results: {results}")
except Exception as e:
print(f"Error retrieving results: {e}")
else:
print("Results: Not available (job still running or failed)")
print()
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
# Retrieve a specific job by ID
job = service.job("<job_id>")
print(f"Job ID: {job.job_id()}")
print(f"Backend: {job.backend}\n")
# Fetch backend properties at the time of job execution
properties = job.properties()
if properties:
print("Backend Properties at Job Execution Time:")
print("=" * 60)
# Get T1 (relaxation time) for qubit 0
t1 = properties.t1(0)
print(f"Qubit 0 T1 (relaxation time): {t1}")
# Get T2 (dephasing time) for qubit 0
t2 = properties.t2(0)
print(f"Qubit 0 T2 (dephasing time): {t2}")
# Get readout error for qubit 0
readout_error = properties.readout_error(0)
print(f"Qubit 0 readout error: {readout_error}")
# Get all properties for a specific qubit
print("All properties for qubit 0:")
qubit_props = properties.qubit_property(0)
for prop_name, prop_value in qubit_props.items():
print(f" {prop_name}: {prop_value}")
else:
print("No properties available for this job")
ジョブをキャンセルする
キューに入っている、または実行中のジョブをキャンセルします。ジョブが一度キャンセルされると、再開することはできません。
- Qiskit でキャンセルする
- IBM Quantum Platform でキャンセルする
job.cancel() メソッドを使用して、プログラムでジョブをキャンセルします。
- ワークロードテーブルから:キャンセルしたいワークロードの行末にあるオーバーフローメニューをクリックし、Cancel を選択します。
- ジョブ詳細ページから:ワークロードをクリックして詳細ページを開き、上部の Actions ドロップダウンを使用して Cancel を選択します。
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
# Retrieve the job
job = service.job("<job_id>")
# Cancel the job
job.cancel()
print(f"Job {job.job_id()} has been canceled")
次のステップ
- 追加のジョブ管理メソッドについては、
QiskitRuntimeServiceAPI リファレンス を確認してください。 - バッチおよびセッションワークロードの種類を理解するには、実行モード を参照してください。