ジョブの監視またはキャンセル
このガイドでは、ジョブのステータスを確認する方法、使用状況情報を表示する方法、およびジョブをキャンセルする方法について説明します。 この情報には、 IBM Quantum® Platform からアクセスできるほか、Qiskit を使用してプログラムからアクセスすることも可能です。
このページのコードは、以下の要件に基づいて開発されました。 これらのバージョン、またはそれ以降のバージョンの使用をお勧めします。
qiskit-ibm-runtime~=0.46.1
ジョブを監視する
これらのメソッドを使用して、送信済みのジョブのステータスを確認したり、結果を取得したり、ジョブおよびその実行に関する詳細を表示したりできます。
このジョブインスタンスには、監視を行うためのいくつかのメソッドが用意されています:
メソッド | 説明 |
|---|---|
job.status() | 現在のジョブのステータスを確認する |
job.job_id() | 一意のジョブ識別子を取得する |
job.result() | ジョブの結果を取得する(完了するまで呼び出しをブロックする) |
job.wait_for_final_state() | ジョブが終了状態に達するまでブロックする |
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)「ワークロード」ページに移動し、「ステータス」列を確認してください。 雇用状況は、以下のいずれかとして表示されます:
- 保留中 :ジョブがQPUでの実行を待機しています
- 処理中 :ジョブが現在実行されています
- 完了 :作業が正常に終了しました
- 失敗 :ジョブでエラーが発生しました
- キャンセル :ユーザーがジョブをキャンセルしました
ジョブ名または行をクリックすると、詳細ビューが開き、結果やエラーメッセージなどの情報を確認できます。
なぜ仕事のステータスが「進行中」のままになるのか
(ジョブモードまたはバッチモードのいずれかを使用して)数秒で完了するはずのジョブが、「処理中」(Qiskit RUNNING では 「In progress 」と呼ばれます)の状態に、予想よりもずっと長く留まっていることに気づくかもしれません。 これは正常な現象であり、その時間すべてがジョブの処理に費やされていることを意味するわけではありません。 これは、QPUへのジョブのスケジューリング方法に起因しています:
- どのジョブも、QPU上で実行するには、まず標準的な前処理を行う必要があります。 この通常の処理が開始されるとすぐに、ジョブは 「処理中 (
RUNNING)」の状態に移行します。QPU上での実行が開始された時点ではありません。 - この従来の処理のほとんどは並列で実行されるため、複数のジョブを同時に進行させることができます。
- ただし、QPUでは一度に1つのジョブしか実行できません。 複数のジョブが通常の処理を完了し、実行可能な状態になった場合、それらのジョブはQPUの使用順番を待たなければなりません。 これは「 QPU競合」 として知られています。 競合が激しい場合、ジョブは、実際に必要なQPU時間である数秒よりも、著しく長い時間 「処理中」の状態が続くことがあります。
- また、QPU上でキャリブレーションなどのシステムメンテナンスタスクが実行されている場合にも、競合が発生する可能性があります。 メンテナンスタスクが完了し、QPUが利用可能になるまで、ジョブは 「処理中」の状態のままとなります。
このため、ジョブが 「進行中」の状態にある間に経過した実時間は、そのジョブの使用時間とは一致しません。 推定使用時間と最大実行時間の両方は、ジョブの実行のためにQPUがロックされる時間のみに基づいており、したがって、前述のマルチスレッドによる従来の処理は含まれていません。 「進行中」 の状態が長く続いても、報告される使用量や費用は増加しません。
セッションモードが異なります
上記の動作は、 ジョブモードおよびバッチモードに適用されます。 セッションモードでは、セッションのアクティブウィンドウが開いている間、ユーザーはバックエンドへの排他的なアクセス権を持ち、キャリブレーションジョブを含め、他のジョブは一切実行できません。 したがって、QPUの競合が発生するのは、自身のセッション内のジョブ間でのみです。 また、QPUの容量はセッションの期間中確保されるため、セッションの使用状況は、ジョブが実際に実行されているかどうかにかかわらず、セッションがアクティブな状態にある間の経過時間として測定されます。 詳細については、「 ワークロードの使用状況」 を参照してください。
残りの使用量を確認する
プランの利用枠の残量を把握しましょう。
この service.usage() メソッドを使用して、現在アクティブなインスタンスの使用状況情報を取得します。
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
# Get usage information for the current active instance
usage = service.usage()
print(usage)「インスタンス」ページに移動し、確認したいプランに対応するタブを選択してください。 プランの利用済み合計時間と残り合計時間が表示されます。
求人指標を表示する
バッチやセッションのワークロード指標を含め、ジョブの送信状況の概要を確認できます。
`` メソッド service.jobs() とフィルターを組み合わせて使用すると、送信済みのジョブに関する情報(送信された件数、ステータス、作成日時など)を取得できます。 次の例では、過去7日間に送信されたすべてのジョブを取得し、それらのジョブによる総使用量を計算します。
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を保存しておけば、セッションを終了した後でも、後で結果を取得することができます。
ジョブを送信した際にジョブIDを保存しておいた場合は、後でそれを取得 service.job(<job_id>) するには を使用してください。 ジョブIDがわからない場合や、複数のジョブを一度に取得したい場合(使用停止となったQPUのジョブを含む)は、 service.jobs() 代わりに を使用し、必要に応じてフィルタを指定してください。
利用可能なフィルターについては、API QiskitRuntimeService.jobs ドキュメントを参照してください。
この例では、特定のバックエンドで実行された直近の結果を取得する方法を示しています。
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()- 「ワークロード」ページに移動します。
- 検索機能やフィルタ機能を使って、求人名、日付、またはステータスから求人を探してください。
- ジョブをクリックすると、その結果と詳細が表示されます。
バックエンドのプロパティを取得する
を使用 job.properties() すると、ジョブ実行時のエラー率など、バックエンドのプロパティを取得できます。
この例では、ジョブの実行時点で有効だったバックエンドのプロパティを取得する方法を示しています。これには、 / の実行時間や、特定の量子ビット(0)のエラー率などが含まれます。
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")service.jobs() 非推奨の qiskit-ibm-provider パッケージから実行されたジョブも返します。 古い(同じく非推奨の) qiskit-ibmq-provider パッケージによって提出されたジョブは、もはや利用できません。
ジョブの実行時だけでなく、ジョブの作成時にも、バックエンドのキャリブレーションデータを確認できます。
- 「ワークロード」ページに移動する
- ワークロードをクリックして、その詳細ページを開きます
- 「量子コンピュータ」の下にある「キャリブレーション履歴を表示」をクリックします
- ドロップダウンメニューを使用して、データの表示対象を「ジョブ実行開始時」から「ジョブ作成時」に変更してください
ジョブをキャンセルします
キューに登録されている、または実行中のジョブをキャンセルします。 一度キャンセルされたジョブは、再開することはできません。
この job.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")- 「ワークロード 」テーブルから:キャンセルしたいワークロードの行末にあるオーバーフローメニューをクリックし、「 キャンセル」 を選択します。
- ジョブの詳細ページから :ワークロードをクリックして詳細ページを開き、上部の「 アクション 」ドロップダウンメニューから「 キャンセル 」を選択します。
次のステップ
- その他のジョブ管理メソッドについては、 API
QiskitRuntimeServiceリファレンスを参照してください。 - 実行モードについて詳しく見て、バッチ型およびセッション型のワークロードの種類を理解しましょう。