ข้ามไปยังเนื้อหาหลัก

ติดตามหรือยกเลิก job

คู่มือนี้อธิบายวิธีตรวจสอบสถานะ job ดูข้อมูลการใช้งาน และยกเลิก job คุณสามารถเข้าถึงข้อมูลนี้ได้ทั้งผ่าน IBM Quantum® Platform และแบบโปรแกรมมิ่งด้วย Qiskit

Package versions

โค้ดในหน้านี้พัฒนาโดยใช้ requirements ต่อไปนี้ เราแนะนำให้ใช้เวอร์ชันเหล่านี้หรือใหม่กว่า

qiskit-ibm-runtime~=0.46.1

ติดตาม job

ใช้เมธอดเหล่านี้เพื่อตรวจสอบสถานะของ job ที่คุณส่งไปแล้ว ดึงผลลัพธ์ และดูรายละเอียดที่เกี่ยวข้องกับ job และการทำงานของมัน

job instance มีเมธอดหลายตัวสำหรับการติดตาม:

MethodDescription
job.status()ตรวจสอบสถานะปัจจุบันของ job
job.job_id()รับตัวระบุ job ที่ไม่ซ้ำกัน
job.result()ดึงผลลัพธ์ของ job (blocking call จนกว่าจะเสร็จสิ้น)
job.wait_for_final_state()บล็อกจนกว่า job จะถึงสถานะสุดท้าย

ทำไม job ถึงค้างอยู่ที่ "In progress"

คุณอาจสังเกตว่า job (ไม่ว่าจะเป็น job mode หรือ batch mode) ที่คุณคาดว่าจะใช้เวลาแค่ไม่กี่วินาที กลับค้างอยู่ที่สถานะ In progress (เรียกว่า RUNNING ใน Qiskit) นานกว่านั้นมาก นี่เป็นเรื่องปกติ และไม่ได้หมายความว่า job กำลังใช้เวลาทั้งหมดนั้นเป็นการใช้งาน (usage) เหตุการณ์นี้เกิดขึ้นเนื่องจากวิธีที่ job ถูกจัดตารางเวลาลงบน QPU:

  • job ทุกตัวต้องผ่านการประมวลผลแบบ classical pre-processing ก่อนที่จะสามารถรันบน QPU ได้ job จะย้ายไปยังสถานะ In progress (RUNNING) ทันทีที่การประมวลผล classical นี้เริ่มต้น — ไม่ใช่เมื่อมันเริ่มทำงานบน QPU

  • การประมวลผล classical ส่วนใหญ่นี้ทำงานแบบขนาน ดังนั้น job หลายตัวจึงสามารถอยู่ในสถานะ In progress พร้อมกันได้

  • อย่างไรก็ตาม มีเพียง job เดียวเท่านั้นที่สามารถรันบน QPU ได้ในแต่ละครั้ง เมื่อ job หลายตัวประมวลผล classical เสร็จสิ้นและพร้อมที่จะทำงาน พวกมันต้องรอคิวสำหรับ QPU สิ่งนี้เรียกว่า QPU contention เมื่อ contention สูง job อาจค้างอยู่ที่ In progress นานกว่าเวลา QPU เพียงไม่กี่วินาทีที่มันต้องการจริงๆ อย่างเห็นได้ชัด

  • Contention ยังสามารถเกิดขึ้นได้เมื่อมีงานบำรุงรักษาระบบ เช่น calibration กำลังรันอยู่บน QPU job ของคุณจะยังคงอยู่ที่ In progress จนกว่างานบำรุงรักษาจะเสร็จสิ้นและ QPU พร้อมใช้งาน

ด้วยเหตุนี้ เวลาที่ผ่านไปจริง (wall-clock time) ที่ job ใช้ในสถานะ In progress จึงไม่เหมือนกับ usage ของมัน ทั้ง estimated usage และ maximum execution time คำนวณจากเวลาที่ QPU ถูกล็อกเพื่อรัน job ของคุณเท่านั้น จึงไม่รวมการประมวลผล classical แบบ multi-threaded ที่อธิบายไว้ข้างต้น เวลา In progress ที่นานไม่ได้เพิ่ม usage หรือค่าใช้จ่ายที่รายงานของคุณ

