เริ่มต้นใช้งาน Primitive
การเปิดตัว beta ของโมเดลการรันใหม่มีให้ใช้งานแล้ว โมเดล directed execution มอบความยืดหยุ่นมากขึ้นในการปรับแต่ง error mitigation workflow ดูรายละเอียดได้ที ่คู่มือ Directed execution model
แม้ว่าเอกสารนี้จะใช้ primitive จาก Qiskit Runtime ซึ่งให้ใช้งาน IBM® Backend ได้ แต่ primitive สามารถรันบน provider ใดก็ได้โดยใช้ backend primitives แทน นอกจากนี้ยังสามารถใช้ reference primitive เพื่อรันบน local statevector simulator ดูรายละเอียดได้ที่ การจำลองแบบแม่นยำด้วย Qiskit primitives
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-ibm-runtime
ขั้นตอนในหัวข้อนี้อธิบายวิธีตั้งค่า primitive สำรวจตัวเลือกที่ใช้กำหนดค่า และเรียกใช้ใน program
หากต้องการใ ช้ fractional gates ที่รองรับใหม่ ให้ตั้งค่า use_fractional_gates=True เมื่อขอ Backend จาก instance QiskitRuntimeService ตัวอย่างเช่น:
service = QiskitRuntimeService()
fractional_gate_backend = service.least_busy(use_fractional_gates=True)
โปรดทราบว่า นี่เป็นฟีเจอร์ทดลองและอาจมีการเปลี่ยนแปลงในอนาคต
Package versions
โค้ดในหน้านี้พัฒนาโดยใช้ requirement ดังนี้ แนะนำให้ใช้เวอร์ชันเหล่านี้หรือใหม่กว่า
qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1
เริ่มต้นใช้งาน Estimator
1. เริ่มต้น account
เนื่องจาก Qiskit Runtime Estimator เป็น managed service จึงต้องเริ่มต้น account ก่อน จากนั้นเลือก QPU ที่ต้องการใช้คำนวณค่า expectation value
ทำตามขั้นตอนใน หัวข้อ Install and set up หากยังไม่มี account
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, simulator=False, min_num_qubits=127
)
print(backend.name)
ibm_torino
2. สร้าง Circuit และ observable
ต้องมี Circuit อย่างน้อยหนึ่งตัวและ observable อย่างน้อยหนึ่งตัวเป็น input สำหรับ Estimator primitive
from qiskit.circuit.library import qaoa_ansatz
from qiskit.quantum_info import SparsePauliOp
entanglement = [tuple(edge) for edge in backend.coupling_map.get_edges()]
observable = SparsePauliOp.from_sparse_list(
[("ZZ", [i, j], 0.5) for i, j in entanglement],
num_qubits=backend.num_qubits,
)
circuit = qaoa_ansatz(observable, reps=2)
# the circuit is parametrized, so we will define the parameter values for execution
param_values = [0.1, 0.2, 0.3, 0.4]
print(f">>> Observable: {observable.paulis}")
>>> Observable: ['IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...', ...]
Circuit และ observable ต้องถูกแปลงให้ใช้เฉพาะ instruction ที่ QPU รองรับ (เรียกว่า Circuit instruction set architecture (ISA)) เราจะใช้ Transpiler เพื่อดำเนินการนี้
from qiskit.transpiler import generate_preset_pass_manager
pm = generate_preset_pass_manager(optimization_level=1, backend=backend)
isa_circuit = pm.run(circuit)
isa_observable = observable.apply_layout(isa_circuit.layout)
print(f">>> Circuit ops (ISA): {isa_circuit.count_ops()}")
>>> Circuit ops (ISA): OrderedDict([('rz', 3826), ('sx', 1601), ('cz', 968)])
3. เริ่มต้น Qiskit Runtime Estimator
เมื่อเริ่มต้น Estimator ให้ใช้ parameter mode เพื่อระบุโหมดที่ต้องการรัน ค่าที่เป็นไปได้คือออบเจกต์ batch, session หรือ backend สำหรับโหมดการรันแบบ batch, session และ job ตามลำดับ ดูข้อมูลเพิ่มเติมได้ที่ บทนำสู่โหมดการรัน Qiskit Runtime
from qiskit_ibm_runtime import EstimatorV2 as Estimator
estimator = Estimator(mode=backend)
4. เรียกใช้ Estimator และรับผลลัพธ์
ถัดมา เรียกใช้เมธอด run() เพื่อคำนวณค่า expectation value สำหรับ Circuit และ observable ที่เป็น input Circuit, observable และชุดค่า parameter ที่ไม่บังคับจะถูกส่งเป็น tuple PUB (primitive unified bloc)
job = estimator.run([(isa_circuit, isa_observable, param_values)])
print(f">>> Job ID: {job.job_id()}")
print(f">>> Job Status: {job.status()}")
>>> Job ID: d5k96c4jt3vs73ds5smg
>>> Job Status: QUEUED
result = job.result()
print(f">>> {result}")
print(f" > Expectation value: {result[0].data.evs}")
print(f" > Metadata: {result[0].metadata}")
>>> PrimitiveResult([PubResult(data=DataBin(evs=np.ndarray(<shape=(), dtype=float64>), stds=np.ndarray(<shape=(), dtype=float64>), ensemble_standard_error=np.ndarray(<shape=(), dtype=float64>)), metadata={'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32})], metadata={'dynamical_decoupling': {'enable': False, 'sequence_type': 'XX', 'extra_slack_distribution': 'middle', 'scheduling_method': 'alap'}, 'twirling': {'enable_gates': False, 'enable_measure': True, 'num_randomizations': 'auto', 'shots_per_randomization': 'auto', 'interleave_randomizations': True, 'strategy': 'active-accum'}, 'resilience': {'measure_mitigation': True, 'zne_mitigation': False, 'pec_mitigation': False}, 'version': 2})
> Expectation value: 25.8930784649363
> Metadata: {'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32}
เริ่มต้นใช้งาน Sampler
1. เริ่มต้น account
เนื่องจาก Qiskit Runtime Sampler เป็น managed service จึงต้องเริ่มต้น account ก่อน จากนั้นเลือก QPU ที่ต้องการใช้คำนวณค่า expectation value
ทำตามขั้นตอนใน หัวข้อ Install and set up หากยังไม่มี account
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)
ใช้ Transpiler เพื่อรับ ISA circuit
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([('sx', 3089), ('rz', 3036), ('cz', 1092), ('measure', 127), ('barrier', 1)])