Jalankan aliran kerja terurus
Versi pakej
Kod pada halaman ini dibangunkan menggunakan keperluan berikut. Kami mengesyorkan penggunaan versi ini atau yang lebih baharu.
qiskit-serverless~=0.38.0
Job aliran kerja terurus berfungsi seperti job kelompok yang anda hantar kepada penjadual HPC. run() menghantar job dan segera mengembalikan objek Job. Gunakan objek Job untuk tugas yang dilakukan oleh squeue, fail output job dan scancel pada kluster. Job terus berjalan selepas anda menutup buku nota anda.
Contoh pada halaman ini menggunakan aliran kerja kecil yang membaca satu sudut, theta, dan gagal jika sudut berada di luar julat. Muat naiknya seperti yang diterangkan dalam Gunakan aliran kerja terurus pertama anda.
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"qiskit_ibm_catalog": "qiskit-ibm-catalog", "qiskit_serverless": "qiskit-serverless"}
_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")
# This cell is hidden from users. It creates the working directory.
from pathlib import Path
Path("./source_files").mkdir(exist_ok=True)
%%writefile ./source_files/my_workflow.py
import math
from qiskit_serverless import get_arguments, save_result
arguments = get_arguments()
theta = arguments["theta"]
if not 0 <= theta <= math.pi:
raise ValueError(f"theta must be between 0 and pi, got {theta}")
print(f"Computing the expectation value for theta={theta}", flush=True)
save_result({"theta": theta, "expectation_value": math.cos(theta)})
Writing ./source_files/my_workflow.py
Mulakan job
Dapatkan aliran kerja melalui tajuknya, dan panggil run() dengan argumen yang dibaca oleh aliran kerja:
# This cell is hidden from users. It uploads the workflow under a title that
# other test notebooks do not use, and makes load("my-workflow") return it.
# It also silences the account warning that job.cancel() logs.
import logging
from qiskit_ibm_catalog import ManagedWorkflow, ManagedWorkflowClient
logging.getLogger("qiskit_ibm_runtime").setLevel(logging.ERROR)
_test_title = "docs-run-managed-workflow"
ManagedWorkflowClient().upload(
ManagedWorkflow(
title=_test_title,
entrypoint="my_workflow.py",
working_dir="./source_files/",
)
)
_load = ManagedWorkflowClient.load
ManagedWorkflowClient.load = lambda self, title, *a, **k: _load(
self, _test_title if title == "my-workflow" else title, *a, **k
)
run_workflow_remotely.ipynb
from qiskit_ibm_catalog import ManagedWorkflowClient
client = ManagedWorkflowClient()
my_workflow = client.load("my-workflow")
job = my_workflow.run(theta=0.5)
job_id = job.job_id
run() kembali selepas aliran kerja menyusun job dalam baris gilir. Simpan ID job supaya anda boleh mencari job daripada sesi baharu.
-
Untuk memilih argumen yang diterima oleh aliran kerja dan menyemaknya sebelum job bermula, lihat Takrifkan input dan output.
-
Untuk menjalankan job pada saiz pengiraan yang berbeza, hantar
function_size. Lihat Pilih saiz untuk setiap larian.
Ikuti job
Semak status
Sejurus selepas anda memanggil run(), status biasanya QUEUED:
run_workflow_remotely.ipynb
job.status()
'QUEUED'
| Status | Maksud |
|---|---|
QUEUED | Job menunggu slot pengiraan. |
INITIALIZING | Aliran kerja memulakan persekitaran dengan profil pengiraan job. |
RUNNING | Titik masuk aliran kerja sedang berjalan. |
RUNNING: <stage> | Titik masuk melaporkan satu peringkat dengan update_status(), seperti RUNNING: WAITING_FOR_QPU. |
CANCELING | Anda membatalkan job, dan aliran kerja sedang menghentikannya. |
DONE | Titik masuk keluar dengan jayanya. |
ERROR | Titik masuk menimbulkan ralat atau keluar dengan kod bukan sifar. Lihat Cari punca ralat. |
CANCELED | Anda membatalkan job, atau ia mencapai had 24 jam. |
DONE, ERROR dan CANCELED ialah status akhir, dan job.in_terminal_state() mengembalikan True untuknya. Gelung status yang menunggu nilai lain, seperti SUCCEEDED, tidak pernah berakhir.
Tunggu sehingga job tamat
Untuk menunggu sehingga job tamat, panggil wait_for_final_state(). Ia mengembalikan status akhir, dan dengan verbose=True ia mencetak setiap perubahan status. Jika anda menetapkan timeout dalam saat, wait_for_final_state() menimbulkan TimeoutError apabila masa tamat sebelum job berakhir. Job terus berjalan:
run_workflow_remotely.ipynb
job.wait_for_final_state(timeout=600, verbose=True)
Waiting for job 3f2a1c0e-6b1d-4c0e-9a51-2f0c4d1e7a90
0:00:00 QUEUED
0:02:10 RUNNING
0:03:05 RUNNING: WAITING_FOR_QPU
0:41:44 DONE
'DONE'
wait_for_final_state() menyemak status selepas 1, 2, 4, 8, 16 dan 32 saat, dan kemudian setiap 60 saat, supaya ia melihat penghujung job pendek dalam beberapa saat dan membuat sedikit permintaan untuk job yang panjang. Untuk menyemak pada sela tetap sebaliknya, hantar poll_interval dalam saat.
Baca log
Apa-apa yang ditulis oleh aliran kerja ke output standard atau ralat standard masuk ke log job. Anda boleh membacanya dengan job.logs() semasa job berjalan, sebelum ia mempunyai hasil:
# This cell is hidden from users. It waits for the job to end, so that the
# logs are complete.
job.wait_for_final_state()
run_workflow_remotely.ipynb
print(job.logs())
Computing the expectation value for theta=0.5
# This cell is hidden from users. It checks the logs.
assert "Computing the expectation value for theta=0.5" in job.logs()
-
Aliran kerja memuat naik baris log baharu kira-kira setiap 15 saat, dan sekali lagi buat kali terakhir apabila job tamat atau dibatalkan. Sejurus selepas job bermula,
job.logs()mengembalikanNo logs yet. -
Aliran kerja menyimpan 50 MB log terbaharu bagi setiap job, dan menambah satu baris di bahagian atas yang menyatakan bahawa log telah dipotong.
Untuk menentukan apa yang dilog oleh aliran kerja anda, lihat Tulis log. Untuk menunjukkan hanya baris yang sepadan dengan ungkapan nalar, hantar include kepada job.filtered_logs(). Untuk menyembunyikan baris, hantar exclude.
Dapatkan hasil
job.result() menunggu sehingga job tamat, kemudian mengembalikan nilai yang dihantar oleh aliran kerja kepada save_result():
run_workflow_remotely.ipynb
job.result()
{'theta': 0.5, 'expectation_value': 0.8775825618903728}
# This cell is hidden from users. It checks the result.
assert _ == {"theta": 0.5, "expectation_value": 0.8775825618903728}, _ # noqa: F821
Secara lalai, job.result() menyemak status setiap 30 saat dan menunggu tanpa had masa. Hantar maxwait untuk mengehadkan bilangan semakan. Sebagai contoh, job.result(maxwait=40) menunggu kira-kira 20 minit. Untuk menyemak sekali tanpa menunggu, hantar wait=False. Jika job.result() berhenti menunggu sebelum job tamat, ia mengembalikan {}.
Semak berapa lama setiap peringkat mengambil masa
job.events() menyenaraikan setiap perubahan status dan peringkat sesuatu job beserta masanya, supaya anda dapat melihat berapa lama job menunggu pengiraan dan berapa lama setiap peringkat mengambil masa:
run_workflow_remotely.ipynb
for event in reversed(job.events()):
print(
event.created,
event.data.get("status") or event.data.get("sub_status"),
)
2026-11-02T14:43:07.134377Z QUEUED
2026-11-02T14:43:24.474199Z PENDING
2026-11-02T14:46:07.309519Z RUNNING
2026-11-02T14:46:21.115038Z SUCCEEDED
# This cell is hidden from users. It checks the events.
_statuses = [e.data.get("status") for e in job.events()]
assert "QUEUED" in _statuses and "SUCCEEDED" in _statuses, _statuses
Peristiwa menggunakan nama status yang disimpan. PENDING ialah INITIALIZING, dan SUCCEEDED ialah DONE. Untuk penggunaan QPU bagi sesuatu larian, lihat Cari job QPU bagi sesuatu larian.
Cari punca ralat
Apabila aliran kerja menimbulkan pengecualian, job berakhir dengan status ERROR. Sebagai contoh, jalankan aliran kerja dengan sudut yang ditolaknya:
run_workflow_remotely.ipynb
failed_job = my_workflow.run(theta=-1.0)
# This cell is hidden from users. It waits for the job to end.
failed_job.wait_for_final_state()
run_workflow_remotely.ipynb
failed_job.status()
'ERROR'
Log menunjukkan jejak balik:
run_workflow_remotely.ipynb
print(failed_job.logs())
Traceback (most recent call last):
File "/function_user_data/my_workflow.py", line 8, in <module>
raise ValueError(f"theta must be between 0 and pi, got {theta}")
ValueError: theta must be between 0 and pi, got -1.0
job.result() raises a QiskitServerlessException:
run_workflow_remotely.ipynb
from qiskit_serverless.exception import QiskitServerlessException
try:
failed_job.result()
except QiskitServerlessException as error:
print(error)
raise ValueError(f"theta must be between 0 and pi, got {theta}")
ValueError: theta must be between 0 and pi, got -1.0
# This cell is hidden from users. It checks the error.
assert failed_job.status() == "ERROR", failed_job.status()
assert (
"ValueError: theta must be between 0 and pi, got -1.0"
in failed_job.logs()
)
assert failed_job.events(type="ERROR") == []
Jika aliran kerja melaporkan ralat dengan send_error(), bacanya dengan job.events(type="ERROR"), dan baca mesejnya dengan job.error_message(). Untuk job tanpa ralat yang dilaporkan, job.events(type="ERROR") mengembalikan senarai kosong, dan job.error_message() mengembalikan {}.
run_workflow_remotely.ipynb
for event in job.events(type="ERROR"):
print(event.created, event.data.get("code"), event.data.get("message"))
Urus job
Batalkan job
Batalkan job dengan job.cancel(). Status bertukar kepada CANCELING semasa aliran kerja menghentikan job, dan kemudian kepada CANCELED:
run_workflow_remotely.ipynb
job_to_cancel = my_workflow.run(theta=1.0)
job_to_cancel.cancel()
'Job has been stopped. No active runtime job ID associated with this serverless job ID.'
# This cell is hidden from users. It checks the cancellation.
assert (
job_to_cancel.wait_for_final_state() == "CANCELED"
), job_to_cancel.status()
job.cancel() mengembalikan mesej tentang job dan tentang job QPU berpautnya, yang turut cuba dibatalkan. Bagi job yang sedang berjalan, aliran kerja menghantar SIGTERM kepada titik masuk anda. Untuk menyimpan hasil separa, lihat Bersihkan apabila job dibatalkan. Jika job sudah tamat, job.cancel() mengembalikan Job already in terminal state. dan tidak mengubah apa-apa.
Cari job daripada sesi baharu
Objek Job dan aliran kerja wujud hanya dalam sesi Python semasa anda. Selepas anda memulakan semula kernel buku nota, hantar ID job yang disimpan kepada client.job(), atau senaraikan job terkini anda dengan client.jobs():
run_workflow_remotely.ipynb
from qiskit_ibm_catalog import ManagedWorkflowClient
client = ManagedWorkflowClient()
job = client.job(job_id)
my_workflow = client.load("my-workflow")
client.jobs(function=my_workflow, status="ERROR", limit=5)
[<Job | e6b1ffa1-cd26-437d-bd53-b265dd4ba952>,
<Job | 11308f2a-8d7a-40a0-a970-7fdeca2b171b>,
<Job | af597785-3470-469a-9051-607e0185892e>,
<Job | a9051931-3bc2-4b80-9ce6-c39d28ce260c>,
<Job | e329e8e3-e955-4188-9bfd-8f3050ee2d39>]
# This cell is hidden from users. It checks the job lookups.
assert job.result()["theta"] == 0.5
assert failed_job.job_id in [j.job_id for j in _] # noqa: F821
client.jobs() mengembalikan 10 job terkini anda, yang terbaharu dahulu. Tapis dengan function, status (daripada jadual status), atau created_after (cap masa ISO 8601), dan layari halamannya dengan limit dan offset. Untuk menyenaraikan aliran kerja yang anda muat naik, panggil client.list().
Jadual Workloads pada IBM Quantum Platform juga menyenaraikan job anda, beserta status, profil pengiraan dan masa larian.
Had masa
Aliran kerja terurus membatalkan job yang berjalan lebih daripada 24 jam, dan job berakhir dengan status CANCELED. Semasa larian yang panjang, simpan titik semak ke storan fail supaya anda tidak kehilangan kerja.
Selesaikan masalah job
| Masalah | Punca |
|---|---|
run() gagal dengan Code: 429 dan Active job limit reached. | Anda mencapai had job aktif. Tunggu beberapa job tamat, atau batalkan job yang tidak lagi anda perlukan. |
Job kekal QUEUED, dan run() memberi amaran your account, plan or subscription is blocked. | Job tidak bermula sehingga sekatan pada akaun, pelan atau langganan anda ditarik balik. Hubungi pentadbir anda. |
job.logs() mengembalikan No logs yet. | Job berada dalam baris gilir atau baru bermula. Tunggu kira-kira 15 saat. |
job.result() mengembalikan {} | Job belum tamat, telah dibatalkan, atau tidak menyimpan hasil. Lihat Simpan hasil. |
job.error_message() mengembalikan {} | Aliran kerja menimbulkan pengecualian tanpa melaporkan ralat. Baca jejak balik dengan job.logs(). |
Job CANCELED, tetapi anda tidak membatalkannya | Job mencapai had 24 jam. |
Langkah seterusnya
- Tulis log dan tangani ralat untuk menyediakan log dan ralat yang dilaporkan oleh job.
- Jalankan sapuan parameter untuk menjalankan aliran kerja sekali bagi setiap set input.