Przejdź do głównej treści
Ten projekt jest w wersji beta. Znalazłeś błąd? Otwórz zgłoszenie na GitHub. Masz pytanie lub pomysł? Zapytaj w Discussions — chętnie poznamy Twoją opinię!
Jak oceniasz jakość tłumaczenia tej strony?

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​

Zalecenia