رمز الخطأ: 0100

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

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

نظرة عامة

يحدث هذا الخطأ في

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

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

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

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

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

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

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

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

الأدوات

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