חומרה
מסאו טוקונארי וטאמייה אונודרה (14 ביוני 2024)
קורס זה מבוסס על קורס חי שנמסר באוניברסיטת טוקיו.
ה-PDF של הרצאת שיעור זה חולק לשני חלקים. הורד חלק 1 והורד חלק 2. שימו לב שקטעי קוד מסוימים עלולים להיות מיושנים כיוון שאלה תמונות סטטיות.
1. מבוא
שיעור זה בוחן חומרת מחשוב קוונטי מודרנית.
נתחיל באימות גרסאות ייבוא של חבילות רלוונטיות.
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
import statistics
from qiskit_ibm_runtime import QiskitRuntimeService
2. Backend ו-Target
Qiskit מספק API לקבלת מידע, סטטי ודינמי כאחד, על מכשיר קוונטי. אנו משתמשים במופע Backend לממשק עם מכשיר, הכולל מופע Target — מודל מכונה מופשט המסכם את המאפיינים הרלוונטיים כמו ארכיטקטורת מערכת ההוראות (ISA) וכל מאפיין או אילוץ המשויך לה. בואו נשתמש במופעי Backend אלה כדי לקבל חלק מהמידע שאתם רואים בדף Compute resources ב-IBM Quantum® Platform. תחילה, נצור מופע Backend למכשיר הנדרש. בהמשך, אנו בוחרים "ibm_kyoto", "ibm_kawasaki" או מכונת Eagle הפחות עמוסה. הגישה שלכם ל-QPUs עשויה להיות שונה; עדכנו את שם ה-Backend בהתאם.
service = QiskitRuntimeService()
# backend = service.backend("ibm_kawasaki") # an Eagle, if you have access to ibm_kawasaki
backend = service.least_busy(
operational=True, simulator=False, min_num_qubits=127
) # Eagle
backend.name
'ibm_strasbourg'
נתחיל עם מידע בסיסי (סטטי) על המכשיר.
print(
f"""
{backend.name}, {backend.num_qubits} qubits
processor type = {backend.processor_type}
basis gates = {backend.basis_gates}
"""
)
ibm_strasbourg, 127 qubits
processor type = {'family': 'Eagle', 'revision': 3}
basis gates = ['ecr', 'id', 'rz', 'sx', 'x']
2.1 תרגיל
נסו לקבל את המידע הבסיסי על מכשיר Heron בשם "ibm_strasbourg". נסו לבד, אך קוד הוסף למטה לבדיקה עצמית.
a_heron = service.backend("ibm_strasbourg") # a Heron
# your code here
print(
f"""
{backend.name}, {a_heron.num_qubits} qubits
processor type = {a_heron.processor_type}
basis gates = {a_heron.basis_gates}
"""
)
ibm_strasbourg, 133 qubits
processor type = {'family': 'Heron', 'revision': '1'}
basis gates = ['cz', 'id', 'rz', 'sx', 'x']
2.2 מפת צימוד
כעת נצייר את מפת הצימוד של המכשיר. כפי שניתן לראות, הצמתים הם Qubit ממוספרים. הקשתות מציינות זוגות עליהם ניתן להחיל ישירות את Gate השזירה ד-Qubit. הטופולוגיה נקראת "סריג hex כבד".
# This function requires that Graphviz is installed. If you need to install Graphviz you can refer to:
# https://graphviz.org/download/#executable-packages for instructions.
try:
fig = backend.coupling_map.draw()
except RuntimeError as ex:
print(ex)
fig

