Nasazení tvého prvního managed workflow
Verze balíčků
Kód na této stránce byl vyvinut s následujícími požadavky. Doporučujeme používat tyto nebo novější verze.
qiskit[all]~=2.6.1
qiskit-serverless~=0.38.0
Na této stránce nahraješ workflow, spustíš ho a získáš jeho výsledek. Ukázkové workflow optimalizuje a simuluje obvod Qiskit. Obvod simuluje na klasickém hardwaru, takže nespotřebovává čas QPU.
Než začneš, nainstaluj klientský balíček a proveď autentizaci.
Chceš-li nasadit vlastní kód s pomocí AI asistenta, použij AI skills v repozitáři šablon Qiskit Function.
# 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_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")
Napsání workflow
Vytvoření struktury složek
Managed workflow je složka souborů Pythonu s jedním vstupním souborem. Managed workflow nahraje vše ve složce, až do 50 MB, a vstupní soubor spustí jako skript. Protože workflow nahrává celou složku, ukládej své lokální soubory, například deploy.ipynb, mimo ni. Vytvoř následující rozložení:
hello_world_project/
├── deploy.ipynb # Your local notebook: upload and run the workflow
└── source_files/ # The working directory that you upload
└── hello_world.py # The entrypoint
Napsání vstupního bodu hello world
Vstupní bod načte obvod, optimalizuje ho a simuluje a uloží počty měření a dvoukubitovou hloubku. Ulož následující kód jako source_files/hello_world.py:
Pokud čteš tuto stránku jako notebook, buňka s kódem pro hello_world.py začíná magickým příkazem %%writefile. Když tuto buňku spustíš, uloží kód do souboru místo jeho spuštění.
# 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/hello_world.py
from qiskit.primitives import StatevectorSampler
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_serverless import Job, get_arguments, save_result, update_status
# Read the arguments that you pass to run()
arguments = get_arguments()
circuit = arguments["circuit"]
shots = arguments.get("shots", 1024)
# Optimize the circuit. Printed text goes to the job's logs.
update_status(Job.OPTIMIZING_HARDWARE)
pass_manager = generate_preset_pass_manager(
optimization_level=1, basis_gates=["cz", "rz", "sx", "x"]
)
isa_circuit = pass_manager.run(circuit)
two_qubit_depth = isa_circuit.depth(lambda instruction: instruction.operation.num_qubits == 2)
print(f"Two-qubit depth after optimization: {two_qubit_depth}", flush=True)
# Simulate the circuit and return the counts
sampler = StatevectorSampler(seed=1234)
pub_result = sampler.run([isa_circuit], shots=shots).result()[0]
save_result({"counts": pub_result.data.meas.get_counts(), "two_qubit_depth": two_qubit_depth})
Writing ./source_files/hello_world.py
Vstupní bod používá tři funkce z qiskit_serverless:
-
get_arguments()vrací pojmenované argumenty, které předáš dorun(), jako slovník. Každá hodnota musí být serializovatelná do JSON, nebo objekt, který klient dokáže zakódovat, napříkladQuantumCircuit. Zakódované objekty dorazí jako stejné objekty, které jsi předal. -
update_status(Job.OPTIMIZING_HARDWARE)nastaví podrobný stavRUNNING: OPTIMIZING_FOR_HARDWARE, který uvidíš během běhu úlohy. Viz Hlášení průběhu pomocí update_status(). -
save_result()uloží hodnotu serializovatelnou do JSON, kterou později přečteš pomocíjob.result(). Workflow vrací počty měření jako slovník a dvoukubitovou hloubku optimalizovaného obvodu jako celé číslo.
Cokoli, co workflow zapíše na standardní výstup, například dvoukubitová hloubka, jde do logů úlohy. Chceš-li přidat časové značky a úrovně logování, použij modul logging. Viz Zápis logů a zpracování chyb.
Nahrání workflow
V lokálním notebooku spusť následující kód ze složky hello_world_project. Kód se připojí k tvému uloženému účtu, definuje workflow a nahraje ho. entrypoint je soubor, který workflow spouští, a working_dir je složka, kterou nahráváš:
from qiskit_ibm_catalog import ManagedWorkflow, ManagedWorkflowClient
client = ManagedWorkflowClient()
hello_world = ManagedWorkflow(
title="hello-world",
entrypoint="hello_world.py",
working_dir="./source_files/",
)
hello_world = client.upload(hello_world)
Spuštění workflow se vstupy
Sestav tříkubitový obvod GHZ, který předáš do hello_world jako vstup:
from qiskit import QuantumCircuit
circuit = QuantumCircuit(3)
circuit.h(0)
circuit.cx(0, 1)
circuit.cx(1, 2)
circuit.measure_all()
Spusť hello_world s obvodem a počtem shotů jako pojmenovanými argumenty. Názvy argumentů odpovídají klíčům, které vstupní bod čte pomocí get_arguments():
job = hello_world.run(circuit=circuit, shots=1024)
print(job.job_id)
54705348-5117-44b7-935b-e6986ef182fa
run() vrací Job, jakmile workflow zařadí úlohu do fronty. Nečeká, až se úloha spustí. Úloha pokračuje v cloudu i po zavření tvé relace Pythonu. Chceš-li ji později znovu najít, vypiš své nedávné úlohy pomocí client.jobs().
Získání stavu, výsledku a logů
Bezprostředně po zavolání run() je stav obvykle QUEUED:
job.status()
'QUEUED'
Stav se mění z QUEUED na INITIALIZING, RUNNING a poté DONE.
job.result() počká, než úloha skončí, a poté vrátí hodnotu, kterou workflow předalo do save_result():
job.result()
{'counts': {'111': 514, '000': 510}, 'two_qubit_depth': 2}
# This cell is hidden from users. It checks the result.
assert set(_["counts"]) <= {"000", "111"} # noqa: F821
assert sum(_["counts"].values()) == 1024 # noqa: F821
from qiskit.visualization import plot_histogram
plot_histogram(job.result()["counts"])
Logy můžeš číst během běhu úlohy. Workflow nahrává nové řádky zhruba každých 15 sekund. Logy obsahují řádek, který workflow vypsalo:
print(job.logs())
Two-qubit depth after optimization: 2
# This cell is hidden from users. It checks the logs.
assert "Two-qubit depth after optimization" in job.logs()
Aktualizace workflow
Chceš-li workflow změnit, uprav jeho soubory a znovu zavolej upload() se stejným title. Nové nahrání nahradí předchozí a úlohy, které již začaly, nejsou ovlivněny.
Pole jako arguments_schema a sizes_map si ponechají uložené hodnoty, pokud je v novém nahrání vynecháš.
Další kroky
- Definuj vstupy a výstupy, abys zjistil, jaké typy argumentů a výsledků workflow podporuje.
- Deklaruj závislosti, abys ve svém workflow mohl používat další balíčky Pythonu.
- Spouštěj kvantové úlohy z workflow, abys spouštěl své obvody na QPU, hlásil jednotlivé fáze a sledoval úlohy QPU.
- Spusť managed workflow, abys poznal všechny stavy úloh, ladil neúspěšnou úlohu a později ji našel.
- Chceš-li začít z funkčního kódu, nasaď jednu ze šablon Qiskit Function nebo šablonu upravit pro své vlastní workflow.