เริ่มต้นใช้งาน Sampler
งานหลักของ Sampler คือการสุ่มตัวอย่าง output register จากการรัน quantum circuits หนึ่งรายการหรือมากกว่า Dynamic circuits และ parameterized circuits ถูกรับเป็น input (ถ้าส่ง parametrized circuits ต้องระบุค่า parameter ด้วย) Sampler ยังรองรับ dynamical decoupling และ twirling ในตัวสำหรับ error suppression
ขั้นตอนในหัวข้อนี้อธิบายวิธีตั้งค่า Sampler สำรวจตัวเลือกที่ใช้กำหนดค่า และเรียกใช้ในโปรแกรม
qiskit-ibm-runtime v0.50.0 เพิ่ม implementation ใหม่ของ interface SamplerV2 และ EstimatorV2 ของ Qiskit client-side primitives เหล่านี้ทำ pre-processing และ post-processing ส่วนใหญ่บน client side และมอบหมายการ execute ให้กับ Executor primitive การรันบน client side ให้ความโปร่งใสมากขึ้น การตอบสนองในการ debug ที่เร็วขึ้น และการควบคุมที่ละเอียดขึ้น
เนื่องจาก primitives ฝั่ง client เหล่านี้ implement API เดียวกับ primitives ฝั่ง server แบบเดิม จึงนำไปใช้แทน primitives ฝั่ง server แบบเดิมได้ทันทีเกือบทั้งหมด โดยมีการเปลี่ยนแปลงเพียงอย่างเดียวคือ import statement ดู Migrate from server-side to client-side Sampler and Estimator สำหรับข้อมูลเพิ่มเติม
เวอร์ชันแพ็กเกจ
โค้ดในหน้านี้พัฒนาโดยใช้ requirements ต่อไปนี้ แนะนำให้ใช้เวอร์ชันเหล่านี้หรือใหม่กว่า
qiskit[all]~=2.5.2
qiskit-ibm-runtime~=0.47.0
ขั้นตอนการใช้ Sampler primitive
1. เริ่มต้นบัญชี
คุณต้องเริ่มต้นบัญชีของคุณก่อน จากนั้นจึงเลือก QPU ที่ต้องการใช้
ทำตามขั้นตอนใน ตั้งค่าบัญชี IBM Cloud หากยังไม่มีบัญชีที่ตั้งค่าไว้
เพื่อใช้ fractional gates ที่รองรับใหม่ ให้ตั้งค่า use_fractional_gates=True เมื่อขอ backend จาก QiskitRuntimeService instance ตัวอย่างเช่น:
service = QiskitRuntimeService()
fractional_gate_backend = service.least_busy(use_fractional_gates=True)
นี่เป็นฟีเจอร์ทดลองและอาจเปลี่ยนแปลงในอนาคต
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"numpy": "numpy", "qiskit": "qiskit", "qiskit_ibm_runtime": "qiskit-ibm-runtime"}
_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")
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, simulator=False, min_num_qubits=127
)
2. สร้าง circuit
คุณต้องมีอย่างน้อยหนึ่ง circuit เป็น input ให้ Sampler primitive
import numpy as np
from qiskit.circuit.library import efficient_su2
circuit = efficient_su2(127, entanglement="linear")
circuit.measure_all()
# The circuit is parametrized, so we will define the parameter values for execution
param_values = np.random.rand(circuit.num_parameters)
ต้องแปลง circuit และ observable ให้ใช้เฉพาะคำสั่งที่ QPU รองรับ (เรียกว่า instruction set architecture (ISA) circuits) ใช้ transpiler เพื่อทำสิ่งนี้
from qiskit.transpiler import generate_preset_pass_manager
pm = generate_preset_pass_manager(optimization_level=1, backend=backend)
isa_circuit = pm.run(circuit)
print(f">>> Circuit ops (ISA): {isa_circuit.count_ops()}")
>>> Circuit ops (ISA): OrderedDict([('rz', 3036), ('sx', 1769), ('cz', 378), ('measure', 127), ('barrier', 1)])
3. เริ่มต้น IBM Quantum Sampler
เมื่อเริ่มต้น Sampler ใช้พารามิเตอร์ mode เพื่อระบุโหมดที่ต้องการรัน ค่าที่เป็นไปได้คือ batch, session หรือ backend objects สำหรับ batch, session และ job execution mode ตามลำดับ สำหรับข้อมูลเพิ่มเติม ดู Introduction to IBM Quantum Compute Service execution modes โปรดทราบว่าผู้ใช้ Open Plan ไม่สามารถส่ง session jobs ได้
# Legacy server-side primitive before qiskit-ibm-runtime 0.50.0
# from qiskit_ibm_runtime import Sampler
# Client-side primitive introduced in qiskit-ibm-runtime 0.50.0
from qiskit_ibm_runtime.executor_sampler import Sampler
sampler = Sampler(mode=backend)
4. เรียกใช้ Sampler และรับผลลัพธ์
จากนั้น เรียกใช้เมธอด run() เพื่อสร้าง output โดย circuit และชุดค่า parameter ที่เป็นตัวเลือก (optional) ถูกป้อนเป็น primitive unified bloc (PUB) tuples
job = sampler.run([(isa_circuit, param_values)])
print(f">>> Job ID: {job.job_id()}")
print(f">>> Job Status: {job.status()}")
>>> Job ID: dab7lb6rrl7c7386gjgg
>>> Job Status: QUEUED
result = job.result()
# Get results for the first (and only) PUB
pub_result = result[0]
print(
f"First ten results for the 'meas' output register: "
f"{pub_result.data.meas.get_bitstrings()[:10]}"
)
First ten results for the 'meas' output register: ['1110001000100100100111011000001001000101010000001100010010110011001100110111100000000110001000011001101000110100101110101010011', '1110101100010101010001010111111011000110011010100101001100110101010010101010101110001010100100000000011110101101011000100000100', '1100110011101000110000000100110111101010110001100010111100001101100001010100111001101010101110000101010001001101010101001000100', '1011001001011000000101010111111010011101001111010100001011110011000101110101011001100110011011110011101010000111001111110110011', '1110111011011111101011110101110101010110011001100110101111100100011101100011011100101100101001001111110101111010101110111111011', '0101001110001110010001010100010111011001000000011110000000000001110000010010101101011001000100000001011011101111010010110111110', '1101101001000100010000110001000101010010101011000011000011001010000111100110010101010110100110011010101100001011100110001111011', '1000110011111111100010101010101111001001100001110111101001100111010101010111110110011000110011010010010000100000100010010010101', '0101010100110011110011010000000100011001111100101100101100101111101110100001101101111010100011011000010011111010001100110000010', '0010000111011100000000110000001110001100010011000100101110111111100011001100011001101010011111111100000000011100101101111010100']
ขั้นตอนถัดไป
- เรียนรู้วิธี ทดสอบในเครื่อง ก่อนรันบนคอมพิวเตอร์ควอนตัม
- ดูตัวอย่างโดยละเอียด
- ฝึกใช้ primitives โดยทำ Cost function lesson ใน IBM Quantum Learning
- เรียนรู้วิธี transpile ในเครื่องในส่วน Transpile
- ลองทำคู่มือ Compare transpiler settings
- เรียนรู้วิธี ใช้ primitive options
- ดู API สำหรับตัวเลือก Sampler