ข้ามไปยังเนื้อหาหลัก

เขียนโปรแกรม Qiskit Serverless แรกของคุณ

เวอร์ชันของแพ็กเกจ

โค้ดในหน้านี้พัฒนาโดยใช้ requirements ต่อไปนี้ แนะนำให้ใช้เวอร์ชันเหล่านี้หรือใหม่กว่า

qiskit[all]~=1.3.1
qiskit-ibm-runtime~=0.34.0
qiskit-aer~=0.15.1
qiskit-serverless~=0.18.1
qiskit-ibm-catalog~=0.2
qiskit-addon-sqd~=0.8.1
qiskit-addon-utils~=0.1.0
qiskit-addon-mpf~=0.2.0
qiskit-addon-aqc-tensor~=0.1.2
qiskit-addon-obp~=0.1.0
scipy~=1.15.0
pyscf~=2.8.0

ตัวอย่างนี้สาธิตวิธีใช้เครื่องมือ qiskit-serverless เพื่อสร้างโปรแกรม transpilation แบบ parallel จากนั้นใช้ qiskit-ibm-catalog เพื่อ deploy โปรแกรมลง IBM Quantum Platform ให้ใช้เป็น remote service ที่นำกลับมาใช้ซ้ำได้

ตัวอย่าง: remote transpilation ด้วย Qiskit Serverless

เริ่มจากตัวอย่างต่อไปนี้ที่ Transpile circuit กับ backend และ optimization_level ที่กำหนด แล้วค่อย ๆ เพิ่มองค์ประกอบเพื่อ deploy workload ลง Qiskit Serverless

วาง code cell ต่อไปนี้ในไฟล์ ./source_files/transpile_remote.py ไฟล์นี้คือโปรแกรมที่จะอัปโหลดไปยัง Qiskit Serverless

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-catalog qiskit-ibm-runtime qiskit-serverless
# This cell is hidden from users, it just creates a new folder
from pathlib import Path

Path("./source_files").mkdir(exist_ok=True)
%%writefile ./source_files/transpile_remote.py

from qiskit.transpiler import generate_preset_pass_manager

def transpile_remote(circuit, optimization_level, backend):
"""Transpiles an abstract circuit into an ISA circuit for a given backend."""
pass_manager = generate_preset_pass_manager(
optimization_level=optimization_level,
backend=backend
)
isa_circuit = pass_manager.run(circuit)
return isa_circuit
Writing ./source_files/transpile_remote.py

ตั้งค่าไฟล์

Qiskit Serverless ต้องการให้ตั้งค่าไฟล์ .py ของ workload ลงในไดเรกทอรีที่กำหนด โครงสร้างต่อไปนี้เป็นตัวอย่างของ best practice:

serverless_program
├── program_uploader.ipynb
└── source_files
├── transpile_remote.py
└── *.py

Serverless จะอัปโหลดเนื้อหาใน source_files เพื่อรันจากระยะไกล เมื่อตั้งค่าเสร็จแล้ว สามารถปรับแต่ง transpile_remote.py เพื่อรับ input และคืน output ได้

รับ arguments ของโปรแกรม

transpile_remote.py เริ่มต้นมี input สามตัว ได้แก่ circuits, backend_name, และ optimization_level ปัจจุบัน Serverless รับได้เฉพาะ input และ output ที่ serialize ได้เท่านั้น ด้วยเหตุนี้จึงไม่สามารถส่ง backend โดยตรงได้ ให้ใช้ backend_name เป็น string แทน

%%writefile --append ./source_files/transpile_remote.py

from qiskit_serverless import get_arguments, save_result, distribute_task, get

# Get program arguments
arguments = get_arguments()
circuits = arguments.get("circuits")
backend_name = arguments.get("backend_name")
optimization_level = arguments.get("optimization_level")
Appending to ./source_files/transpile_remote.py

