ข้ามไปยังเนื้อหาหลัก
โครงการนี้อยู่ในช่วงเบต้า พบข้อผิดพลาด? สร้าง GitHub Issue มีคำถามหรือไอเดีย? ถามใน Discussions — ยินดีรับฟังความคิดเห็น!
คุณภาพการแปลในหน้านี้เป็นอย่างไร?

รัน quantum job จาก workflow

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

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

qiskit[all]~=2.6.1
qiskit-ibm-runtime~=0.51.0
qiskit-serverless~=0.38.0

quantum-classical workflow รันเป็น managed workflow job หนึ่งตัว ขั้นตอนแบบคลาสสิกของ workflow รันบน compute profile ของคุณ ส่วน primitive job ที่ workflow ส่งไปยัง IBM Quantum® QPU จะรันบน instance ของคุณและนับรวมในการใช้งานของคุณ จาก job เดียวนี้ คุณสามารถรายงานแต่ละขั้นตอน ค้นหา QPU job และยกเลิก job เหล่านั้นได้ หากต้องการเริ่ม job และตรวจสอบสถานะและ log ของ job ดู รัน managed workflow

ก่อนเริ่ม ให้ปรับใช้ managed workflow แรกของคุณ

สร้าง Runtime service​

สร้าง Runtime service ในโค้ด workflow ของคุณด้วย get_runtime_service() และใช้งานแบบเดียวกับที่คุณใช้ QiskitRuntimeService ในเครื่อง workflow ต่อไปนี้รัน Bell circuit ด้วย Sampler primitive รายงานแต่ละขั้นตอนด้วย update_status() และคืนค่า counts:

# 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_ibm_runtime": "qiskit-ibm-runtime", "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")
# 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/my_workflow.py
from qiskit import QuantumCircuit
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime.executor_sampler import Sampler
from qiskit_serverless import (
Job,
get_arguments,
get_runtime_service,
save_result,
update_status,
)

arguments = get_arguments()

service = get_runtime_service()
backend = service.backend(arguments["backend_name"])

circuit = QuantumCircuit(2)
circuit.h(0)
circuit.cx(0, 1)
circuit.measure_all()

update_status(Job.OPTIMIZING_HARDWARE)
pass_manager = generate_preset_pass_manager(optimization_level=1, backend=backend)
isa_circuit = pass_manager.run(circuit)

update_status(Job.WAITING_QPU)
sampler = Sampler(mode=backend)
primitive_job = sampler.run([isa_circuit])
counts = primitive_job.result()[0].data.meas.get_counts()

update_status(Job.POST_PROCESSING)
save_result({"backend": backend.name, "counts": counts})
Overwriting ./source_files/my_workflow.py

get_runtime_service() คืน QiskitRuntimeService ที่ตั้งค่าไว้สำหรับ managed workflow job ของคุณ และมีสิ่งต่อไปนี้:

  • Credentials Runtime service ใช้ API key, instance และ channel ที่คุณใช้เรียก run() ดังนั้นโค้ด workflow ไม่ต้องใช้ credentials

  • การติดตาม workflow จะบันทึก primitive job ทุกตัวที่รันผ่าน Runtime service นี้ไว้ภายใต้ managed workflow job รวมถึง Sampler, Estimator และ Executor job และ job ใน session หรือ batch คุณแสดงรายการเหล่านั้นได้ด้วย job.runtime_jobs()

  • การยกเลิก เมื่อคุณเรียก job.cancel() managed workflow จะยกเลิก session, batch และ primitive job ของ workflow ที่ยังรันอยู่ด้วย

managed workflow ไม่ติดตามหรือยกเลิก job ของ service ที่คุณสร้างด้วย QiskitRuntimeService() แม้ว่า job เหล่านั้นจะยังรันอยู่ ถ้า workflow ต้องใช้ service อื่น ให้ยกเลิก job ของ service นั้นใน SIGTERM handler

รัน primitive ใน session หรือ batch​

managed workflow ยังติดตาม primitive job ที่รันใน session หรือ batch ด้วย ให้สร้าง session หรือ batch จาก backend ที่ Runtime service คืนมา และสร้าง primitive ภายในบล็อก with Session ใช้งานแบบเดียวกัน:

