מדריך מהיר ל-Estimator
ה-primitive של Estimator מחשב את ערכי הציפייה עבור observable אחד או יותר ביחס למצבים שהוכנו על ידי מעגלים קוונטיים. המעגלים יכולים להיות פרמטריים, כל עוד ערכי הפרמטרים מסופקים גם כן כקלט ל-primitive.
ל-primitive זה יש מספר טכניקות הפחתת שגיאות ודיכוי שגיאות מובנות, כולל dynamical decoupling, Pauli-twirling, gate-folding ZNE, PEA ו-PEC. הוא גם תומך באפשרות resilience_level שמאפשרת לך להגדיר בקלות את הפשרה בין עלות לדיוק.
השלבים בנושא זה מסבירים כיצד להגדיר את Estimator, לחקור את האפשרויות שאפשר להגדיר בו, ולהפעיל אותו בתוכנית.
מימושים חדשים של הממשקים Qiskit SamplerV2 ו-EstimatorV2 הוצגו ב-qiskit-ibm-runtime v0.50.0. ה-primitives החדשים האלה מבצעים את רוב העיבוד המקדים והעיבוד שלאחר ההרצה בצד הלקוח, ומעבירים את הביצוע ל-primitive ה-Executor. הרצה בצד הלקוח מספקת שקיפות רבה יותר, משוב דיבוג מהיר יותר, ושליטה מדויקת יותר.
מאחר שהם מיישמים את אותו API, ה-primitives האלה בצד הלקוח הם ברובם תחליפים ישירים ל-primitives הישנים בצד השרת, כאשר השינוי היחיד הוא הצהרת ה-import. ראו מעבר מ-Sampler ו-Estimator בצד השרת לצד הלקוח למידע נוסף.
גרסאות חבילות
הקוד בדף זה פותח תוך שימוש בדרישות הבאות. אנחנו ממליצים להשתמש בגרסאות אלה או חדשות יותר.
qiskit[all]~=2.5.2
qiskit-ibm-runtime~=0.47.0
שלבים לשימוש ב-primitive של Estimator
1. אתחול החשבון
צריך קודם לאתחל את החשבון שלך. לאחר מכן אפשר לבחור את ה-QPU שרוצים להשתמש בו לחישוב ערך הציפייה.
יש לבצע את השלבים בהגדרת חשבון IBM Cloud שלך אם עוד לא הגדרת חשבון.
כדי להשתמש ב-שערים שברים הנתמכים החדשים, הגדר use_fractional_gates=True בעת בקשת backend ממופע QiskitRuntimeService. לדוגמה:
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 = {"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
)
print(backend.name)
ibm_fez
2. יצירת Circuit ו-observable
צריך לפחות Circuit אחד ו-observable אחד כקלטים ל-primitive של Estimator.
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]
ה-Circuit וה-observable צריכים להיות מוּמרים כך שישתמשו רק בהוראות הנתמכות על ידי ה-QPU (המכונות מעגלי 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', 4472), ('sx', 1884), ('cz', 1120)])
3. אתחול IBM Quantum Estimator
כשמאתחלים את Estimator, משתמשים בפרמטר mode כדי לציין את המצב שרוצים שהוא יפעל בו. הערכים האפשריים הם אובייקטי batch, session או backend למצב הרצת batch, session ו-job בהתאמה. למידע נוסף, ראו מבוא למצבי הרצה של IBM Quantum Compute Service. שים לב שמשתמשי Open Plan לא יכולים להגיש עבודות session.
# Legacy server-side primitive before qiskit-ibm-runtime 0.50.0
# from qiskit_ibm_runtime import Estimator
# Client-side primitive introduced in qiskit-ibm-runtime 0.50.0
from qiskit_ibm_runtime.executor_estimator import Estimator
estimator = Estimator(mode=backend)
4. הפעלת Estimator וקבלת תוצאות
לאחר מכן, הפעל את מתודת run() כדי לחשב ערכי ציפייה עבור מעגלי הקלט וה-observables. ה-Circuit, ה-observable וסדרות ערכי הפרמטרים האופציונליות מוזנות כ-tuples מסוג primitive unified bloc (PUB).
job = estimator.run([(isa_circuit, isa_observable, param_values)])
print(f">>> Job ID: {job.job_id()}")
print(f">>> Job Status: {job.status()}")
>>> Job ID: dab7lfurrl7c7386gjn0
>>> 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: 28.60306448415693
> Metadata: {'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32}
השלבים הבאים
- למד כיצד לבדוק מקומית לפני הרצה על מחשבים קוונטיים.
- עיין בדוגמאות המפורטות.
- תרגל עם primitives באמצעות עבודה על שיעור פונקציית עלות ב-IBM Quantum Learning.
- למד כיצד לבצע transpile מקומית בחלק Transpile section.
- נסה את מדריך השוואת הגדרות Transpiler.
- למד כיצד להשתמש באפשרויות ה-primitive.
- עיין ב-API עבור אפשרויות Estimator.