הגדרות ברירת מחדל ואפשרויות תצורה לטרנספילציה
Package versions
הקוד בדף זה פותח בשימוש בדרישות הבאות. אנחנו ממליצים להשתמש בגרסאות אלה או חדשות יותר.
qiskit[all]~=2.4.0
qiskit-ibm-runtime~=0.46.1
מעגלים אבסטרקטיים חייבים לעבור טרנספילציה מפני ש-QPU-ים כוללים קבוצה מוגבלת של שערי בסיס ואינם יכולים לבצע פעולות שרירותיות. תפקיד ה-Transpiler הוא לשנות מעגלים שרירותיים כך שיוכלו לרוץ על QPU מסוים. הדבר נעשה על ידי תרגום המעגלים לשערי הבסיס הנתמכים, ועל ידי הוספת שערי SWAP לפי הצורך, כך שהקישוריות של המעגל תתאים לזו של ה-QPU.
כפי שמוסבר בטרנספילציה עם pass managers, ניתן ליצור pass manager באמצעות הפונקציה generate_preset_pass_manager ולהעביר מעגל או רשימת מעגלים למתודת run שלו כדי לבצע טרנספילציה עליהם. ניתן לקרוא ל-generate_preset_pass_manager עם רמת האופטימיזציה וה-Backend בלבד ולהשתמש בברירות המחדל לשאר האפשרויות, או להעביר ארגומנטים נוספים לפונקציה לכיוונון עדין של הטרנספילציה.
שימוש בסיסי ללא פרמטרים
בדוגמה זו, אנחנו מעבירים מעגל ו-QPU יעד ל-Transpiler מבלי לציין פרמטרים נוספים.
צור מעגל וצפה בתוצאה:
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
from qiskit import QuantumCircuit
from qiskit.circuit.library import grover_operator, DiagonalGate
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke
# Create circuit to test transpiler on
oracle = DiagonalGate([1] * 7 + [-1])
qc = QuantumCircuit(3)
qc.h([0, 1, 2])
qc = qc.compose(grover_operator(oracle))
# Add measurements to the circuit
qc.measure_all()
# View the circuit
qc.draw(output="mpl")
בצע טרנספילציה על המעגל וצפה בתוצאה:
from qiskit.transpiler import generate_preset_pass_manager
# Specify the QPU to target
backend = FakeSherbrooke()
# Transpile the circuit
pass_manager = generate_preset_pass_manager(
optimization_level=1, backend=backend
)
transpiled_circ = pass_manager.run(qc)
# View the transpiled circuit
transpiled_circ.draw(output="mpl", idle_wires=False)
כל הפרמטרים הזמינים
להלן כל הפרמטרים הזמינים לפונקציה generate_preset_pass_manager. ישנן שתי קבוצות של ארגומנטים: אלה המתארים את יעד הקומפילציה, ואלה המשפיעים על אופן פעולת ה-Transpiler.
כל הפרמטרים פרט ל-optimization_level הם אופציונליים. לפרטים מלאים, ראה את תיעוד ה-API של ה-Transpiler.
optimization_level(int) - כמה אופטימיזציה לבצע על המעגלים. מספר שלם בטווח (0-3). רמות גבוהות יותר מייצרות מעגלים מאופטמים יותר, על חשבון זמן טרנספילציה ארוך יותר. ראה הגדרת רמת אופטימיזציה של ה-Transpiler לפרטים נוספים.
פרמטרים המשמשים לתיאור יעד הקומפילציה:
ארגומנטים אלה מתארים את ה-QPU היעד להרצת המעגל, כולל מידע כגון מפת הצימוד של ה-QPU (המתארת את הקישוריות של ה-Qubit-ים), שערי הבסיס הנתמכים על ידי ה-QPU, ושיעורי השגיאה של השערים.
פרמטרים רבים מאלה מתוארים בפירוט בפרמטרים נפוצים לטרנספילציה.
פרמטרי QPU (`Backend`)
פרמטרי Backend - אם תציין backend, אינך צריך לציין target או אפשרויות backend אחרות. כמו כן, אם תציין target, אינך צריך לציין backend או אפשרויות backend אחרות.
backend(Backend) - אם הוגדר, ה-Transpiler מקמפל את מעגל הקלט למכשיר זה. אם הוגדרה אפשרות אחרת שמשפיעה על הגדרות אלה, כגוןcoupling_map, היא עוקפת את ההגדרות מ-backend.target(Target) - יעד Transpiler של Backend. בדרך כלל זה מצוין כחלק מארגומנט ה-backend, אך אם בנית ידנית אובייקט Target, ניתן לציין אותו כאן. זה עוקף את היעד מ-backend.backend_properties(BackendProperties) - מאפיינים שמוחזרים על ידי QPU, כולל מידע על שגיאות שערים, שגיאות קריאה, זמני קוהרנטיות של Qubit-ים, וכן הלאה. מצא QPU שמספק מידע זה על ידי הרצתbackend.properties().timing_constraints(Dict[str, int] | None) - הגבלה אופציונלית של חומרת הבקרה על רזולוציית זמן ההוראות. מידע זה מסופק על ידי תצורת ה-QPU. אם ל-QPU אין הגבלה על הקצאת זמן ההוראות,timing_constraintsהואNoneולא בוצעת שום התאמה. QPU עשוי לדווח על קבוצת הגבלות, כלומר:granularity: ערך שלם המייצג את רזולוציית שער הפולס המינימלית ביחידות של dt. לשער פולס מוגדר-משתמש צריכה להיות משך זמן שהוא כפולה של ערך הגרנולריות הזה.min_length: ערך שלם המייצג את אורך שער הפולס המינימלי ביחידות של dt. שער פולס מוגדר-משתמש צריך להיות ארוך מאורך זה.pulse_alignment: ערך שלם המייצג רזולוציית זמן של זמן התחלת הוראת שער. הוראות שער צריכות להתחיל בזמן שהוא כפולה של ערך זה.acquire_alignment: ערך שלם המייצג רזולוציית זמן של זמן התחלת הוראת מדידה. הוראת מדידה צריכה להתחיל בזמן שהוא כפולה של ערך זה.
פרמטרי פריסה וטופולוגיה
basis_gates(List[str] | None) - רשימת שמות שערי בסיס לפריסה אליהם. לדוגמה ['u1', 'u2', 'u3', 'cx']. אםNone, אל תבצע פריסה.coupling_map(CouplingMap | List[List[int]]) - מפת צימוד מכוונת (אפשרי מותאמת אישית) ליעד במיפוי. אם מפת הצימוד סימטרית, שני הכיוונים צריכים להיות מצוינים. הפורמטים הבאים נתמכים:- מופע CouplingMap
- List - חייב להינתן כמטריצת שכנות, כאשר כל רשומה מציינת את כל האינטראקציות הדו-Qubit המכוונות הנתמכות על ידי ה-QPU. לדוגמה: [[0, 1], [0, 3], [1, 2], [1, 5], [2, 5], [4, 1], [5, 3]]
inst_map(List[InstructionScheduleMap] | None) - מיפוי של פעולות מעגל לתזמוני פולס. אםNone, נעשה שימוש ב-instruction_schedule_mapשל ה-QPU.
פרמטרים המשמשים להשפיע על אופן פעולת ה-Transpiler
פרמטרים אלה משפיעים על שלבי טרנספילציה ספציפיים. חלקם עשויים להשפיע על שלבים מרובים, אך רוכזו תחת שלב אחד בלבד לצורך פשטות. אם תציין ארגומנט, כגון initial_layout עבור ה-Qubit-ים שברצונך להשתמש בהם, הערך הזה עוקף את כל ה-pass-ים שיכלו לשנות אותו. במילים אחרות, ה-Transpiler לא ישנה שום דבר שאתה מציין ידנית. לפרטים על שלבים ספציפיים, ראה שלבי Transpiler.
שלב אתחול
hls_config(HLSConfig) - מחלקת תצורה אופציונליתHLSConfigשמועברת ישירות ל-pass הטרנספורמציהHighLevelSynthesis. מחלקת תצורה זו מאפשרת לך לציין רשימות של אלגוריתמי סינתזה והפרמטרים שלהם עבור אובייקטים ברמה גבוהה שונים.init_method(str) - שם הפלאגין לשימוש בשלב האתחול. כברירת מחדל, לא נעשה שימוש בפלאגין חיצוני. ניתן לראות רשימה של פלאגינים מותקנים על ידי הרצתlist_stage_plugins()עםinitעבור ארגומנט שם השלב.unitary_synthesis_method(str) - שם שיטת סינתזת היחידה לשימוש. כברירת מחדל, נעשה שימוש ב-default. ניתן לראות רשימה של פלאגינים מותקנים על ידי הרצתunitary_synthesis_plugin_names().unitary_synthesis_plugin_config(dict) - מילון תצורה אופציונלי שמועבר ישירות לפלאגין סינתזת היחידה. כברירת מחדל הגדרה זו אינה משפיעה מכיוון ששיטת סינתזת היחידה הברירת מחד ל אינה מקבלת תצורה מותאמת אישית. החלת תצורה מותאמת אישית נחוצה רק כאשר מצוין פלאגין סינתזת יחידה עם ארגומנטunitary_synthesis. מכיוון שזה מותאם אישית לכל פלאגין סינתזת יחידה, ראה בתיעוד הפלאגין כדי לראות כיצד להשתמש באפשרות זו.
שלב פריסה
initial_layout(Layout | Dict | List) - מיקום התחלתי של Qubit-ים וירטואליים על Qubit-ים פיזיים. אם פריסה זו הופכת את המעגל לתואם להגבלותcoupling_map, היא תשמש. הפריסה הסופית אינה מובטחת להיות זהה, מכיוון שה-Transpiler עשוי לסדר מחדש Qubit-ים באמצעות החלפות או אמצעים אחרים. לפרטים מלאים, ראה את סעיף הפריסה ההתחלתית.layout_method(str) - שם pass בחירת פריסה (default,dense,sabre, ו-trivial). יכול להיות גם שם הפלאגין החיצוני לשימוש בשלב הפריסה. ניתן לראות רשימה של פלאגינים מותקנים על ידי הרצתlist_stage_plugins()עםlayoutעבור ארגומנטstage_name. ערך ברירת המחדל הואsabre.
שלב ניתוב
routing_method(str) - שם pass הניתוב (basic,lookahead,default,sabre, אוnone). יכול להיות גם שם הפלאגין החיצוני לשימוש בשלב הניתוב. ניתן לראות רשימה של פלאגינים מותקנים על ידי הרצתlist_stage_plugins()עםroutingעבור ארגומנטstage_name. ערך ברירת המחדל הואsabre.
שלב תרגום
translation_method(str) - שם pass התרגום (default,synthesis,translator,ibm_backend,ibm_dynamic_circuits,ibm_fractional). יכול להיות גם שם הפלאגין החיצוני לשימוש בשלב התרגום. ניתן לראות רשימה של פלאגינים מותקנים על ידי הרצתlist_stage_plugins()עםtranslationעבור ארגומנטstage_name. ערך ברירת המחדל הואtranslator.
שלב אופטימיזציה
approximation_degree(float, בטווח 0-1 | None) - חיוג היוריסטי המשמש לקירוב מעגל (1.0 = ללא קירוב, 0.0 = קירוב מקסימלי). ערך ברירת המחדל הוא 1.0. ציוןNoneמגדיר את דרגת הקירוב לשיעור השגיאה המדווח. ראה את סעיף דרגת הקירוב לפרטים נוספים.optimization_method(str) - שם הפלאגין לשימוש בשלב האופטימיזציה. כברירת מחדל לא נעשה שימוש בפלאגין חיצוני. ניתן לראות רשימה של פלאגינים מותקנים על ידי הרצתlist_stage_plugins()עםoptimizationעבור ארגומנטstage_name.
שלב תזמון
scheduling_method(str) - שם ה-pass לתזמון. יכול להיות גם שם הפלאגין החיצוני לשימוש בשלב התזמון. ניתן לראות רשימה של פלאגינים מותקנים על ידי הרצתlist_stage_plugins()עםschedulingעבור ארגומנטstage_name.- 'as_soon_as_possible': תזמן הוראות בצורה חמדנית, מוקדם ככל האפשר על משאב Qubit (כינוי:
asap). - 'as_late_as_possible': תזמן הוראות מאוחר, כלומר, שמור Qubit-ים במצב הבסיסי כאשר אפשרי (כינוי:
alap). זוהי ברירת המחדל.
- 'as_soon_as_possible': תזמן הוראות בצורה חמדנית, מוקדם ככל האפשר על משאב Qubit (כינוי:
הרצת Transpiler
seed_transpiler(int) - מגדיר זרעים אקראיים עבור החלקים הסטוכסטיים של ה-Transpiler.
ערכי ברירת המחדל הבאים משמשים אם לא תציין אף אחד מהפרמטרים לעיל. ראה בדף עזר ה-API של המתודה למידע נוסף:
generate_preset_pass_manager(
optimization_level=1,
backend=None,
target=None,
basis_gates=None,
coupling_map=None,
initial_layout=None,
layout_method=None,
routing_method=None,
translation_method=None,
scheduling_method=None,
approximation_degree=1.0,
seed_transpiler=None,
unitary_synthesis_method="default",
unitary_synthesis_plugin_config=None,
hls_config=None,
init_method=None,
optimization_method=None,
)
<qiskit.transpiler.passmanager.StagedPassManager at 0x7fe48929f150>
צעדים הבאים
- למד כיצד להגדיר את רמת האופטימיזציה.
- ראה בפרמטרים נפוצים.
- למד כיצד להגדיר את רמת האופטימיזציה בעת שימוש ב-Qiskit Runtime.
- כנס לנושא טרנספילציה עם pass managers.
- לדוגמאות, ראה ייצוג מחשבים קוונטיים.
- למד כיצד לבצע טרנספילציה על מעגלים כחלק מתהליך העבודה של Qiskit patterns בשימוש ב-Qiskit Runtime.
- ראה בתיעוד ה-API של Transpile.