דלג לתוכן הראשי
פרויקט זה בשלב בטא. מצאת באג? פתח issue ב-GitHub. יש שאלה או רעיון? שאל ב-Discussions — נשמח לשמוע ממך!
מה איכות התרגום בדף זה?

מדריך מהיר ל-Sampler

המשימה המרכזית של Sampler היא דגימת רגיסטר הפלט מהרצה של מעגל קוונטי אחד או יותר. מעגלים דינמיים ומעגלים פרמטריים מתקבלים כקלט (אם מוגשים מעגלים פרמטריים, יש לספק גם את ערכי הפרמטרים). Sampler תומך גם ב-dynamical decoupling ו-twirling מובנים לצורך דיכוי שגיאות.

השלבים בנושא זה מסבירים כיצד להגדיר את Sampler, לחקור את האפשרויות שאפשר להגדיר בו, ולהפעיל אותו בתוכנית.

מימוש Sampler חדש

מימושים חדשים של הממשקים 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 של Sampler​

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 = {"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 אחד כקלט ל-primitive של Sampler.

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)). השתמש ב-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 למצב הרצת 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 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() כדי לייצר את הפלט. ה-Circuit וסדרות ערכי הפרמטרים האופציונליות מוזנות כ-tuples מסוג primitive unified bloc (PUB).

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']

השלבים הבאים​

המלצות