メインコンテンツへスキップ
このプロジェクトはベータ版です。バグを見つけましたか?GitHub Issueを開く。質問やアイデアがありますか?Discussionsで質問する — フィードバックをお待ちしています!
このページの翻訳品質はいかがですか?

ジョブの監視またはキャンセル

このガイドでは、ジョブのステータスを監視し、使用状況情報を表示し、ジョブをキャンセルする方法について説明します。この情報には、IBM Quantum® Platform を通じても、Qiskit を使用してプログラムでもアクセスできます。

パッケージのバージョン

このページのコードは、以下の要件を使用して開発されました。 これらのバージョン以降を使用することをお勧めします。

qiskit-ibm-runtime~=0.46.1

ジョブを監視する​

これらのメソッドを使用して、送信したジョブのステータスを確認し、結果を取得し、ジョブとその実行に関する詳細を表示します。

job インスタンスは、監視のためのいくつかのメソッドを提供します。

メソッド説明
job.status()現在のジョブ・ステータスを確認する
job.job_id()一意のジョブ識別子を取得する
job.result()ジョブの結果を取得する(完了するまでブロックする呼び出し)
job.wait_for_final_state()ジョブが終了状態に達するまでブロックする

ジョブが「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)

残り使用量を確認する​

プランの使用量クォータの残りを追跡します。

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() を使用してください。

利用可能なフィルターについては、QiskitRuntimeService.jobs の API ドキュメントを参照してください。

この例では、特定の backend で実行された最近の結果を取得する方法を示します。

Backend のプロパティを取得する​

job.properties() を使用して、ジョブの実行時点のエラー率などの backend プロパティを取得できます。

この例では、特定の qubit(0)についての T1T_1/T2T_2 時間とエラー率を含め、ジョブが実行された時点で有効だった backend プロパティを取得する方法を示します。

非推奨のプロバイダーパッケージ

service.jobs() は、非推奨の qiskit-ibm-provider パッケージから実行されたジョブも返します。より古い(同様に非推奨の)qiskit-ibmq-provider パッケージによって送信されたジョブは、もはや利用できません。

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")

ジョブをキャンセルする​

キューに入っている、または実行中のジョブをキャンセルします。ジョブが一度キャンセルされると、再開することはできません。

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")

次のステップ​

推奨事項