source_files/my_workflow.py

from qiskit_ibm_runtime import Batch

with Batch(backend=backend) as batch:
sampler = Sampler(mode=batch)
primitive_jobs = [sampler.run([isa_circuit]) for _ in range(2)]
results = [primitive_job.result() for primitive_job in primitive_jobs]

รายงานความคืบหน้าด้วย update_status()​

workflow ใน สร้าง Runtime service เรียก update_status() ตอนเริ่มแต่ละขั้นตอน เพื่อให้สถานะ job แสดงว่า workflow อยู่ที่ไหน เช่น RUNNING: WAITING_FOR_QPU ส่งค่าคงที่ Job ตัวใดตัวหนึ่งต่อไปนี้:

การเรียกใน workflowสถานะ job
update_status(Job.MAPPING)RUNNING: MAPPING
update_status(Job.OPTIMIZING_HARDWARE)RUNNING: OPTIMIZING_FOR_HARDWARE
update_status(Job.WAITING_QPU)RUNNING: WAITING_FOR_QPU
update_status(Job.EXECUTING_QPU)RUNNING: EXECUTING_QPU
update_status(Job.POST_PROCESSING)RUNNING: POST_PROCESSING

update_status() คืน True ถ้า workflow เปลี่ยนสถานะ และคืน False พร้อมเขียนคำเตือนลงใน log ถ้าค่าที่ส่งไม่ใช่ค่าคงที่เหล่านี้ ถ้า job ไม่ได้ทำงานอยู่แล้ว หรือถ้าโค้ดรันนอก job ฟังก์ชันนี้ไม่ทำให้เกิดข้อผิดพลาด ดังนั้นการพิมพ์ผิดจะไม่หยุด workflow

สำหรับความคืบหน้าภายในขั้นตอนหนึ่ง เช่นรอบการทำงานของ optimizer ให้เขียนบรรทัด log

ค้นหา QPU job ของการรัน​

ใน notebook ในเครื่องของคุณ ให้เลือก QPU ที่ instance ของคุณเข้าถึงได้ client.backends() แสดงรายการ QPU เหล่านั้น และ client.least_busy() คืน QPU ที่มี job ค้างน้อยที่สุด:

from qiskit_ibm_catalog import ManagedWorkflowClient

client = ManagedWorkflowClient()
print([backend.name for backend in client.backends(simulator=False)])

backend_name = client.least_busy(operational=True, simulator=False).name
['ibm_boston', 'ibm_fez', 'ibm_kingston', 'ibm_marrakesh', 'ibm_phoenix', 'ibm_pittsburgh']

อัปโหลด workflow และส่งชื่อของ backend เมื่อรัน:

from qiskit_ibm_catalog import ManagedWorkflow

my_workflow = client.upload(
ManagedWorkflow(
title="my-workflow",
entrypoint="my_workflow.py",
working_dir="./source_files/",
)
)

job = my_workflow.run(backend_name=backend_name)
# This cell is hidden from users. It waits for the job to finish.
assert job.wait_for_final_state() == "DONE", job.logs()

หลังจาก job สิ้นสุด ให้ดึง ID ของ QPU job ของ workflow จาก managed workflow job:

runtime_job_ids = job.runtime_jobs()
runtime_job_ids
['dbl6lst8ft8s738secf0']
# This cell is hidden from users. It checks the tracked job.
assert len(runtime_job_ids) == 1, runtime_job_ids

แต่ละ ID คือ ID ของ primitive job ปกติ หากต้องการอ่านสถานะและผลลัพธ์ของ job ดู ดึงผลลัพธ์ของ job ภายหลัง ถ้า workflow รัน primitive ใน session หรือ batch ให้แสดงรายการ ID ของ session และ batch ด้วย runtime_sessions() และส่ง ID หนึ่งให้ runtime_jobs() เพื่อรับเฉพาะ job ในนั้น:

run_workflow_remotely.ipynb

for session_id in job.runtime_sessions():
print(session_id, job.runtime_jobs(session_id))
dc101077-d085-40fb-8fbe-78852e355994 ['dbjqp48nceqs73aki1k0', 'dbjqp4l6p51s73clb91g']

