איתור באגים ב-X10

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

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

מדדים

כדי להדפיס דוח מדדים, הוסף קריאה PrintX10Metrics() לתוכנית שלך:

import TensorFlow

...
PrintX10Metrics()
...

זה ירשום מדדים ומונים שונים ברמת INFO .

הבנת דוח המדדים

הדוח כולל דברים כמו:

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

מידע זה מדווח במונחים של אחוזונים של הדגימות. דוגמה היא:

Metric: CompileTime
  TotalSamples: 202
  Counter: 06m09s401ms746.001us
  ValueRate: 778ms572.062us / second
  Rate: 0.425201 / second
  Percentiles: 1%=001ms32.778us; 5%=001ms61.283us; 10%=001ms79.236us; 20%=001ms110.973us; 50%=001ms228.773us; 80%=001ms339.183us; 90%=001ms434.305us; 95%=002ms921.063us; 99%=21s102ms853.173us

אנו מספקים גם מונים, המכונים משתנים שלמים העוקבים אחר מצב תוכנה פנימי. לדוגמה:

Counter: CachedSyncTensors
  Value: 395

אזהרות ידועות

Tensor מגובים על ידי X10 מתנהגים באופן סמנטי כמו ברירת המחדל של מצב להוט Tensor s. עם זאת, יש כמה אזהרות לגבי ביצועים ושלמות:

  1. ביצועים ירודים בגלל יותר מדי קומפילציות מחדש.

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

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

    יש לנו כרגע קומץ פעולות שאינן נתמכות, בין אם משום שאין דרך טובה לבטא אותן באמצעות XLA וצורות סטטיות (כרגע רק nonZeroIndices ) או חוסר מקרי שימוש ידועים (מספר פעולות אלגברה לינארית ואתחול רב-נומי) . בעוד שקל לטפל בקטגוריה השנייה לפי הצורך, ניתן לטפל בקטגוריה הראשונה רק באמצעות יכולת פעולה הדדית עם ה-CPU, מימוש שאינו XLA. לשימוש ביכולת הדדית לעתים קרובות מדי יש השלכות משמעותיות על ביצועים בגלל נסיעות הלוך ושוב של מארח ופיצול מודל ממוזג במלואו במספר עקבות. לכן מומלץ למשתמשים להימנע משימוש בפעולות כאלה בדגמים שלהם.

    ב-Linux, השתמש XLA_SAVE_TENSORS_FILE (מתועד בסעיף הבא) כדי לקבל את מעקב מחסנית Swift אשר קרא לפעולה הלא נתמכת. ניתן לבטל שמות פונקציות באופן ידני באמצעות swift-demangle .

השגת וציור עקבות

אם אתה חושד שיש בעיות באופן שבו מתקבצים אחרי גרפים, או רוצים להבין את תהליך המעקב, כלים מסופקים להתנתק ולהמחיש את העקבות. אתה יכול לגרום ל-X10 להתנתק מהעקבות שהוא מוצא על ידי הגדרת משתנה הסביבה XLA_SAVE_TENSORS_FILE :

export XLA_SAVE_TENSORS_FILE=/home/person/TraceLog.txt

יומני מעקב אלה מגיעים בשלושה פורמטים: text , hlo dot , כאשר הפורמט ניתן להגדרה באמצעות משתנה הסביבה XLA_SAVE_TENSORS_FMT:

export XLA_SAVE_TENSORS_FMT=text

כאשר אתה מפעיל את היישום שלך, ייצוג text שמתנתק יציג כל מעקב בודד בסימון טקסט ברמה גבוהה המשמש את X10. ייצוג hlo מציג את ייצוג הביניים המועבר למהדר XLA. ייתכן שתרצה להגביל את מספר האיטרציות בתוך לולאות האימון או החישוב שלך כדי למנוע מהיומנים הללו להיות גדולים מדי. כמו כן, כל ריצה של האפליקציה שלך תצורף לקובץ זה, כך שתרצה למחוק אותו בין הריצה.

הגדרת המשתנה XLA_LOG_GRAPH_CHANGES ל-1 תציין גם ביומן המעקב היכן התרחשו שינויים בגרף. זה מאוד מועיל במציאת מקומות שבהם יביא הידור מחדש.

עבור ייצוג חזותי של עקבות, אפשרות dot תנתק גרפים תואמי Graphviz. אם אתה מחלץ את החלק של עקבות שנראה כמו

digraph G {
    ...
}

לתוך הקובץ שלו, Graphviz (בהנחה שהוא מותקן) יכול ליצור תרשים חזותי באמצעות

dot -Tpng trace.dot -o trace.png

שים לב שהגדרת משתנה הסביבה XLA_SAVE_TENSORS_FILE , במיוחד בשימוש בשילוב עם XLA_LOG_GRAPH_CHANGES תהיה השפעה שלילית מהותית על הביצועים. השתמש באלה רק בעת איתור באגים, ולא עבור פעולה רגילה.

משתני סביבה נוספים

משתני סביבה נוספים לניפוי באגים כוללים:

  • XLA_USE_BF16 : אם מוגדר ל-1, הופך את כל ערכי Float ל-BF16. אמור לשמש רק לניפוי באגים מכיוון שאנו מציעים דיוק מעורב אוטומטי.

  • XLA_USE_32BIT_LONG : אם מוגדר ל-1, ממפה את סוג S4TF Long לסוג XLA של 32 סיביות. ב-TPU, חישובי מספרים שלמים של 64 סיביות הם יקרים, כך שהגדרת דגל זה עשויה לעזור. כמובן, המשתמש צריך להיות בטוח שהערכים עדיין מתאימים למספר שלם של 32 סיביות.