الفئة: وقت التجميع: خطأ 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" ...
- Custom Kernel Scoped Vmem OOM: إذا كان الخطأ يشير إلى نواة مخصّصة، انتقِل إلى إعادة ضبط النواة.
- مشاكل Vmem غير مرتبطة بالنواة: إذا حدث خطأ Vmem OOM بسبب عملية غير مرتبطة بنواة مخصّصة، من المحتمل أن يكون ذلك خطأ داخليًا في المترجم. يُرجى الإبلاغ عن خطأ في XLA مع تضمين تفريغ HLO.
إعادة ضبط النواة
إذا كان الخطأ ناتجًا عن نواة مخصّصة، استخدِم التقنيات التالية لتقليل متطلبات الذاكرة للنواة:
- ضبط أحجام الحظر: قلِّل أحجام الحظر (أحجام المربّعات) في إعدادات النواة لتقليل استخدام الذاكرة الافتراضية المحصورة.
- ضبط حدود الذاكرة الافتراضية على مستوى كل نواة: اطلب بشكل صريح مقدار الذاكرة المطلوب لتلك النواة المحدّدة باستخدام المَعلمة vmem_limit_bytes.
- تعديل تلوين الذاكرة: يمكنك تلوين/تقييد مدخلات/مخرجات النواة إلى VMEM بشكل صريح باستخدام pallas.tpu.with_memory_space_constraint. ولكن احرص على عدم تلوين عدد كبير جدًا من المدخلات والمخرجات إلى Vmem، لأنّ ذلك قد يتسبب في حدوث خطأ OOM في Vmem بشكل عام.
- إذا كان من الصعب إعادة ضبط النواة بشكل محدّد أو إذا كانت المشكلة تؤثر في العديد من النواة، يمكنك تعديل الحدّ الأقصى العام لـ Vmem باستخدام العلامة --xla_tpu_scoped_vmem_limit_kib.