Deploy managed workflow pertama anda
Versi pakej
Kod pada halaman ini dibangunkan menggunakan keperluan berikut. Kami mengesyorkan penggunaan versi ini atau yang lebih baharu.
qiskit[all]~=2.6.1
qiskit-serverless~=0.38.0
Gunakan halaman ini untuk memuat naik workflow, menjalankannya, dan mendapatkan keputusannya. Contoh workflow ini mengoptimumkan dan mensimulasikan litar Qiskit. Ia mensimulasikan litar pada perkakasan klasik, jadi ia tidak menggunakan masa QPU.
Sebelum anda bermula, pasang pakej klien dan sahkan identiti.
Untuk mendeploy kod anda sendiri dengan bantuan pembantu AI, gunakan kemahiran AI dalam repositori templat 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")
Tulis workflow
Cipta struktur folder
Sebuah managed workflow ialah folder fail Python dengan satu fail titik masuk. Managed workflow memuat naik segala-galanya dalam folder, sehingga 50 MB, dan menjalankan titik masuk sebagai skrip. Oleh sebab workflow memuat naik seluruh folder, simpan fail tempatan anda, seperti deploy.ipynb, di luar folder tersebut. Cipta susun atur 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 titik masuk hello world
Titik masuk membaca litar, mengoptimumkan dan mensimulasikannya, serta menyimpan kiraan dan kedalaman dua-qubit. Simpan kod berikut sebagai source_files/hello_world.py:
Jika anda membaca halaman ini sebagai notebook, sel kod untuk hello_world.py bermula dengan arahan ajaib %%writefile. Apabila anda menjalankan sel ini, ia menyimpan kod ke dalam fail dan bukannya menjalankan kod tersebut.
# 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
Titik masuk menggunakan tiga fungsi daripada qiskit_serverless:
-
get_arguments()mengembalikan argumen kata kunci yang anda hantar kepadarun(), sebagai kamus. Setiap nilai mestilah boleh diserialisasi JSON, atau objek yang boleh dikodkan oleh klien, sepertiQuantumCircuit. Objek yang dikodkan tiba sebagai objek yang sama seperti yang anda hantar. -
update_status(Job.OPTIMIZING_HARDWARE)menetapkan status terperinciRUNNING: OPTIMIZING_FOR_HARDWARE, yang boleh anda lihat semasa job berjalan. Lihat Laporkan kemajuan dengan update_status(). -
save_result()menyimpan nilai yang boleh diserialisasi JSON yang anda baca kemudian denganjob.result(). Workflow mengembalikan kiraan sebagai kamus dan kedalaman dua-qubit bagi litar yang dioptimumkan sebagai integer.
Apa-apa sahaja yang ditulis oleh workflow ke output standard, seperti kedalaman dua-qubit, akan masuk ke log job. Untuk menambah cap masa dan tahap log, gunakan modul logging. Lihat Tulis log dan kendalikan ralat.
Muat naik workflow
Dalam notebook tempatan anda, jalankan kod berikut daripada folder hello_world_project. Kod ini bersambung dengan akaun tersimpan anda, mentakrifkan workflow, dan memuat naiknya. entrypoint ialah fail yang dijalankan oleh workflow, dan working_dir ialah folder yang anda muat naik:
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
Bina litar GHZ tiga-qubit untuk dihantar kepada 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 litar dan bilangan shot sebagai argumen kata kunci. Nama argumen sepadan dengan kunci yang dibaca oleh titik masuk dengan get_arguments():
job = hello_world.run(circuit=circuit, shots=1024)
print(job.job_id)
54705348-5117-44b7-935b-e6986ef182fa
run() mengembalikan Job selepas workflow meletakkan job dalam baris gilir. Ia tidak menunggu job berjalan. Job diteruskan dalam awan selepas anda menutup sesi Python anda. Untuk mencarinya semula kemudian, senaraikan job terkini anda dengan client.jobs().
Dapatkan status, keputusan, dan log
Sejurus selepas anda memanggil run(), status biasanya QUEUED:
job.status()
'QUEUED'
Status berubah daripada QUEUED kepada INITIALIZING, RUNNING, dan kemudian DONE.
job.result() menunggu sehingga job tamat, kemudian mengembalikan nilai yang dihantar oleh workflow kepada 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"])
Anda boleh membaca log semasa job berjalan. Workflow memuat naik baris baharu kira-kira setiap 15 saat. Log merangkumi baris yang dicetak oleh 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()
Kemas kini workflow
Untuk menukar workflow, edit failnya dan panggil upload() sekali lagi dengan title yang sama. Muat naik baharu menggantikan yang terdahulu, dan job yang telah bermula tidak terjejas.
Medan seperti arguments_schema dan sizes_map mengekalkan nilai tersimpannya apabila anda mengabaikannya daripada muat naik baharu.
Langkah seterusnya
- Takrifkan input dan output untuk mengetahui jenis argumen dan keputusan yang disokong oleh workflow.
- Isytiharkan kebergantungan untuk menggunakan lebih banyak pakej Python dalam workflow anda.
- Jalankan job kuantum daripada workflow untuk menjalankan litar anda pada QPU, melaporkan setiap peringkat, dan menjejak job QPU.
- Jalankan managed workflow untuk mempelajari semua status job, menyahpepijat job yang gagal, dan mencari job kemudian.
- Untuk bermula daripada kod yang berfungsi, deploy salah satu templat Qiskit Function, atau sesuaikan templat untuk workflow anda sendiri.