הגדרות ברירת מחדל ואפשרויות תצורה לטרנספילציה
Package versions
הקוד בעמוד זה פותח באמצעות הדרישות הבאות. אנחנו ממליצים להשתמש בגרסאות אלה או חדשות יותר.
qiskit[all]~=2.5.2
qiskit-ibm-runtime~=0.47.0
מעגלים מופשטים צריכים לעבור טרנספילציה מכיוון של-QPUs יש קבוצה מוגבלת של שערי בסיס, והם אינם יכולים לבצע פעולות שרירותיות. תפקידו של ה-Transpiler הוא לשנות מעגלים שרירותיים כך שיוכלו לרוץ על QPU מסוים. זה נעשה על ידי תרגום המעגלים לשערי הבסיס הנתמכים, ועל ידי הוספת שערי SWAP לפי הצורך, כך שהקישוריות של המעגל תתאים לזו של ה-QPU.
כפי שמוסבר בטרנספילציה עם pass managers, ניתן ליצור pass manager באמצעות הפונקציה generate_preset_pass_manager ולהעביר מעגל או רשימת מעגלים למתודת run שלו כדי לבצע טרנספילציה עליהם. ניתן לקרוא ל-generate_preset_pass_manager עם רמת האופטימיזציה וה-Backend בלבד ולהשתמש בברירות המחדל לשאר האפשרויות, או להעביר ארגומנטים נוספים לפונקציה לכיוונון עדין של הטרנספילציה.
שימוש בסיסי ללא פרמטרים
בדוגמה זו, אנחנו מעבירים מעגל ו-QPU יעד ל-Transpiler מבלי לציין פרמטרים נוספים.
צור מעגל וצפה בתוצאה:
# 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 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). זוהי ברירת המחדל.
-
הרצת 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 0x1403cd250>
צעדים הבאים
- למד כיצד להגדיר את רמת האופטימיזציה.
- עיין בפרמטרים נפוצים נוספים.
- למד כיצד להגדיר את רמת האופטימיזציה.
- היכנס לנושא טרנספילציה עם pass managers.
- לדוגמאות, ראה ייצוג מחשבים קוונטיים.
- למד כיצד לבצע טרנספילציה של מעגלים כחלק מתהליך העבודה של Qiskit patterns.
- ראה בתיעוד ה-API של הטרנספילציה.