Uruchamiaj zadania kwantowe z przepływu pracy
Wersje pakietów
Kod na tej stronie został opracowany z użyciem następujących wymagań. Zalecamy używanie tych wersji lub nowszych.
qiskit[all]~=2.6.1
qiskit-ibm-runtime~=0.51.0
qiskit-serverless~=0.38.0
Kwantowo-klasyczny przepływ pracy działa jako jedno zadanie zarządzanego przepływu pracy. Jego etapy klasyczne działają na Twoim profilu obliczeniowym, a zadania primitive, które wysyła do QPU IBM Quantum®, działają w Twojej instancji i wliczają się do Twojego zużycia. Z tego jednego zadania możesz raportować każdy etap, znajdować zadania QPU i je anulować. Aby rozpocząć zadanie oraz sprawdzić jego status i logi, zobacz Uruchom zarządzany przepływ pracy.
Zanim zaczniesz, wdróż swój pierwszy zarządzany przepływ pracy.
Utwórz usługę Runtime
Utwórz usługę Runtime w kodzie przepływu pracy za pomocą get_runtime_service() i używaj jej tak samo, jak lokalnie używasz QiskitRuntimeService. Poniższy przepływ pracy uruchamia obwód Bella za pomocą prymitywu Sampler, raportuje każdy etap za pomocą update_status() i zwraca zliczenia:
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"qiskit": "qiskit", "qiskit_ibm_catalog": "qiskit-ibm-catalog", "qiskit_ibm_runtime": "qiskit-ibm-runtime", "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
from qiskit import QuantumCircuit
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime.executor_sampler import Sampler
from qiskit_serverless import (
Job,
get_arguments,
get_runtime_service,
save_result,
update_status,
)
arguments = get_arguments()
service = get_runtime_service()
backend = service.backend(arguments["backend_name"])
circuit = QuantumCircuit(2)
circuit.h(0)
circuit.cx(0, 1)
circuit.measure_all()
update_status(Job.OPTIMIZING_HARDWARE)
pass_manager = generate_preset_pass_manager(optimization_level=1, backend=backend)
isa_circuit = pass_manager.run(circuit)
update_status(Job.WAITING_QPU)
sampler = Sampler(mode=backend)
primitive_job = sampler.run([isa_circuit])
counts = primitive_job.result()[0].data.meas.get_counts()
update_status(Job.POST_PROCESSING)
save_result({"backend": backend.name, "counts": counts})
Overwriting ./source_files/my_workflow.py
get_runtime_service() zwraca QiskitRuntimeService skonfigurowaną dla Twojego zadania zarządzanego przepływu pracy i zapewnia następujące elementy:
-
Dane uwierzytelniające. Usługa Runtime używa klucza API, instancji i kanału, których użyłeś do wywołania
run(), więc kod przepływu pracy nie potrzebuje danych uwierzytelniających. -
Śledzenie. Przepływ pracy rejestruje każde zadanie primitive uruchomione przez tę usługę Runtime w ramach zadania zarządzanego przepływu pracy, w tym zadania Sampler, Estimator i Executor oraz zadania w sesji lub batchu. Możesz je wyświetlić za pomocą
job.runtime_jobs(). -
Anulowanie. Gdy wywołasz
job.cancel(), zarządzany przepływ pracy anuluje także sesje, batche i zadania primitive tego przepływu pracy, które nadal działają.
Zarządzany przepływ pracy nie śledzi ani nie anuluje zadań usługi utworzonej za pomocą QiskitRuntimeService(), choć te zadania nadal działają. Jeśli przepływ pracy musi użyć innej usługi, anuluj jej zadania w obsłudze SIGTERM.
Uruchamiaj prymitywy w sesji lub batchu
Zarządzany przepływ pracy śledzi także zadania primitive uruchamiane w sesji lub batchu. Utwórz sesję lub batch na podstawie backendu zwróconego przez usługę Runtime i twórz prymitywy wewnątrz bloku with. Session działa w ten sam sposób:
source_files/my_workflow.py
from qiskit_ibm_runtime import Batch
with Batch(backend=backend) as batch:
sampler = Sampler(mode=batch)
primitive_jobs = [sampler.run([isa_circuit]) for _ in range(2)]
results = [primitive_job.result() for primitive_job in primitive_jobs]
Raportuj postęp za pomocą update_status()
Przepływ pracy w sekcji Utwórz usługę Runtime wywołuje update_status() na początku każdego etapu, aby status zadania pokazywał, w którym miejscu jest przepływ pracy, na przykład RUNNING: WAITING_FOR_QPU. Przekaż jedną z następujących stałych Job:
| Wywołanie w przepływie pracy | Status zadania |
|---|---|
update_status(Job.MAPPING) | RUNNING: MAPPING |
update_status(Job.OPTIMIZING_HARDWARE) | RUNNING: OPTIMIZING_FOR_HARDWARE |
update_status(Job.WAITING_QPU) | RUNNING: WAITING_FOR_QPU |
update_status(Job.EXECUTING_QPU) | RUNNING: EXECUTING_QPU |
update_status(Job.POST_PROCESSING) | RUNNING: POST_PROCESSING |
update_status() zwraca True, jeśli przepływ pracy zmienił status. Zwraca False i zapisuje ostrzeżenie w logach, jeśli wartość nie jest jedną z tych stałych, jeśli zadanie nie jest już aktywne lub jeśli kod działa poza zadaniem. Nie zgłasza błędu, więc literówka nie zatrzymuje przepływu pracy.
Aby raportować postęp w obrębie etapu, na przykład iteracje optymalizatora, zapisuj wiersze logu.
Znajdź zadania QPU danego uruchomienia
W lokalnym notebooku wybierz QPU, do którego Twoja instancja ma dostęp. client.backends() wyświetla je, a client.least_busy() zwraca ten z najmniejszą liczbą oczekujących zadań:
from qiskit_ibm_catalog import ManagedWorkflowClient
client = ManagedWorkflowClient()
print([backend.name for backend in client.backends(simulator=False)])
backend_name = client.least_busy(operational=True, simulator=False).name
['ibm_boston', 'ibm_fez', 'ibm_kingston', 'ibm_marrakesh', 'ibm_phoenix', 'ibm_pittsburgh']
Prześlij przepływ pracy i przekaż nazwę backendu podczas jego uruchamiania:
from qiskit_ibm_catalog import ManagedWorkflow
my_workflow = client.upload(
ManagedWorkflow(
title="my-workflow",
entrypoint="my_workflow.py",
working_dir="./source_files/",
)
)
job = my_workflow.run(backend_name=backend_name)
# This cell is hidden from users. It waits for the job to finish.
assert job.wait_for_final_state() == "DONE", job.logs()
Po zakończeniu zadania pobierz identyfikatory zadań QPU tego przepływu pracy z zadania zarządzanego przepływu pracy:
runtime_job_ids = job.runtime_jobs()
runtime_job_ids
['dbl6lst8ft8s738secf0']
# This cell is hidden from users. It checks the tracked job.
assert len(runtime_job_ids) == 1, runtime_job_ids
Każdy identyfikator jest zwykłym identyfikatorem zadania primitive. Aby odczytać status i wyniki zadania, zobacz Pobierz wyniki zadania później.
Jeśli przepływ pracy uruchamiał prymitywy w sesji lub batchu, wyświetl identyfikatory sesji i batchy za pomocą runtime_sessions() i przekaż jeden z nich do runtime_jobs(), aby uzyskać tylko zadania w nim zawarte:
run_workflow_remotely.ipynb
for session_id in job.runtime_sessions():
print(session_id, job.runtime_jobs(session_id))
dc101077-d085-40fb-8fbe-78852e355994 ['dbjqp48nceqs73aki1k0', 'dbjqp4l6p51s73clb91g']
Obiekt job istnieje tylko w notebooku, który rozpoczął uruchomienie. W nowym notebooku pobierz zadanie ponownie za pomocą client.job("<your-job-id>"), a następnie wywołaj na nim runtime_jobs(). Zobacz Znajdź zadanie z nowej sesji.
Informacje o zużyciu QPU i czasach działania każdego zadania QPU znajdziesz w sekcji Wyświetl metryki zadania. Zużycie całej Twojej instancji w bieżącym okresie sprawdzisz, wywołując client.usage(). Aby zobaczyć, ile trwał każdy etap zadania zarządzanego przepływu pracy, zobacz Sprawdź, ile trwał każdy etap.
Anuluj powiązane zadania QPU
Gdy anulujesz zadanie zarządzanego przepływu pracy za pomocą job.cancel(), przepływ pracy próbuje też anulować pracę QPU, którą rozpoczął:
-
Sesje i batche. Przepływ pracy anuluje każdą ze swoich sesji i każdy ze swoich batchy, co anuluje także ich zadania w kolejce.
-
Inne zadania primitive. Przepływ pracy anuluje każde ze swoich pozostałych zadań primitive, które są nadal w kolejce lub działają.
job.cancel() zwraca komunikat dla każdego zadania QPU i każdej sesji, więc możesz sprawdzić, co zostało anulowane:
run_workflow_remotely.ipynb
print(job.cancel())
Dla przepływu pracy uruchomionego w batchu komunikat wygląda następująco:
Job is stopping. Canceled runtime session: eb8874c9-a15e-45f8-9a90-a9fb35267f9d and associated runtime jobs.
Jeśli klient nie może utworzyć QiskitRuntimeService z Twoich lokalnych danych uwierzytelniających, anuluje tylko zadanie zarządzanego przepływu pracy. Anuluj zadania QPU samodzielnie, używając ich identyfikatorów z job.runtime_jobs().
Gdy przepływ pracy sam zatrzymuje zadanie, na przykład dlatego, że osiągnięto limit 24 godzin, nie anuluje swoich zadań QPU. Anuluj je, używając ich identyfikatorów z job.runtime_jobs().
Rozwiązywanie problemów z zadaniami QPU w przepływie pracy
| Problem | Przyczyna |
|---|---|
get_runtime_service() zgłasza KeyError: 'QISKIT_IBM_CHANNEL'. | Kod działa w Twoim lokalnym notebooku, a nie w zadaniu zarządzanego przepływu pracy. Lokalnie używaj QiskitRuntimeService(). |
update_status() zwraca False, a logi pokazują 'sub_status' not provided or is not valid. | Wartość nie jest jedną ze stałych Job lub zadanie nie jest już aktywne. |
job.runtime_jobs() zwraca []. | Przepływ pracy utworzył swoją usługę za pomocą QiskitRuntimeService() lub nie uruchomił jeszcze żadnego prymitywu. |
| Zadania sesji nie są śledzone. | Sesja została utworzona na podstawie backendu innej usługi. Pobierz backend z get_runtime_service(). |
Logi przepływu pracy zawierają Could not associate runtime job with serverless job. | Przepływ pracy nie mógł zarejestrować zadania primitive. Zadanie primitive nadal działa, ale nie jest śledzone. |
job.cancel() pokazuje No QiskitRuntimeService can be associated to the given token and instance. | Klient nie mógł utworzyć QiskitRuntimeService z Twoich lokalnych danych uwierzytelniających, więc anulował tylko zadanie zarządzanego przepływu pracy. |
client.job() kończy się błędem Job [...] not found. | Identyfikator zadania jest błędny lub zadanie należy do innego użytkownika. |
Następne kroki
- Uruchom zarządzany przepływ pracy, aby sprawdzić status, wynik i logi zadania oraz znaleźć przyczynę błędu.