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?

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 pracyStatus 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​

ProblemPrzyczyna
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​

Zalecenia