ตอนนี้สามารถรับ Backend ด้วย QiskitRuntimeService และเพิ่มโปรแกรมที่มีอยู่ได้ด้วยโค้ดต่อไปนี้ โค้ดนี้ต้องการให้บันทึก credentialsไว้ก่อนแล้ว

%%writefile --append ./source_files/transpile_remote.py

from qiskit_ibm_runtime import QiskitRuntimeService

service = QiskitRuntimeService()
backend = service.backend(backend_name)
Appending to ./source_files/transpile_remote.py

สุดท้าย รัน transpile_remote() กับทุก circuits ที่ส่งเข้ามา แล้วคืน transpiled_circuits เป็นผลลัพธ์:

%%writefile --append ./source_files/transpile_remote.py

results = [
transpile_remote(circuit, 1, backend)
for circuit in circuits
]

save_result({
"transpiled_circuits": results
})
Appending to ./source_files/transpile_remote.py

Deploy ลง IBM Quantum Platform

ส่วนก่อนหน้านี้สร้างโปรแกรมสำหรับรันจากระยะไกล code cell ในส่วนนี้จะอัปโหลดโปรแกรมนั้นไปยัง Qiskit Serverless

ใช้ qiskit-ibm-catalog เพื่อ authenticate กับ QiskitServerless ด้วย API key ซึ่งหาได้จาก IBM Quantum dashboard แล้วอัปโหลดโปรแกรม

สามารถใช้ save_account() เพื่อบันทึก credentials ได้ (ดูส่วน ตั้งค่าการใช้งาน IBM Cloud) โปรดทราบว่าการทำเช่นนี้จะเขียน credentials ลงไฟล์เดียวกับ QiskitRuntimeService.save_account()

from qiskit_ibm_catalog import QiskitServerless, QiskitFunction

# Authenticate to the remote cluster and submit the pattern for remote execution
serverless = QiskitServerless()

Qiskit Serverless จะบีบอัดเนื้อหาของ working_dir (ในกรณีนี้คือ source_files) เป็น tar แล้วอัปโหลดและลบออกหลังจากนั้น entrypoint ระบุไฟล์โปรแกรมหลักที่ Qiskit Serverless จะรัน นอกจากนี้ หากโปรแกรมมี pip dependencies แบบกำหนดเอง สามารถเพิ่มลงใน array dependencies ได้:

transpile_remote_demo = QiskitFunction(
title="transpile_remote_serverless",
entrypoint="transpile_remote.py",
working_dir="./source_files/",
)
serverless.upload(transpile_remote_demo)
QiskitFunction(transpile_remote_serverless)

หากต้องการตรวจสอบว่าอัปโหลดสำเร็จหรือไม่ ให้ใช้ serverless.list():

# Get program from serverless.list() that matches the title of the one we uploaded
next(
program
for program in serverless.list()
if program.title == "transpile_remote_serverless"
)
QiskitFunction(transpile_remote_serverless)
# This cell is hidden from users, it checks the program uploaded correctly
assert _.title == "transpile_remote_serverless" # noqa: F821
# This cell is hidden from users, it checks the program executes correctly
from time import sleep
from qiskit import QuantumCircuit

qc = QuantumCircuit(2)
transpile_remote_serverless = serverless.load("transpile_remote_serverless")
job = transpile_remote_serverless.run(
circuits=[qc],
backend="ibm_sherbrooke",
optimization_level=1,
)
while True:
sleep(5)
status = job.status()
if status not in ["QUEUED", "INITIALIZING", "RUNNING", "DONE"]:
raise Exception(
f"Unexpected job status: '{status}'\n"
+ "Here are the logs:\n"
+ job.logs()
)
if status == "DONE":
break

ขั้นตอนถัดไป

คำแนะนำ
Source: IBM Quantum docs — updated 27 เม.ย. 2569
English version on doQumentation — updated 7 พ.ค. 2569
This translation based on the English version of 11 มี.ค. 2569