Lewati ke konten utama
Proyek ini masih dalam tahap beta. Menemukan bug? Buat isu GitHub. Punya pertanyaan atau ide? Tanya di Discussions — kami sangat menghargai masukan kamu!
Bagaimana kualitas terjemahan di halaman ini?

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.

Gunakan AI skills (opsional)

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:

catatan

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 ke run(), sebagai dictionary. Setiap nilai harus bisa diserialisasi ke JSON, atau berupa objek yang bisa di-encode oleh klien, seperti QuantumCircuit. Objek yang di-encode tiba sebagai objek yang sama dengan yang kamu berikan.

  • update_status(Job.OPTIMIZING_HARDWARE) menetapkan status detail RUNNING: 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 dengan job.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"])

Output of the previous code cell

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​

Rekomendasi