Uruchamianie przeszukiwania parametrów
Wersje pakietów
Kod na tej stronie został opracowany z użyciem następujących wymagań. Zalecamy używanie tych wersji lub nowszych.
qiskit-serverless~=0.38.0
Przeszukiwanie parametrów działa jak tablica zadań Slurm. Wywołaj run() jednokrotnie dla każdego zestawu danych wejściowych, a zadania będą działać jednocześnie, każde na własnym węźle. Użyj tego samego wzorca dla dowolnej partii niezależnych danych wejściowych, na przykład jednego zadania dla każdej cząsteczki lub każdego backendu. Zadania nie mogą przesyłać sobie danych, więc podziel pracę na niezależne dane wejściowe.
Przykłady na tej stronie używają przepływu pracy z Uruchamiania zarządzanego przepływu pracy, który odczytuje jeden kąt, 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
)
Rozpocznij zadania
Pobierz przepływ pracy według jego tytułu i wywołaj run() jednokrotnie dla każdych danych wejściowych. Zapisz identyfikatory zadań do pliku:
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)
-
Najpierw sprawdź każde wejście. Jeśli przepływ pracy ma schemat argumentów, wywołaj
validate_arguments()dla każdego wejścia przed pętlą. -
Zapisz identyfikatory zadań do pliku. Dzięki temu możesz zebrać wyniki z nowej sesji.
-
Nadaj plikom każdego uruchomienia unikalną nazwę. Wszystkie uruchomienia współdzielą magazyn plików przepływu pracy. Zobacz Dobra praktyka: nadawaj plikom każdego uruchomienia unikalną nazwę.
-
Nie przekraczaj limitu aktywnych zadań. Zarządzany przepływ pracy nie kolejkuje zadań ponad limit, więc po jego osiągnięciu rozpoczynaj kolejne zadania dopiero po zakończeniu wcześniejszych.
Zbierz wyniki
Pobierz każde zadanie według jego identyfikatora i przechwytuj nieudane zadania, aby jedna awaria nie zatrzymała pętli:
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)
Aby ponownie uruchomić dane wejściowe, które zakończyły się niepowodzeniem, wywołaj run() jeszcze raz z tymi samymi argumentami.
Limit aktywnych zadań
Możesz mieć jednocześnie do 50 zadań, które są w kolejce, w trakcie inicjalizacji, uruchomione lub anulowane. Ten limit obejmuje wszystkie Twoje zadania, w tym zadania innych przepływów pracy. Jeśli przekroczysz ten limit, run() zgłasza wyjątek QiskitServerlessException i nie tworzy ani nie kolejkuje zadania:
| Message: Http bad request.
| Code: 429
| Details: Active job limit reached. The maximum allowed is 50.
Następne kroki
- Zarządzaj plikami między uruchomieniami, aby udostępniać pliki wejściowe między uruchomieniami i nadawać plikom każdego uruchomienia unikalną nazwę.
- Wybierz profil obliczeniowy, aby uruchamiać każde zadanie przeglądu na rozmiarze dopasowanym do jego danych wejściowych.