Jalankan sapuan parameter
Versi pakej
Kod pada halaman ini dibangunkan menggunakan keperluan berikut. Kami mengesyorkan penggunaan versi ini atau yang lebih baharu.
qiskit-serverless~=0.38.0
Sapuan parameter berfungsi seperti tatasusunan job Slurm. Panggil run() sekali bagi setiap set input, dan job berjalan serentak, masing-masing pada nodnya sendiri. Gunakan corak yang sama untuk sebarang kelompok input bebas, seperti satu job bagi setiap molekul atau setiap backend. Job tidak boleh menghantar data antara satu sama lain, jadi pecahkan kerja kepada input yang bebas.
Contoh pada halaman ini menggunakan aliran kerja daripada Jalankan aliran kerja terurus, yang membaca satu sudut, theta:
# 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
# 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.
import logging
from qiskit_ibm_catalog import ManagedWorkflow, ManagedWorkflowClient
logging.getLogger("qiskit_ibm_runtime").setLevel(logging.ERROR)
_test_title = "docs-run-parameter-sweep"
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
)
Mulakan job
Dapatkan aliran kerja melalui tajuknya, dan panggil run() sekali bagi setiap input. Simpan ID job ke dalam fail:
run_workflow_remotely.ipynb
import json
from qiskit_ibm_catalog import ManagedWorkflowClient
client = ManagedWorkflowClient()
my_workflow = client.load("my-workflow")
thetas = [0.1, 0.2, 0.3]
job_ids = {
f"theta-{theta}": my_workflow.run(theta=theta).job_id for theta in thetas
}
with open("job_ids.json", "w") as f:
json.dump(job_ids, f)
-
Semak setiap input terlebih dahulu. Jika aliran kerja mempunyai skema argumen, panggil
validate_arguments()pada setiap input sebelum gelung. -
Simpan ID job ke dalam fail. Anda kemudian boleh mengumpul hasil daripada sesi baharu.
-
Beri nama unik kepada fail setiap larian. Semua larian berkongsi storan fail aliran kerja. Lihat Amalan terbaik: beri nama unik kepada fail setiap larian.
-
Kekal di bawah had job aktif. Aliran kerja terurus tidak menyusun job yang melebihi had dalam baris gilir, jadi apabila anda mencapainya, mulakan lebih banyak job hanya selepas job terdahulu tamat.
Kumpulkan hasil
Dapatkan setiap job melalui ID-nya, dan tangkap job yang gagal supaya satu kegagalan tidak menghentikan gelung:
run_workflow_remotely.ipynb
from qiskit_serverless.exception import QiskitServerlessException
with open("job_ids.json") as f:
job_ids = json.load(f)
results, errors = {}, {}
for run_name, sweep_job_id in job_ids.items():
try:
results[run_name] = client.job(sweep_job_id).result()
except QiskitServerlessException as error:
errors[run_name] = str(error)
print(f"{len(results)} jobs finished, {len(errors)} failed")
3 jobs finished, 0 failed
# This cell is hidden from users. It checks the sweep results.
assert len(results) == 3 and not errors, (results, errors)
assert all(results[f"theta-{t}"]["theta"] == t for t in thetas)
Untuk menjalankan semula input yang gagal, panggil run() sekali lagi dengan argumen yang sama.
Had job aktif
Anda boleh mempunyai sehingga 50 job yang berada dalam baris gilir, memulakan, berjalan atau membatalkan pada masa yang sama. Had ini mengira semua job anda, termasuk job aliran kerja lain. Jika anda melebihi had ini, run() menimbulkan QiskitServerlessException dan tidak mencipta atau menyusun job dalam baris gilir:
| Message: Http bad request.
| Code: 429
| Details: Active job limit reached. The maximum allowed is 50.
Langkah seterusnya
- Urus fail merentasi larian untuk berkongsi fail input antara larian dan memberi nama unik kepada fail setiap larian.
- Pilih profil pengiraan untuk menjalankan setiap job sapuan pada saiz yang sepadan dengan inputnya.