קוד שגיאה: 0100

קטגוריה: זמן ריצה: כשל בהקצאת מאגר

השגיאה הזו מציינת שהקצאת הזיכרון של XLA:TPU runtime לא הצליחה למצוא בלוק זיכרון מתאים ב-HBM של המאיץ להקצאה המבוקשת.

הודעת שגיאה לדוגמה:

ValueError: RESOURCE_EXHAUSTED: Error allocating device buffer: Attempting to allocate 8.00M. That was not possible. There are 6.43M free.; (0x0x1_HBM0)

XLA backends: TPU

סקירה כללית

השגיאה הזו מופיעה ב

  • כשלים בהקצאת מאגר ביוזמת המשתמש דרך jax.device_put או
  • כשלים בהקצאות של פלט של תוכנית שנקבעה על ידי המשתמש.

הסיבות הנפוצות לכשלים האלה הן:

  • Out of Memory (OOM): המשתמש מנסה להקצות נתח של זיכרון שגדול יותר מהכמות הכוללת של הזיכרון הפנוי שזמין ב-HBM של TPU.
  • פיצול הזיכרון: ההקצאה נכשלת כי אין בלוק פנוי רציף אחד בנפח הזיכרון שגדול מספיק כדי לעמוד בדרישות הגודל. הכמות הכוללת של הזיכרון הפנוי מספיקה להקצאה, אבל היא מפוזרת במרחב הזיכרון בבלוקים קטנים ולא רציפים.

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

  • אם יש ביטולי הקצאה בתור, סביבת זמן הריצה מנסה שוב הקצאות שנכשלו,
  • במקרים של שגיאות OOM שנגרמות בגלל פיצול, זמן הריצה יכול להפעיל באופן אוטומטי איחוי וניסיון חוזר.
  • זמן הריצה של TPU נותן עדיפות להקצאות של מאגרים על פני שמירה של תוכניות בטעינה. אם הקצאת מאגר נתונים זמני נכשלת בגלל חוסר ב-HBM, המערכת תסיר תוכניות TPU שנטענו עד שיהיה מספיק זיכרון זמין למאגר הנתונים הזמני.

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

ניפוי באגים

  • הקטנת הזיכרון שבשימוש של המודל:
    • הקטנת גודל האצווה: הקטנת גודל האצווה מפחיתה ישירות את השימוש בזיכרון.
    • חלוקת פרמטרים: במודלים גדולים מאוד, כדאי להשתמש בטכניקות כמו מקביליות מודלים או חלוקה כדי להפיץ פרמטרים ב-HBM של כמה ליבות TPU או מארחים.
    • קיצור אורך הרצף או ההקשר: במודלים שפועלים על רצפים (כמו מודלים של שפה), צמצום אורך רצף הקלט יכול להקטין באופן משמעותי את טביעת הרגל של הזיכרון.
    • תרומה של מאגר זמני: שימוש בתכונות של המסגרת (למשל: jax.jit(..., donate_argnums=...)) כדי לסמן ל-XLA שאפשר לשכתב מאגרי קלט מסוימים ולעשות בהם שימוש חוזר לפלט.
    • אופטימיזציה של אסטרטגיית נקודות ביקורת: במקום לשמור את כל מצב המודל בבת אחת, כדאי לשמור רק את משקלי המודל או להשתמש באסטרטגיית נקודות ביקורת מחולקת.
  • Address Memory Layout and Padding:
    • הזיכרון של TPU מוקצה בחלקים, והריפוד יכול להגדיל את הגודל בפועל של טנסורים.
  • מוודאים שאין דליפות זיכרון:
    • חשוב לוודא שההפניות לאובייקטים מסוג jax.Array לא נשמרות מעבר לזמן הרצוי. החזקה של אובייקטים מסוג jax.Array עשויה למנוע את ביטול ההקצאה האוטומטי גם אחרי שהקומפילציה של התוכנית מסתיימת.

כלים

מפעילים את הדגל tpu_log_allocations_on_oom כדי שהקצאת הזיכרון תייצר דוח מפורט של כל ההקצאות הנוכחיות כשמתרחשת שגיאת OOM. הדוח הזה יכול להיות שימושי מאוד לניפוי באגים.