رمز الخطأ: E0100

الفئة: وقت التشغيل: تعذُّر تخصيص المخزن المؤقت

يشير هذا الخطأ إلى أنّ أداة تخصيص الذاكرة في وقت التشغيل XLA:TPU لم تتمكّن من العثور على كتلة ذاكرة مناسبة في ذاكرة النطاق الترددي العالي (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 الخلفية: وحدة معالجة الموتّرات

نظرة عامة

يظهر هذا الخطأ في الحالات التالية:

  • حالات تعذّر تخصيص المخزن المؤقت التي يبدأها المستخدم عبر jax.device_put

أو

  • حالات تعذُّر تخصيص مخرجات البرنامج الذي يجدوله المستخدم.

تحدث حالات الفشل هذه عادةً لسببَين:

  • خطأ نفاد الذاكرة (OOM): يحاول المستخدم تخصيص جزء من الذاكرة أكبر من إجمالي مقدار الذاكرة الحرة المتاحة في ذاكرة النطاق الترددي العالي (HBM) لوحدة TPU.
  • تجزئة الذاكرة: يتعذّر التخصيص لأنّه لا تتوفّر كتلة واحدة متجاورة فارغة في مساحة الذاكرة كبيرة بما يكفي لتلبية الحجم المطلوب. يكون إجمالي مقدار الذاكرة الحرة كافيًا للتخصيص، ولكنّه يكون متناثرًا في مساحة الذاكرة على شكل وحدات صغيرة غير متجاورة.

يتضمّن وقت تشغيل وحدة TPU عددًا من الآليات لإعادة محاولة عمليات التخصيص الفاشلة، بما في ذلك:

  • إذا كانت هناك عمليات إلغاء تخصيص في قائمة الانتظار، يعيد وقت التشغيل محاولة عمليات التخصيص التي تعذّر إجراؤها.
  • في حال حدوث أخطاء نفاد الذاكرة بسبب التجزئة، يمكن لوقت التشغيل أن يؤدي تلقائيًا إلى بدء عملية إلغاء التجزئة وإعادة المحاولة.
  • تعطي بيئة التشغيل في وحدة TPU الأولوية لتخصيص المخزن المؤقت على إبقاء البرامج محملة. إذا تعذّر تخصيص المخزن المؤقت بسبب عدم توفّر ذاكرة HBM كافية، سيقوم النظام بإخلاء برامج TPU المحمَّلة إلى أن تتوفّر ذاكرة كافية للمخزن المؤقت.

لذلك، يتطلّب الخطأ الذي يحدث بعد اتّخاذ إجراءات التخفيف المذكورة أعلاه عادةً اتّخاذ إجراء من المستخدم.

تصحيح الأخطاء

  • تقليل استهلاك الذاكرة للنموذج
    • تقليل حجم الدفعة: يؤدي تقليل حجم الدفعة إلى خفض مقدار الذاكرة المستخدَمة بشكل مباشر.
    • تقسيم المَعلمات: بالنسبة إلى النماذج الكبيرة جدًا، استخدِم أساليب مثل التوازي بين النماذج أو التقسيم لتوزيع المَعلمات على ذاكرة النطاق الترددي العالي (HBM) الخاصة بنوى أو مضيفات متعددة من وحدات معالجة Tensor.
    • تقصير طول التسلسل أو السياق: بالنسبة إلى النماذج التي تعمل على التسلسلات (مثل نماذج اللغة)، يمكن أن يؤدي تقليل طول تسلسل الإدخال إلى تقليل استهلاك الذاكرة بشكل كبير.
    • التبرّع بالمخزن المؤقت: استخدِم ميزات إطار العمل (مثل: jax.jit(..., donate_argnums=...)) للإشارة إلى XLA بأنّه يمكن استبدال مخازن مؤقتة معيّنة للإدخال وإعادة استخدامها في الإخراجات. يمكنك الاطّلاع على مقالة التبرّع بالوقت الفاصل لمزيد من التفاصيل.
    • استراتيجية تحسين نقاط التوقّف: بدلاً من حفظ حالة النموذج بأكملها مرة واحدة، ننصحك بحفظ أوزان النموذج فقط أو استخدام استراتيجية نقاط توقّف مجزّأة.
  • معالجة تنسيق الذاكرة والمسافة المتروكة
    • يتم تخصيص ذاكرة وحدة معالجة الموتّرات في أجزاء، ويمكن أن يؤدي التعبئة إلى زيادة الحجم الفعلي للموتّرات.
  • التأكّد من عدم حدوث تسرُّب للذاكرة
    • تأكَّد من عدم الاحتفاظ بمراجع لكائنات jax.Array لفترة أطول من المدة المحدّدة. قد يؤدي الاحتفاظ بكائنات jax.Array إلى منع إلغاء التخصيص التلقائي حتى بعد اكتمال تجميع البرنامج.

يمكنك أيضًا الاطّلاع على رمز الخطأ: E1000 لمعرفة استراتيجيات أخرى يمكنك استخدامها لتقليل مقدار الذاكرة التي يستخدمها كل برنامج.

الأدوات

فعِّل العلامة tpu_log_allocations_on_oom التي سيعرض فيها أداة التخصيص تقريرًا مفصّلاً عن جميع عمليات التخصيص الحالية عند حدوث خطأ OOM، ما قد يكون مفيدًا جدًا في تصحيح الأخطاء.