الفئة: وقت الترجمة البرمجية: خطأ OOM في Vmem ضمن النطاق
يشير هذا الخطأ إلى أنّ البرنامج يتطلّب مساحة أكبر من ذاكرة المتّجه المحدودة النطاق (Vmem) مما تم تخصيصه.
أمثلة على رسائل الخطأ:
RESOURCE_EXHAUSTED: Ran out of memory in memory space vmem while allocating on stack for %my-custom-kernel = bf16[2048,4096]{1,0:T(8,128)(2,1)} custom-call(...) ...
البرامج الخلفية في XLA: وحدة معالجة الموتّرات (TPU)
نظرة عامة
تحتوي وحدات TPU على ذاكرة متجهة (VMEM) وهي ذاكرة محلية مؤقتة تستخدمها حصريًا وحدة TensorCore (TC). يدير المترجم Vmem لأنواع مختلفة من عمليات التخصيص:
- عمليات التخصيص على مستوى التعليمات: مساحة تخزين مؤقتة في Vmem أثناء تنفيذ تعليمات HLO واحدة. ويشمل ذلك مخزنًا مؤقتًا لنطاق المعامِلات (مثل التخزين المؤقت المزدوج) وعمليات نقل البيانات من الذاكرة إلى المسجّل.
- عمليات تخصيص الإنفاق على مستوى البرنامج: عمليات تخصيص الإنفاق التي تتجاوز نطاق تعليمات HLO الفردية. وهي عادةً عبارة عن نتائج مؤقتة ومتوسطة المستوى من HLO، وتكون عبارة عن مدخلات و/أو مخرجات لتعليمات HLO.
يحدث خطأ "نفاد الذاكرة" (OOM) في Vmem على مستوى وقت الترجمة عندما تتجاوز عمليات التخصيص على مستوى التعليمات الحدّ الأقصى المسموح به لتلك التعليمات. يتم التحكّم في هذا الحدّ
- على مستوى العالم للبرنامج بأكمله من خلال العلامة --xla_tpu_scoped_vmem_limit_kib
و
- لكل نواة مخصّصة من خلال المَعلمة vmem_limit_bytes.
تحدث هذه الأخطاء عادةً بسبب خطأ في برنامج الترجمة البرمجية الداخلي أو بسبب تجاوز نواة مخصّصة لحدود التخصيص.
تصحيح الأخطاء
حلِّل رسالة الخطأ بعناية لتحديد ما إذا كان الخطأ ناتجًا عن نواة مخصّصة أو HLO عادي. يجب أن يتضمّن الخطأ الناتج عن نواة مخصّصة التوقيع التالي:
Ran out of memory in memory space vmem while allocating on stack for %my-custom-call = <output-shape> custom-call(<params>), custom_call_target="tpu_custom_call" ...
- خطأ مخصّص في النواة ضمن نطاق Vmem OOM: إذا كان الخطأ يشير إلى نواة مخصّصة، انتقِل إلى إعادة ضبط النواة.
- مشاكل Vmem غير متعلقة بالنواة: إذا حدث خطأ Vmem OOM بسبب عملية غير مخصّصة للنواة، من المحتمل أن يكون ذلك خطأ داخليًا في المترجم. يُرجى تقديم تقرير خطأ بشأن XLA مع تفريغ HLO.
إعادة ضبط النواة
إذا كان الخطأ ناتجًا عن نواة مخصّصة، استخدِم التقنيات التالية لتقليل متطلبات الذاكرة للنواة:
- ضبط أحجام الحظر: قلِّل أحجام الحظر (أحجام المربّعات) في إعدادات النواة لتقليل استخدام الذاكرة الافتراضية المحصورة.
- ضبط حدود الذاكرة الافتراضية على مستوى النواة: اطلب بشكل صريح مقدار الذاكرة المطلوب لتلك النواة المحدّدة باستخدام vmem_limit_bytes param.
- تعديل تلوين الذاكرة: يمكنك تلوين/تقييد مدخلات/مخرجات النواة بشكل صريح إلى Vmem باستخدام pallas.tpu.with_memory_space_constraint. يجب الحرص على عدم تلوين عدد كبير جدًا من عمليات الإدخال والإخراج إلى Vmem، لأنّ ذلك قد يتسبب في حدوث خطأ OOM في Vmem بشكل عام.
- تعديل حدّ الذاكرة الافتراضية (Vmem): إذا كان من الصعب إعادة الضبط الخاصة بالنواة أو إذا كانت المشكلة تؤثر في العديد من النواة، يمكنك تعديل حدّ الذاكرة الافتراضية الشامل باستخدام العلامة --xla_tpu_scoped_vmem_limit_kib.