דלג לתוכן הראשי

הבנת שינויי החבילות השוברים של Qiskit v1.0

Qiskit v1.0 משתמש במבנה אריזה שונה מגרסאות Qiskit קודמות, וסביר להניח שהוא יגרום לבעיות בסביבות שמשתמשות בחבילות שאינן מוכנות ל-Qiskit v1.0.

זהירות

אל תנסה לשדרג סביבת Python וירטואלית קיימת ל-Qiskit v1.0 במקום.

לא נבצע שינויי אריזה שוברים דומים בעתיד. זוהי אירוע חד-פעמי, עם שחרור Qiskit v1.0, ספציפית כדי שסיפור האריזה שלנו יהיה פשוט ככל האפשר בעתיד.

דף זה מכיל מידע מפורט על חבילת Qiskit שלפני גרסה 1.0 ומדוע ביצענו את שינויי האריזה השוברים.

אנחנו יודעים שהשינוי אינו נוח, אך זה משיב את Qiskit למבנה החבילה הפשוט שרוב חבילות Python משתמשות בו, מה שיהיה קל יותר למשתמשים, מפתחים ומחברי ספריות לאחר השלמת מעבר Qiskit v1.0.

מבוא: מילון מונחים של אריזת Python

כדי להסביר טוב יותר כיצד ה-metapackage הישן של Qiskit היה מובנה וכיצד זה השתנה עם שחרור Qiskit v1.0, להלן מילון מונחים של ז'רגון אריזת Python נפוץ. למילים הבאות יש משמעויות ספציפיות שנשתמש בהן במסמך זה.

לחץ כאן כדי לקרוא את מילון המונחים של דף זה
  • module (מודול): קובץ Python בודד.

  • package (חבילה): ספרייה המכילה __init__.py וקבצים נוספים או חבילות שPython יכול לקרוא. זהו הקוד בפועל כפי שמותקן במחשב שלך, והוא מה שמתבצע כאשר אתה מריץ import something. Python מתייחס לכל ספרייה שנמצאת בנתיב החיפוש כדבר שאתה יכול לייבא (ויייבא פריטים נוספים רבים).

    זהו לא אותו אובייקט שאתה מבצע עליו pip install (שהוא distribution), אך בדרך כלל מה שאתה מבצע עליו pip install ומה שאתה import-ים שניהם נושאים את אותו השם.

  • submodule, subpackage (תת-מודול, תת-חבילה): אלו מונחים לא מדויקים, אך נפוצים בשימוש. החלק sub פירושו "כלול בתוך חבילה". submodule הוא module ו-subpackage הוא package, אך הם חלק מחבילה גדולה יותר.

  • namespace package (חבילת מרחב שמות): חבילה שיכולה להכיל submodules או subpackages המותקנים לתוכה על ידי distributions אחרות. באופן קריטי, אף distribution שתורמת לחבילת מרחב שמות אינה בהכרח הבעלים של כל הקבצים המותקנים, ולכן עלול להיות מסובך להסיר אותה לחלוטין או לשדרגה.

  • distribution (הפצה): קבצי Python דחוסים, קבצי נתונים ומטא-נתונים שמורדים כאשר אתה מריץ pip install something. לעיתים קרובות, distribution מכילה בדיוק חבילה אחת ומטא-נתונים על אופן התקנתה (הדרישות שלה וכן הלאה), אך זה אינו חובה. distribution יכולה להכיל אפס מודולים או חבילות או יותר.

    אם אתה מכיר "מנהלי חבילות" מחוץ להקשר של Python, כגון apt מ-Debian/Ubuntu או Homebrew ב-macOS, אז מה שהם מכנים "package", Python מכנה distribution, ואין התאמה מדויקת למה שPython מכנה package.

    רוב המקורות העוסקים באריזת Python משתמשים במונח package כדי לציין גם distributions וגם packages, ועליך להתייחס להקשר כדי להבין את הכוונה. באופן כללי, אם אתה import-ים אותו, המקור מתכוון ל-"package", ואם אתה מבצע pip install, המקור מתכוון ל-"distribution".

  • search path (נתיב חיפוש): כאשר מנסים לבצע import something, Python מחפש ברשימה מוגדרת מראש של מקומות עבור module או package בשם something. רשימת המקומות היא search path. אתה יכול לראות ולשנות את נתיב החיפוש ב-sys.path.

  • requirement (תלות): distribution מכילה מידע על distributions אחרות שהיא תלויה בהן בעת ההתקנה. כל distribution אחרת הנדרשת היא requirement, ומנהל החבילות (בדרך כלל pip או conda) אמור להבטיח שכל הדרישות מותקנות בגרסאות תואמות.

Python הוא דינמי ביותר, ועלולות להתעורר מורכבויות רבות; לדוגמה, ייתכן ש-module או package אינם מתאימים לקבצים בדיסק, או שהם הרחבות מקומפלות.

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

מבנה Qiskit הישן

היסטורית, Qiskit היה מורכב מהפצות Python רבות: qiskit-terra, ליבת המהדר; qiskit-aer, הסימולטור בעל הביצועים הגבוהים; ספק IBM Quantum® המקורי; ומספר חבילות שהפכו לא רלוונטיות המספקות תכונות אלגוריתמיות חקרניות ספציפיות או ניסויי הפעלה. לנוחות המשתמש, סיפקנו גם הפצת Python בשם qiskit, שלא הכילה קוד משלה, אך גרמה להתקנת כל הרכיבים האחרים. כינינו זאת ה-metapackage, בהשוואה למושגים דומים במנהלי חבילות אחרים. קוד ליבת Qiskit התגורר ב-qiskit-terra, שהיה הבעלים של שורש החבילה qiskit ב-Python. במילים אחרות, qiskit-terra שלט במה שקרה כאשר הרצת import qiskit. עד Qiskit v1.0, החבילה qiskit הייתה חבילת מרחב שמות והכילה חבילת מרחב שמות שנייה ב-qiskit.providers.