3. מאפייני Qubit
מכשיר Eagle מכיל 127 Qubit. בואו נקבל את המאפיינים של חלק מהם.
for qn in range(backend.num_qubits):
if qn >= 5:
break
print(f"{qn}: {backend.qubit_properties(qn)}")
0: QubitProperties(t1=0.000183686508736532, t2=0.00023613944465408068, frequency=4832100227.116953)
1: QubitProperties(t1=0.00048794378526038294, t2=9.007098375327869e-05, frequency=4736264354.075363)
2: QubitProperties(t1=0.00021247781834456527, t2=7.81037910324034e-05, frequency=4859349851.150393)
3: QubitProperties(t1=0.0002936462084765663, t2=0.00011400214529510604, frequency=4679749549.503852)
4: QubitProperties(t1=0.00044229440258559125, t2=0.0003181648356339447, frequency=4845872064.050596)
בואו נחשב את החציון של זמני T1 של ה-Qubit. השוו את התוצאה לזו המוצגת עבור המכשיר ב-IBM Quantum Platform.
t1s = [backend.qubit_properties(qq).t1 for qq in range(backend.num_qubits)]
f"Median T1: {(statistics.median(t1s)*10**6):.2f} \u03bcs"
'Median T1: 285.43 μs'
3.1 תרגיל
חשבו את החציון של זמני T2 של ה-Qubit. נסו לבד, אך קוד הוסף למטה לבדיקה עצמית.
# Your code here
t2s = [backend.qubit_properties(qq).t2 for qq in range(backend.num_qubits)]
f"Median T2: {(statistics.median(t2s)*10**6):.2f} \u03bcs"
'Median T2: 173.10 μs'
3.2 שגיאות Gate וקריאה
כעת נפנה לשגיאות Gate. לשם התחלה, נחקור את מבנה הנתונים של מופע ה-Target. זהו מילון שמפתחותיו הם שמות פעולות.
target = backend.target
target.keys()
dict_keys(['measure', 'id', 'sx', 'delay', 'x', 'for_loop', 'rz', 'if_else', 'ecr', 'reset', 'switch_case'])
הערכים שלו הם גם מילונים. בואו נסתכל על חלק מהפריטים של הערך (המילון) עבור פעולת 'sx'.
for i, qq in enumerate(target["sx"]):
if i >= 5:
break
print(i, qq, target["sx"][qq])
0 (0,) InstructionProperties(duration=6e-08, error=0.0007401311759115297)
1 (1,) InstructionProperties(duration=6e-08, error=0.0003163759907528654)
2 (2,) InstructionProperties(duration=6e-08, error=0.0003183859004638003)
3 (3,) InstructionProperties(duration=6e-08, error=0.00042235914178831863)
4 (4,) InstructionProperties(duration=6e-08, error=0.011163151923589715)
בואו נעשה את אותו הדבר עבור פעולות 'ecr' ו-'measure'.
for i, edge in enumerate(target["ecr"]):
if i >= 5:
break
print(i, edge, target["ecr"][edge])
0 (0, 14) InstructionProperties(duration=6.6e-07, error=0.01486295709788732)
1 (1, 0) InstructionProperties(duration=6.6e-07, error=0.015201590794522601)
2 (2, 1) InstructionProperties(duration=6.6e-07, error=0.00697838102630724)
3 (2, 3) InstructionProperties(duration=6.6e-07, error=0.008075067943986797)
4 (3, 4) InstructionProperties(duration=6.6e-07, error=0.0630164507876913)
for i, qq in enumerate(target["measure"]):
if i >= 5:
break
print(i, qq, target["measure"][qq])
0 (0,) InstructionProperties(duration=1.6e-06, error=0.0078125)
1 (1,) InstructionProperties(duration=1.6e-06, error=0.155029296875)
2 (2,) InstructionProperties(duration=1.6e-06, error=0.057373046875)
3 (3,) InstructionProperties(duration=1.6e-06, error=0.02880859375)
4 (4,) InstructionProperties(duration=1.6e-06, error=0.01318359375)
כפי שניתן לראות, שגיאות הקריאה נוטות להיות גדולות יותר מאלו של פעולת ה-2-Qubit, שבתורן נוטות להיות גדולות יותר מפעולת ה-1-Qubit.
לאחר שהבנו את מבני הנתונים, אנו מוכנים לחשב את שגיאות החציון עבור Gate ה-'sx' וה-'ecr'. שוב, השוו את התוצאות לאלה המוצגות עבור המכשיר ב-IBM Quantum Platform.
sx_errors = [inst_prop.error for inst_prop in target["sx"].values()]
f"Median SX error: {(statistics.median(sx_errors)):.3e}"
'Median SX error: 2.277e-04'
ecr_errors = [inst_prop.error for inst_prop in target["ecr"].values()]
f"Median ECR error: {(statistics.median(ecr_errors)):.3e}"
'Median ECR error: 6.895e-03'
4. נספח
תכונה פופולרית של Qiskit היא יכולות ההדמיה שלה. היא כוללת ויזואליזציות Circuit, ויזואליזציות מצב והתפלגות, ו-target visualizer. כבר השתמשתם בשניים הראשונים במחברות Jupyter הקודמות. בואו נשתמש בחלק מיכולות ה-target visualizer.
from qiskit.visualization import plot_gate_map
plot_gate_map(backend, font_size=14)

from qiskit.visualization import plot_error_map
plot_error_map(backend)

# Check Qiskit version
import qiskit
qiskit.__version__
'2.0.2'