ออบเจ็กต์ job มีอยู่เฉพาะใน notebook ที่เริ่มการรัน ใน notebook ใหม่ ให้ดึง job อีกครั้งด้วย client.job("<your-job-id>") แล้วเรียก runtime_jobs() บน job นั้น ดู ค้นหา job จาก session ใหม่

สำหรับการใช้งาน QPU และเวลารันของแต่ละ QPU job ดู ดูเมตริกของ job สำหรับการใช้งานของทั้ง instance ในช่วงเวลาปัจจุบัน ให้เรียก client.usage() หากต้องการดูว่าแต่ละขั้นตอนของ managed workflow job ใช้เวลานานเท่าใด ดู ตรวจสอบว่าแต่ละขั้นตอนใช้เวลานานเท่าใด

ยกเลิก QPU job ที่เชื่อมโยง​

เมื่อคุณยกเลิก managed workflow job ด้วย job.cancel() workflow จะพยายามยกเลิกงาน QPU ที่ workflow เริ่มไว้ด้วย:

  • Session และ batch workflow ยกเลิกแต่ละ session และ batch ของ workflow ซึ่งจะยกเลิก job ที่อยู่ในคิวของสิ่งเหล่านั้นด้วย

  • primitive job อื่น ๆ workflow ยกเลิก primitive job อื่นของ workflow ทุกตัวที่ยังอยู่ในคิวหรือกำลังรัน

job.cancel() คืนข้อความสำหรับแต่ละ QPU job และ session เพื่อให้คุณตรวจสอบได้ว่ายกเลิกอะไรไปบ้าง:

run_workflow_remotely.ipynb

print(job.cancel())

สำหรับ workflow ที่รันใน batch ข้อความจะมีลักษณะดังนี้:

Job is stopping. Canceled runtime session: eb8874c9-a15e-45f8-9a90-a9fb35267f9d and associated runtime jobs.

ถ้า client สร้าง QiskitRuntimeService จาก credentials ในเครื่องของคุณไม่ได้ ระบบจะยกเลิกเฉพาะ managed workflow job ให้ยกเลิก QPU job ด้วยตัวเองโดยใช้ ID จาก job.runtime_jobs()

เมื่อ workflow หยุด job เอง เช่นเพราะถึงขีดจำกัด 24 ชั่วโมง ระบบจะไม่ยกเลิก QPU job ของ job นั้น ให้ยกเลิกด้วยตัวเองโดยใช้ ID จาก job.runtime_jobs()

แก้ปัญหา QPU job ใน workflow​

ปัญหาสาเหตุ
get_runtime_service() ทำให้เกิด KeyError: 'QISKIT_IBM_CHANNEL'โค้ดรันใน notebook ในเครื่องของคุณ ไม่ใช่ใน managed workflow job ให้ใช้ QiskitRuntimeService() ในเครื่อง
update_status() คืน False และ log แสดง 'sub_status' not provided or is not validค่าที่ส่งไม่ใช่ค่าคงที่ Job หรือ job ไม่ได้ทำงานอยู่แล้ว
job.runtime_jobs() คืน []workflow สร้าง service ด้วย QiskitRuntimeService() หรือยังไม่ได้รัน primitive
ไม่ติดตาม job ของ sessionsession ถูกสร้างจาก backend ของ service อื่น ให้ดึง backend จาก get_runtime_service()
log ของ workflow แสดง Could not associate runtime job with serverless jobworkflow บันทึก primitive job ไม่ได้ primitive job ยังรันอยู่ แต่ไม่ถูกติดตาม
job.cancel() แสดง No QiskitRuntimeService can be associated to the given token and instance.client สร้าง QiskitRuntimeService จาก credentials ในเครื่องของคุณไม่ได้ จึงยกเลิกเฉพาะ managed workflow job
client.job() ล้มเหลวพร้อม Job [...] not foundID ของ job ไม่ถูกต้อง หรือ job เป็นของผู้ใช้อื่น

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

คำแนะนำ
  • รัน managed workflow เพื่อตรวจสอบสถานะ ผลลัพธ์ และ log ของ job และหาสาเหตุของข้อผิดพลาด