ארגון זה גרם לנו ולמשתמשים שלנו לא מעט בעיות.

לדוגמה, ספריות במורד הזרם שהיו תלויות ב-Qiskit לעיתים קרובות היו צריכות רק את ליבת המהדר בפועל, ולא דרשו את שאר המערכת הגדולה שהגיעה עם pip install qiskit. לכן, הן היו מציינות נכונה את הדרישה שלהן כ-qiskit-terra. עם זאת, כאשר אנשים ניסו להסיר את Qiskit על ידי הרצת pip uninstall qiskit, pip נתקל בבעיות:

  • pip אינו מסיר distributions שכעת אינן בשימוש. לכן pip uninstall qiskit כמעט לא עשה דבר; לא היה קוד ב-distribution, ולכן לא הוסר קוד.
  • גם אם היה מסיר קוד, הפצות רבות במורד הזרם היו נשארות מותקנות מכיוון שהן תלויות ב-qiskit-terra.
  • גם אם qiskit-terra היה מוסר, עלול להישאר ספריית qiskit שניתן לייבאה ללא קוד שמיש, מכיוון שהיא הייתה חבילת מרחב שמות.

בעת התקנה או שדרוג distributions עם פקודת pip install, pip גם אינו לוקח בחשבון פתרונות דרישות קודמים. מכיוון שהיו שתי חבילות, שדרוג חבילה שדרשה שדרוג qiskit-terra גרם לסביבה לא חוקית; pip שדרג את qiskit-terra אך השאיר את qiskit ללא שינוי. הוא הנפיק אזהרה על כך ועל כל פקודות pip install עתידיות, אך מאחר ולא כלום נראה שבור, משתמשים בדרך כלל התעלמו מהאזהרה, ו-pip לא העלה סטטוס שגיאה או אסר פעולות.

עם הזמן, הסרנו רכיבים מה-qiskit metapackage עד שמ-Qiskit v0.44 ואילך, נשאר רק qiskit-terra. מבין הרכיבים הללו, qiskit-aer עדיין קיים ומתעדכן באופן פעיל, אך הוא מותקן כעת כהפצה נפרדת.

באופן דומה, אנחנו יותר ויותר מונעים מספריות אחרות להשתמש בנקודות ה-namespace. הסרנו את השימוש האחרון של Qiskit ב-hooks בחבילות שאינן מיושנות עם שחרור Qiskit Aer v0.11 וחבילת Python החדשה שלו qiskit_aer, אם כי עד Qiskit v1.0 אילצנו גם את נתיב מרחב השמות qiskit.providers.aer לעבוד. החל מ-Qiskit v1.0, הסרנו את היכולת לחבילות להרחיב כל מרחב שמות של qiskit. לפיכך, pip uninstall על ה-distribution הנכונה בסביבה חוקית עובד כעת כמצופה.

מבנה Qiskit החדש

החל מגרסה 1.0, Qiskit כולל הפצה יחידה, בשם qiskit, שמתקינה חבילה אחת בלבד, גם כן בשם qiskit, שהיא הבעלים של כל הקוד הכלול בספרייה שלה. זהו המבנה הרגיל של קוד Python, והוא המבנה הפשוט ביותר ובעל הסיכוי הנמוך ביותר לשגיאות.

הפצת qiskit-terra ב-PyPI לעולם לא תעודכן לגרסה 1.0 ומעלה; היא הוחלפה לחלוטין על ידי qiskit. השם qiskit-terra אינו מעורב עוד בהתקנה. עם זאת, החבילה qiskit-terra אינה מוסרת מ-PyPI, ונשאיר את הגרסה האחרונה שלה במצב עובד, כדי שקוד מדעי ישן וחבילות ישנות יוכלו להמשיך להשתמש בה ביתר קלות.

למרבה הצער, בגלל מורשת ה-metapackage וליקויים ב-pip כמנהל חבילות, אין באפשרותנו לספק נתיב שדרוג חלק לחלוטין למשתמשים ל-Qiskit v1.0, במיוחד כאשר חלק מהחבילות תלויות בגרסאות קודמות של Qiskit, וחלק דורשות רק Qiskit v1.0+. בעיות אלו יפחתו ככל שיותר מהמערכת האקולוגית תעבור ל-Qiskit v1.0.

לאן הלכו מודולי האפליקציה?

ייתכן שתשים לב שהפקודה pip install qiskit כבר לא כוללת חבילות כגון qiskit-aer או qiskit-nature. עם הסרת מבנה ה-metapackage, רבות מהחבילות הללו פוצלו להפצות שצריך להתקין בנפרד.

לפני שחרור Qiskit SDK v1.0, Qiskit היה מורכב מהפצות Python שונות רבות, כגון qiskit-terra, ליבת המהדר; qiskit-aer, הסימולטור בעל הביצועים הגבוהים; ספק IBM Quantum® המקורי; ומספר חבילות שהפכו לא רלוונטיות המספקות תכונות אלגוריתמיות חקרניות ספציפיות או ניסויי הפעלה.

אם ברצונך להתקין את החבילות שנכללו בעבר ב-Qiskit metapackage, בקר ב-Qiskit ecosystem כדי למצוא מגוון חבילות שמתאימות לצרכיך. תוכל גם לקרוא את מדריך ההגירה של v1.0 למידע נוסף על אופן התקנת ההפצה החדשה.