Local testing mode
เวอร์ชันของแพ็กเกจ
โค้ดในหน้านี้พัฒนาโดยใช้ requirements ต่อไปนี้ แนะนำให้ใช้เวอร์ชันเหล่านี้หรือใหม่กว่า
qiskit[all]~=2.5.2
qiskit-ibm-runtime~=0.47.0
qiskit-aer~=0.17
ใช้ local testing mode (มีให้ใช้กับ qiskit-ibm-runtime v0.22.0 หรือใหม่กว่า) เพื่อทดสอบโปรแกรมก่อนที่จะปรับแต่งและส่งไปยังฮาร์ดแวร์ควอนตัมจริง หลังจากใช้ local testing mode เพื่อยืนยันโปรแกรมแล้ว สิ่งที่ต้องเปลี่ยนคือชื่อ Backend เท่านั้นเพื่อรันบน QPU
รองรับ local mode สำหรับ Executor primitive ตั้งแต่ qiskit-ibm-runtime v0.50.0
ในการใช้ local testing mode ให้ระบุ fake backends จาก qiskit_ibm_runtime.fake_provider หรือระบุ Qiskit Aer Backend เมื่อสร้าง IBM Quantum® primitive หรือ Session
-
Fake backends: fake backends ใน
qiskit_ibm_runtime.fake_providerจำลองพฤติกรรมของ IBM® QPUs โดยใช้ QPU snapshots ซึ่ง QPU snapshots มีข้อมูลสำคัญเกี่ยวกับ QPU เช่น coupling map, basis gates, และคุณสมบัติของ Qubit ซึ่งข้อมูลเหล่านี้มีประโยชน์สำหรับการทดสอบ Transpiler และการ simulate QPU แบบมี noise โดย noise model จาก snapshot จะถูกใช้งานโดยอัตโนมัติระหว่างการ simulation -
Aer simulator: Simulators จาก Qiskit Aer ให้การ simulation ประสิทธิภาพสูงที่รองรับ circuits ขนาดใหญ่และ custom noise models มีตัวเลือก simulation method หลายแบบเมื่อใช้
AerSimulatorใน local testing mode ดูตัวอย่าง Clifford simulation mode ที่แสดงวิธี simulate Clifford circuits ที่มี qubits จำนวนมากอย่างมีประสิทธิภาพรายการ simulation methods ที่ใช้ได้จาก Qiskit Aer
ดูเอกสาร
AerSimulatorสำหรับข้อมูลเพิ่มเติม-
"automatic": simulation method เริ่มต้น เลือก simulation method โดยอัตโนมัติตาม Circuit และ noise model -
"statevector": การ simulation statevector แบบ dense ที่สามารถสุ่มผลการวัดจาก circuits อุดมคติ ที่มีการวัดทั้งหมดที่ท้าย Circuit สำหรับการ simulation แบบมี noise แต่ละ shot จะสุ่ม noisy circuit จาก noise model -
"density_matrix": การ simulation density matrix ที่สามารถสุ่มผลการวัดจาก circuits แบบมี noise ที่มีการวัดทั้งหมดที่ท้าย Circuit -
"stabilizer": Clifford stabilizer state simulator ที่มีประสิทธิภาพซึ่ง simulate Clifford circuits แบบมี noise ได้หากข้อผิดพลาดทั้งหมดใน noise model เป็น Clifford errors -
"extended_stabilizer": approximate simulator สำหรับ Clifford + T circuits ที่อิงจากการแยก state เป็น ranked-stabilizer state จำนวน terms จะเพิ่มขึ้นตามจำนวน non-Clifford (T) gates -
"matrix_product_state": tensor-network statevector simulator ที่ใช้ Matrix Product State (MPS) representation สำหรับ state ทำได้โดยมีหรือไม่มีการตัด MPS bond dimensions ขึ้นอยู่กับตัวเลือก simulator พฤติกรรมเริ่มต้นคือไม่ตัด -
"unitary": การ simulation unitary matrix แบบ dense ของ Circuit อุดมคติ จำลอง unitary matrix ของ Circuit เอง แทนที่จะเป็นการวิวัฒนาการของ quantum state เริ่มต้น method นี้ simulate ได้เฉพาะ gates เท่านั้น ไม่รองรับการวัด reset หรือ noise -
"superop": การ simulation superoperator matrix แบบ dense ของ Circuit อุดมคติหรือแบบมี noise จำลอง superoperator matrix ของ Circuit เอง แทนที่จะเป็นการวิวัฒนาการของ quantum state เริ่มต้น method นี้ simulate gates และ resets แบบอุดมคติและแบบมี noise ได้ แต่ไม่รองรับการวัด -
"tensor_network": การ simulation อิงจาก tensor-network ที่รองรับทั้ง statevector และ density matrix ปัจจุบันใช้ได้เฉพาะกับ GPU และเร่งความเร็วด้วย cuQuantumcuTensorNetAPIs
-
- คุณสามารถระบุตัวเลือก IBM Quantum Compute ทั้งหมดใน local testing mode ได้ เมื่อใช้
SamplerและEstimatorฝั่งไคลเอนต์ (เปิดตัวในqiskit-ibm-runtimev0.50.0) ตัวเลือก error suppression และ mitigation จะถูกนำมาใช้ในเครื่อง ดังนั้นคุณจึงทดสอบวิธี error mitigation ต่าง ๆ ในเครื่องก่อนใช้เวลา QPU จริงได้ ดูตัวอย่างที่ Test error mitigation locally
ก่อนหน้านี้ local simulator ละเว้นตัวเลือกทั้งหมดยกเว้น shots เมื่อใช้ primitive แบบเดิม (ฝั่งเซิร์ฟเวอร์) เพราะการประมวลผลนั้นเกิดขึ้นบนเซิร์ฟเวอร์เท่านั้น
- แนะนำให้ติดตั้ง Qiskit Aer ก่อนใช้ fake backends หรือ Aer simulators โดยรัน
pip install qiskit-aerfake backends ใช้ Aer simulators เบื้องหลังหากมีเพื่อใช้ประโยชน์จากประสิทธิภาพ
ตัวอย่าง Fake backends
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"numpy": "numpy", "qiskit": "qiskit", "qiskit_aer": "qiskit-aer", "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.circuit import QuantumCircuit
from qiskit.transpiler import generate_preset_pass_manager
# 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
from qiskit_ibm_runtime.fake_provider import FakeManilaV2
# Bell Circuit
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
qc.measure_all()
# Run the Sampler job locally using FakeManilaV2
fake_manila = FakeManilaV2()
pm = generate_preset_pass_manager(backend=fake_manila, optimization_level=1)
isa_qc = pm.run(qc)
# You can use a fixed seed to get fixed results.
options = {"simulator": {"seed_simulator": 42}}
sampler = Sampler(mode=fake_manila, options=options)
result = sampler.run([isa_qc]).result()
ตัวอย่าง AerSimulator
ตัวอย่างการใช้ session แบบไม่มี noise:
from qiskit_aer import AerSimulator
from qiskit.circuit import QuantumCircuit
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime import Session
# 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
# Bell Circuit
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
qc.measure_all()
# Run the Sampler job locally using AerSimulator.
# Session syntax is supported but ignored because local mode doesn't support sessions.
aer_sim = AerSimulator()
pm = generate_preset_pass_manager(backend=aer_sim, optimization_level=1)
isa_qc = pm.run(qc)
with Session(backend=aer_sim) as session:
sampler = Sampler(mode=session)
result = sampler.run([isa_qc]).result()
ในการ simulate แบบมี noise ให้ระบุ QPU (ฮาร์ดแวร์ควอนตัม) และส่งไปยัง Aer Aer จะสร้าง noise model จากข้อมูล calibration ของ QPU นั้น และสร้าง Aer Backend พร้อม model นั้น หากต้องการ สามารถ สร้าง noise model เองได้
QPU อาจได้รับผลกระทบจาก noise หลายประเภท Qiskit Aer noise model ที่ใช้ที่นี่จำลองได้เฉพาะบางส่วนเท่านั้น ดังนั้นจึงมีแนวโน้มว่าจะรุนแรงน้อยกว่า noise บน QPU จริง
สำหรับรายละเอียดว่า errors ใดบ้างที่รวมอยู่เมื่อ initialize noise model จาก QPU ดู Aer NoiseModel API reference
ตัวอย่างแบบมี noise:
from qiskit_aer import AerSimulator
from qiskit.circuit import QuantumCircuit
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime import QiskitRuntimeService
# 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
# Bell Circuit
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
qc.measure_all()
service = QiskitRuntimeService()
# Specify a QPU to use for the noise model
real_backend = service.least_busy(operational=True, simulator=False)
aer = AerSimulator.from_backend(real_backend)
# Run the Sampler job locally using AerSimulator.
pm = generate_preset_pass_manager(backend=aer, optimization_level=1)
isa_qc = pm.run(qc)
sampler = Sampler(mode=aer)
result = sampler.run([isa_qc]).result()
การจำลอง Clifford
เนื่องจาก Clifford circuits สามารถ simulate ได้อย่างมีประสิทธิภาพพร้อมผลลัพธ์ที่ยืนยันได้ Clifford simulation จึงเป็นเครื่องมือที่มีประโยชน์มาก สำหรับตัวอย่างเชิงลึก ดู Efficient simulation of stabilizer circuits with Qiskit Aer primitives
ตัวอย่าง:
import numpy as np
from qiskit.circuit.library import efficient_su2
# 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
n_qubits = 500 # <---- note this uses 500 qubits!
circuit = efficient_su2(n_qubits)
circuit.measure_all()
rng = np.random.default_rng(1234)
params = rng.choice(
[0, np.pi / 2, np.pi, 3 * np.pi / 2],
size=circuit.num_parameters,
)
# Tell Aer to use the stabilizer (Clifford) simulation method
aer_sim = AerSimulator(method="stabilizer")
pm = generate_preset_pass_manager(backend=aer_sim, optimization_level=1)
isa_qc = pm.run(qc)
sampler = Sampler(mode=aer_sim)
result = sampler.run([isa_qc]).result()
ทดสอบ error mitigation ในเครื่อง
เมื่อใช้ Sampler และ Estimator ฝั่งไคลเอนต์ (เปิดตัวใน qiskit-ibm-runtime v0.50.0) error suppression และ mitigation จะเกิดขึ้นที่ไคลเอนต์แทนที่จะเป็นเซิร์ฟเวอร์ ดังนั้นตัวเลือกเหล่านี้จึงมีผลใน local testing mode แล้ว คุณจึงทดลองวิธี error mitigation ต่าง ๆ บน fake backend ก่อนใช้เวลา QPU จริงได้
เมื่อใช้ primitive ฝั่งเซิร์ฟเวอร์แบบเดิม การตั้งค่าตัวเลือก เช่น resilience.measure_mitigation บน local simulator ไม่มีผล เพราะการประมวลผล mitigation ทำงานบนเซิร์ฟเวอร์เท่านั้น primitive ฝั่งไคลเอนต์ทำการประมวลผลนั้นในเครื่อง
ต้นทุนของการจำลองแบบมี noise ในเครื่องเพิ่มขึ้นแบบเอกซ์โพเนนเชียลตามจำนวน qubit และแล็ปท็อปส่วนใหญ่จำลองเกินประมาณ 32 qubit ไม่ได้ เนื่องจากวิธี error suppression และ mitigation ทำงานในเครื่องแล้ว จึงเพิ่ม overhead ของหน่วยความจำและ runtime ซ้อนทับบนการจำลองพื้นฐาน เพื่อให้การทดสอบในเครื่องทำได้จริง ให้ใช้อย่างใดอย่างหนึ่งต่อไปนี้:
-
fake backend ขนาดเล็ก (เช่น
FakeManilaV2ที่ใช้ด้านล่าง) -
simulator แบบไม่มี noise
-
Clifford simulation ซึ่งขยายไปได้ถึงจำนวน qubit จำนวนมาก
ตัวอย่างต่อไปนี้เปิดใช้ measurement error mitigation กับ Estimator และรันบน fake backend ตอนนี้ตัวเลือก measure_mitigation = True ถูกนำไปใช้กับ Circuit ของคุณในเครื่อง
from qiskit.circuit import QuantumCircuit
from qiskit.quantum_info import SparsePauliOp
from qiskit.transpiler import generate_preset_pass_manager
# Legacy server-side primitive before qiskit-ibm-runtime v0.50.0
# from qiskit_ibm_runtime import Estimator
# Client-side primitive introduced in qiskit-ibm-runtime v0.50.0
from qiskit_ibm_runtime.executor_estimator import Estimator
from qiskit_ibm_runtime.fake_provider import FakeManilaV2
# Bell Circuit
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
observable = SparsePauliOp("ZZ")
# Transpile the circuit and observable for the fake backend
fake_manila = FakeManilaV2()
pm = generate_preset_pass_manager(backend=fake_manila, optimization_level=1)
isa_qc = pm.run(qc)
isa_observable = observable.apply_layout(isa_qc.layout)
# Run the Estimator job locally using FakeManilaV2
estimator = Estimator(mode=fake_manila)
# With the client-side Estimator, this option takes effect locally
estimator.options.resilience.measure_mitigation = True
result = estimator.run([(isa_qc, isa_observable)]).result()
การทดสอบในเครื่องเทียบกับ dry-run jobs
Local testing mode รันบนเครื่องของคุณเอง เป็นวิธีที่ดีในการพัฒนาและดีบักโปรแกรม และดูว่าผลลัพธ์อาจออกมาเป็นอย่างไร แต่บอกไม่ได้ว่า QPU จริงจะคิดค่าใช้จ่ายเท่าไรหรือบริการจะยอมรับ job หรือไม่
ต่างจาก local testing ตรงที่ dry-run job จะรัน workload ของคุณผ่าน IBM Quantum Compute Service บน mock device โดยไม่ใช้เวลา QPU เลย ทำให้เห็นจำนวน resource units (RUs) ที่ job จะใช้บน QPU จริง นอกจากนี้ยังมีการตรวจสอบฝั่งบริการ และให้ circuit timing schedule ได้ตามที่ขอ
| Fake backend (local testing) | Mock device (dry-run job) | |
|---|---|---|
| รันที่ไหน | ในเครื่อง บนคอมพิวเตอร์ของคุณ | บน Cloud ที่ IBM Quantum Compute Service |
| บัญชีและ instance | ไม่จำเป็น | จำเป็น (Flex, Premium หรือ On-Prem) |
| ผลลัพธ์ | การจำลองที่มี noise โดยใช้ noise model แบบ snapshot | ข้อมูลสุ่มที่มี schema ตามที่คาดไว้ ไม่ใช่การจำลอง |
| การรายงานการใช้งาน | ไม่มี | job.usage() |
| การตรวจสอบ job | จำกัดเฉพาะสิ่งที่ client ตรวจสอบ | ทำโดย Quantum Compute เหมือนกับ job จริง |
ขั้นตอนทั่วไปคือวนปรับปรุง circuit และผลลัพธ์ด้วย fake backend แล้วรัน dry-run job เป็นการตรวจสอบครั้งสุดท้ายก่อนรันบน QPU จริง ดูการเปรียบเทียบฉบับเต็มที่ Mock devices compared to fake backends
ขั้นตอนถัดไป
- ใช้ คลาส
Neatเพื่อวิเคราะห์ผลกระทบของ noise ต่อ Estimator workload - ดูตัวอย่าง Sampler โดยละเอียด
- ดูตัวอย่าง Estimator โดยละเอียด
- ฝึกใช้ primitives ผ่าน Cost function lesson ใน IBM Quantum Learning
- เรียนรู้วิธี transpile ในเครื่องในส่วน Transpile
- ลองทำ Compare transpiler settings tutorial