Session mode แตกต่างออกไป

พฤติกรรมข้างต้นนี้ใช้กับ job mode และ batch mode ใน session mode ระหว่างช่วงเวลาที่ session ทำงานอยู่ ผู้ใช้จะมีสิทธิ์เข้าถึง backend แต่เพียงผู้เดียว และไม่มี job อื่นใดที่สามารถรันได้ รวมถึง calibration job ด้วย ดังนั้น QPU contention ใดๆ จะเกิดขึ้นเฉพาะระหว่าง job ของ session ของคุณเองเท่านั้น นอกจากนี้ เนื่องจากความจุ QPU ถูกจองไว้ตลอดระยะเวลาของ session การใช้งาน session จะถูกวัดเป็นเวลาที่ผ่านไปในขณะที่ session ยังคงทำงานอยู่ ไม่ว่า job จะกำลังรันอยู่จริงหรือไม่ก็ตาม ดู Workload usage สำหรับข้อมูลเพิ่มเติม

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit-ibm-runtime
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)

ดูการใช้งานที่เหลือ

ติดตามว่าโควตา usage ของแผนของคุณเหลืออยู่เท่าไร

ใช้เมธอด service.usage() เพื่อรับข้อมูล usage สำหรับ instance ที่กำลังใช้งานอยู่ในปัจจุบันของคุณ

from qiskit_ibm_runtime import QiskitRuntimeService

service = QiskitRuntimeService()

# Get usage information for the current active instance
usage = service.usage()
print(usage)

ดู job metrics

ดูภาพรวมของการส่ง job ของคุณ รวมถึง metrics ของ workload แบบ batch และ session

ใช้เมธอด service.jobs() พร้อม filters เพื่อดึงข้อมูลเกี่ยวกับ job ที่คุณส่งไปแล้ว เช่น มีการส่งไปกี่ job สถานะของแต่ละ job เป็นอย่างไร และถูกสร้างขึ้นเมื่อไร ตัวอย่างต่อไปนี้ดึง job ทั้งหมดที่ส่งภายในเจ็ดวันที่ผ่านมาและคำนวณ usage ทั้งหมดจาก job เหล่านั้น

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

ดึงผลลัพธ์ job ในภายหลัง

คุณสามารถบันทึก job ID และดึงผลลัพธ์ในภายหลังได้ แม้หลังจากปิด session ของคุณแล้ว

หากคุณบันทึก job ID ไว้เมื่อคุณส่ง job ให้ใช้ service.job(<job_id>) เพื่อดึงมันในภายหลัง หากคุณไม่มี job ID หรือหากคุณต้องการดึง job หลายตัวพร้อมกัน (รวมถึง job จาก QPU ที่เลิกใช้งานแล้ว) ให้ใช้ service.jobs() แทน โดยมี filters ให้เลือกใช้

ดูเอกสาร API QiskitRuntimeService.jobs สำหรับ filters ที่มีให้ใช้

ตัวอย่างนี้แสดงการดึงผลลัพธ์ล่าสุดที่รันบน backend เฉพาะเจาะจง

ดึงคุณสมบัติของ backend

คุณสามารถใช้ job.properties() เพื่อดึงคุณสมบัติของ backend รวมถึงอัตราความผิดพลาด ณ เวลาที่ job ทำงาน

ตัวอย่างนี้แสดงวิธีดึงคุณสมบัติของ backend ที่เป็นค่าปัจจุบัน ณ เวลาที่ job ถูกรัน รวมถึงเวลา T1T_1/T2T_2 และอัตราความผิดพลาดสำหรับ qubit เฉพาะเจาะจง (0)

Deprecated provider packages

service.jobs() ยังส่งคืน job ที่รันจาก package qiskit-ibm-provider ที่เลิกใช้งานแล้วด้วย job ที่ส่งโดย package 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

ยกเลิก job ที่กำลังอยู่ในคิวหรือกำลังทำงาน เมื่อ job ถูกยกเลิกแล้ว จะไม่สามารถกลับมาทำงานต่อได้

ใช้เมธอด job.cancel() เพื่อยกเลิก job แบบโปรแกรมมิ่ง

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

ขั้นตอนถัดไป

คำแนะนำ