ปรับใช้ managed workflow แรกของคุณ
เวอร์ชันของแพ็กเกจ
โค้ดในหน้านี้พัฒนาโดยใช้ข้อกำหนดต่อไปนี้ เราแนะนำให้ใช้เวอร์ชันเหล่านี้หรือใหม่กว่า
qiskit[all]~=2.6.1
qiskit-serverless~=0.38.0
ใช้หน้านี้เพื่ออัปโหลด workflow รัน และรับผลลัพธ์ workflow ตัวอย่างจะ optimize และจำลอง Circuit ของ Qiskit โดยจำลอง Circuit บนฮาร์ดแวร์คลาสสิก จึงไม่ใช้เวลา QPU
ก่อนเริ่ม ให้ติดตั้งแพ็กเกจ client และยืนยันตัวตน
หากต้องการปรับใช้โค้ดของคุณเองโดยมีผู้ช่วย AI ช่วย ให้ใช้ AI skills ใน Qiskit Function templates repository
# 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")
เขียน workflow
สร้างโครงสร้างโฟลเดอร์
Managed workflow คือโฟลเดอร์ของไฟล์ Python ที่มีไฟล์ entrypoint หนึ่งไฟล์ Managed workflow อัปโหลดทุกอย่างในโฟลเดอร์ ไม่เกิน 50 MB และรัน entrypoint เป็นสคริปต์ เนื่องจาก workflow อัปโหลดทั้งโฟลเดอร์ ให้เก็บไฟล์ในเครื่องของคุณ เช่น deploy.ipynb ไว้นอกโฟลเดอร์ สร้างโครงสร้างดังต่อไปนี้:
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
เขียน entrypoint แบบ hello world
Entrypoint อ่าน Circuit, optimize และจำลอง จากนั้นบันทึก counts และ two-qubit depth บันทึกโค้ดต่อไปนี้เป็น source_files/hello_world.py:
หากคุณอ่านหน้านี้ในรูปแบบ notebook โค้ดเซลล์สำหรับ hello_world.py จะขึ้นต้นด้วย magic command %%writefile เมื่อคุณรันเซลล์นี้ มันจะบันทึกโค้ดลงไฟล์แทนที่จะรันโค้ด
# 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 ใช้สามฟังก์ชันจาก qiskit_serverless:
-
get_arguments()ส่งคืน keyword argument ที่คุณส่งให้run()เป็น dictionary แต่ละค่าต้อง serialize เป็น JSON ได้ หรือเป็นอ็อบเจกต์ที่ client เข้ารหัสได้ เช่นQuantumCircuitอ็อบเจกต์ที่เข้ารหัสจะมาถึงเป็นอ็อบเจกต์เดียวกับที่คุณส่งไป -
update_status(Job.OPTIMIZING_HARDWARE)ตั้งสถานะแบบละเอียดเป็นRUNNING: OPTIMIZING_FOR_HARDWAREซึ่งคุณเห็นได้ขณะ Job กำลังรัน ดู Report progress with update_status() -
save_result()เก็บค่าที่ serialize เป็น JSON ได้ ซึ่งคุณอ่านภายหลังด้วยjob.result()workflow ส่งคืน counts เป็น dictionary และ two-qubit depth ของ Circuit ที่ optimize แล้วเป็นจำนวนเต็ม
ทุกอย่างที่ workflow เขียนไปยัง standard output เช่น two-qubit depth จะไปที่ log ของ Job หากต้องการเพิ่ม timestamp และระดับ log ให้ใช้โมดูล logging ดู Write logs and handle errors
อัปโหลด workflow
ใน notebook ในเครื่องของคุณ ให้รันโค้ดต่อไปนี้จากโฟลเดอร์ hello_world_project โค้ดจะเชื่อมต่อกับบัญชีที่คุณบันทึกไว้ กำหนด workflow และอัปโหลด entrypoint คือไฟล์ที่ workflow รัน และ working_dir คือโฟลเดอร์ที่คุณอัปโหลด:
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)
รัน workflow พร้อมอินพุต
สร้าง Circuit GHZ สาม Qubit เพื่อส่งให้ hello_world เป็นอินพุต:
from qiskit import QuantumCircuit
circuit = QuantumCircuit(3)
circuit.h(0)
circuit.cx(0, 1)
circuit.cx(1, 2)
circuit.measure_all()
รัน hello_world โดยส่ง Circuit และจำนวน shot เป็น keyword argument ชื่อ argument ตรงกับ key ที่ entrypoint อ่านด้วย get_arguments():
job = hello_world.run(circuit=circuit, shots=1024)
print(job.job_id)
54705348-5117-44b7-935b-e6986ef182fa
run() ส่งคืน Job หลังจาก workflow จัดคิว Job แล้ว โดยไม่รอให้ Job รัน Job ทำงานต่อบนคลาวด์หลังจากคุณปิด Python session หากต้องการค้นหาอีกครั้งภายหลัง ให้แสดงรายการ Job ล่าสุดของคุณด้วย client.jobs()
รับสถานะ ผลลัพธ์ และ log
ทันทีหลังจากที่คุณเรียก run() สถานะมักเป็น QUEUED:
job.status()
'QUEUED'
สถานะเปลี่ยนจาก QUEUED เป็น INITIALIZING, RUNNING และสุดท้ายเป็น DONE
job.result() รอจนกว่า Job จะสิ้นสุด จากนั้นส่งคืนค่าที่ workflow ส่งให้ 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"])
คุณอ่าน log ได้ขณะ Job กำลังรัน workflow อัปโหลดบรรทัดใหม่ประมาณทุก 15 วินาที log รวมบรรทัดที่ 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()
อัปเดต workflow
หากต้องการเปลี่ยน workflow ให้แก้ไขไฟล์และเรียก upload() อีกครั้งด้วย title เดิม การอัปโหลดใหม่จะแทนที่อันก่อนหน้า และ Job ที่เริ่มไปแล้วจะไม่ได้รับผลกระทบ
ฟิลด์ต่างๆ เช่น arguments_schema และ sizes_map จะคงค่าที่เก็บไว้เดิมเมื่อคุณละไว้ในการอัปโหลดใหม่
ขั้นตอนถัดไป
- กำหนดอินพุตและเอาต์พุตเพื่อเรียนรู้ว่า workflow รองรับ argument และผลลัพธ์ชนิดใดบ้าง
- ประกาศ dependencyเพื่อใช้แพ็กเกจ Python เพิ่มเติมใน workflow ของคุณ
- รัน Job ควอนตัมจาก workflowเพื่อรัน Circuit ของคุณบน QPU รายงานแต่ละขั้นตอน และติดตาม Job ของ QPU
- รัน managed workflowเพื่อเรียนรู้สถานะของ Job ทั้งหมด ดีบัก Job ที่ล้มเหลว และค้นหา Job ภายหลัง
- หากต้องการเริ่มจากโค้ดที่ใช้งานได้ ให้ปรับใช้หนึ่งใน Qiskit Function templates หรือดัดแปลง template สำหรับ workflow ของคุณเอง