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

הגדרות ברירת מחדל ואפשרויות תצורה לטרנספילציה

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")

Output of the previous code cell

בצע טרנספילציה על המעגל וצפה בתוצאה:

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)

Output of the previous code cell

כל הפרמטרים הזמינים​

להלן כל הפרמטרים הזמינים לפונקציה 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>

צעדים הבאים​