Przejdź do głównej treści

Monitorowanie lub anulowanie zadania

Ten przewodnik wyjaśnia, jak monitorować status zadania, przeglądać informacje o wykorzystaniu i anulować zadania. Możesz uzyskać dostęp do tych informacji zarówno przez IBM Quantum® Platform, jak i programowo za pomocą Qiskit.

Wersje pakietów

Kod na tej stronie został opracowany przy użyciu następujących wymagań. Zalecamy korzystanie z tych wersji lub nowszych.

qiskit-ibm-runtime~=0.46.1

Monitoruj zadanie​

Użyj tych metod, aby sprawdzić status wysłanych zadań, pobrać wyniki i wyświetlić szczegóły dotyczące zadania oraz jego wykonania.

Instancja zadania udostępnia kilka metod monitorowania:

MethodDescription
job.status()Check the current job status
job.job_id()Get the unique job identifier
job.result()Retrieve job results (blocking call until complete)
job.wait_for_final_state()Block until the job reaches a terminal state

Dlaczego zadanie pozostaje w statusie „In progress”​

Możesz zauważyć, że zadanie (korzystające z trybu zadania lub trybu wsadowego), które według oczekiwań powinno trwać zaledwie kilka sekund, pozostaje w statusie In progress (nazywanym RUNNING w Qiskit) znacznie dłużej. Jest to normalne i nie oznacza, że zadanie zużywa cały ten czas jako wykorzystanie. Dzieje się tak z powodu sposobu, w jaki zadania są planowane na QPU:

  • Każde zadanie wymaga klasycznego przetwarzania wstępnego, zanim będzie mogło zostać uruchomione na QPU. Zadanie przechodzi do statusu In progress (RUNNING) w momencie rozpoczęcia tego klasycznego przetwarzania — nie wtedy, gdy zaczyna się wykonywać na QPU.

  • Większość tego klasycznego przetwarzania odbywa się równolegle, więc wiele zadań może być jednocześnie w statusie In progress.

  • Jednak tylko jedno zadanie na raz może być wykonywane na QPU. Gdy kilka zadań zakończy klasyczne przetwarzanie i będzie gotowych do wykonania, muszą czekać na swoją kolej do QPU. Nazywa się to rywalizacją o QPU (QPU contention). Gdy rywalizacja jest wysoka, zadanie może pozostawać w statusie In progress zauważalnie dłużej niż kilka sekund czasu QPU, których faktycznie potrzebuje.

  • Rywalizacja może również wystąpić, gdy na QPU trwa zadanie konserwacji systemu, takie jak kalibracja. Twoje zadanie pozostaje w statusie In progress, dopóki zadanie konserwacji się nie zakończy i QPU nie stanie się dostępne.

Z tego powodu upływający czas rzeczywisty, który zadanie spędza w statusie In progress, nie jest tym samym co jego wykorzystanie. Zarówno szacowane wykorzystanie, jak i maksymalny czas wykonania opierają się wyłącznie na czasie, w którym QPU jest zablokowane do wykonania twojego zadania, a więc wykluczają opisane powyżej wielowątkowe przetwarzanie klasyczne. Długi czas w statusie In progress nie zwiększa zgłaszanego wykorzystania ani kosztu.

Tryb Session jest inny​

Poprzednio opisane zachowanie dotyczy trybu zadania i trybu wsadowego. W trybie Session, w oknie aktywności sesji, użytkownik ma wyłączny dostęp do backendu i żadne inne zadania nie mogą być wykonywane, w tym zadania kalibracyjne. Dlatego jakakolwiek rywalizacja o QPU zachodzi tylko wśród twoich własnych zadań w ramach sesji. Ponadto, ponieważ pojemność QPU jest zarezerwowana na czas trwania sesji, wykorzystanie sesji jest mierzone jako czas, który upłynął, gdy sesja pozostaje aktywna, niezależnie od tego, czy zadania są aktywnie wykonywane. Zobacz Wykorzystanie obciążenia, aby dowiedzieć się więcej.

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

Sprawdź pozostałe wykorzystanie​

Śledź, ile pozostało z limitu wykorzystania twojego planu.

Użyj metody service.usage(), aby uzyskać informacje o wykorzystaniu dla twojej aktualnie aktywnej instancji.

from qiskit_ibm_runtime import QiskitRuntimeService

service = QiskitRuntimeService()

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

Sprawdź metryki zadań​

Uzyskaj przegląd swoich zgłoszonych zadań, w tym metryki obciążeń wsadowych i sesyjnych.

Użyj metody service.jobs() z filtrami, aby pobrać informacje o wysłanych zadaniach, takie jak liczba wysłanych zadań, ich statusy i czas utworzenia. Poniższy przykład pobiera wszystkie zadania wysłane w ciągu ostatnich siedmiu dni i oblicza całkowite wykorzystanie tych zadań.

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

Pobierz wyniki zadania w późniejszym czasie​

Możesz zapisać identyfikatory zadań i pobrać wyniki później, nawet po zamknięciu sesji.

Jeśli zapisałeś identyfikator zadania podczas jego wysyłania, użyj service.job(<job_id>), aby pobrać je później. Jeśli nie masz identyfikatora zadania lub chcesz pobrać wiele zadań naraz (w tym zadania z wycofanych QPU), użyj zamiast tego service.jobs() z opcjonalnymi filtrami.

Zobacz dokumentację API QiskitRuntimeService.jobs w celu poznania dostępnych filtrów.

Ten przykład pokazuje pobieranie ostatnich wyników uruchomionych na konkretnym backendzie.

Pobierz właściwości backendu​

Możesz użyć job.properties(), aby pobrać właściwości backendu, w tym współczynniki błędów, w momencie wykonania zadania.

Ten przykład pokazuje, jak pobrać właściwości backendu aktualne w momencie wykonania zadania, w tym czasy T1T_1/T2T_2 i współczynniki błędów dla konkretnego kubitu (0).

Wycofane pakiety dostawców

service.jobs() zwraca również zadania uruchomione za pomocą wycofanego pakietu qiskit-ibm-provider. Zadania wysłane za pomocą starszego (również wycofanego) pakietu qiskit-ibmq-provider nie są już dostępne.

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

Anuluj zadanie​

Anuluj zadanie, które jest w kolejce lub jest wykonywane. Po anulowaniu zadania nie można go wznowić.

Użyj metody job.cancel(), aby anulować zadanie programowo.

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

Następne kroki​

Zalecenia