Deploy managed workflow pertamamu
Versi paket
Kode di halaman ini dikembangkan dengan persyaratan berikut. Kami menyarankan untuk menggunakan versi ini atau yang lebih baru.
qiskit[all]~=2.6.1
qiskit-serverless~=0.38.0
Gunakan halaman ini untuk mengunggah workflow, menjalankannya, dan mengambil hasilnya. Contoh workflow ini mengoptimalkan dan mensimulasikan Circuit Qiskit. Workflow ini mensimulasikan Circuit pada hardware klasik, jadi tidak memakai waktu QPU.
Sebelum mulai, instal paket klien dan lakukan autentikasi.
Untuk men-deploy kodemu sendiri dengan bantuan asisten AI, gunakan AI skills di repositori Qiskit Function templates.
# 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")
Tulis workflow
Buat struktur folder
Managed workflow adalah folder berisi file Python dengan satu file entrypoint. Managed workflow mengunggah semua isi folder, hingga 50 MB, dan menjalankan entrypoint sebagai skrip. Karena workflow mengunggah seluruh folder, simpan file lokalmu, seperti deploy.ipynb, di luar folder tersebut. Buat tata letak berikut:
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
Tulis entrypoint hello world
Entrypoint membaca Circuit, mengoptimalkan dan mensimulasikannya, lalu menyimpan counts dan kedalaman dua qubit. Simpan kode berikut sebagai source_files/hello_world.py:
Jika kamu membaca halaman ini sebagai notebook, sel kode untuk hello_world.py diawali dengan magic command %%writefile. Saat kamu menjalankan sel ini, kode akan disimpan ke file, bukan dijalankan.
# 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
Entrypoint menggunakan tiga fungsi dari qiskit_serverless:
-
get_arguments()mengembalikan keyword argument yang kamu berikan kerun(), sebagai dictionary. Setiap nilai harus bisa diserialisasi ke JSON, atau berupa objek yang bisa di-encode oleh klien, sepertiQuantumCircuit. Objek yang di-encode tiba sebagai objek yang sama dengan yang kamu berikan. -
update_status(Job.OPTIMIZING_HARDWARE)menetapkan status detailRUNNING: OPTIMIZING_FOR_HARDWARE, yang bisa kamu lihat saat job berjalan. Lihat Laporkan progres dengan update_status(). -
save_result()menyimpan nilai yang bisa diserialisasi ke JSON yang kamu baca nanti denganjob.result(). Workflow ini mengembalikan counts sebagai dictionary dan kedalaman dua qubit dari Circuit yang sudah dioptimalkan sebagai bilangan bulat.
Semua yang ditulis workflow ke standard output, seperti kedalaman dua qubit, masuk ke log job. Untuk menambahkan timestamp dan level log, gunakan modul logging. Lihat Tulis log dan tangani error.
Unggah workflow
Di notebook lokalmu, jalankan kode berikut dari folder hello_world_project. Kode ini terhubung dengan akun tersimpanmu, mendefinisikan workflow, dan mengunggahnya. entrypoint adalah file yang dijalankan workflow, dan working_dir adalah folder yang kamu unggah:
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)
Jalankan workflow dengan input
Bangun Circuit GHZ tiga qubit untuk diberikan ke hello_world sebagai input:
from qiskit import QuantumCircuit
circuit = QuantumCircuit(3)
circuit.h(0)
circuit.cx(0, 1)
circuit.cx(1, 2)
circuit.measure_all()
Jalankan hello_world dengan Circuit dan jumlah shot sebagai keyword argument. Nama argumen cocok dengan key yang dibaca entrypoint dengan get_arguments():
job = hello_world.run(circuit=circuit, shots=1024)
print(job.job_id)
54705348-5117-44b7-935b-e6986ef182fa
run() mengembalikan Job setelah workflow memasukkan job ke antrean. Ia tidak menunggu job berjalan. Job terus berjalan di cloud setelah kamu menutup sesi Python. Untuk menemukannya lagi nanti, tampilkan daftar job terbaru kamu dengan client.jobs().
Ambil status, hasil, dan log
Tepat setelah kamu memanggil run(), statusnya biasanya QUEUED:
job.status()
'QUEUED'
Status berubah dari QUEUED ke INITIALIZING, RUNNING, lalu DONE.
job.result() menunggu sampai job selesai, lalu mengembalikan nilai yang diberikan workflow ke 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"])
Kamu bisa membaca log selagi job berjalan. Workflow mengunggah baris baru sekitar setiap 15 detik. Log menyertakan baris yang dicetak workflow:
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()
Perbarui workflow
Untuk mengubah workflow, edit file-filenya dan panggil upload() lagi dengan title yang sama. Unggahan baru menggantikan yang sebelumnya, dan job yang sudah dimulai tidak terpengaruh.
Field seperti arguments_schema dan sizes_map mempertahankan nilai tersimpannya saat kamu menghilangkannya dari unggahan baru.
Langkah berikutnya
- Tentukan input dan output untuk mempelajari tipe argumen dan hasil apa saja yang didukung workflow.
- Deklarasikan dependensi untuk menggunakan lebih banyak paket Python di workflow kamu.
- Jalankan job kuantum dari workflow untuk menjalankan Circuit kamu di QPU, melaporkan setiap tahap, dan melacak job QPU.
- Jalankan managed workflow untuk mempelajari semua status job, men-debug job yang gagal, dan menemukan job nanti.
- Untuk memulai dari kode yang sudah jalan, deploy salah satu Qiskit Function templates, atau adaptasi template untuk workflow kamu sendiri.