رمز الخطأ: 1000

الفئة: وقت التجميع: HBM OOM

يشير هذا الخطأ إلى أنّ البرنامج يتطلّب ذاكرة نطاق ترددي عالٍ (HBM) أكثر من المتوفّر فعليًا على جهاز TPU.

أمثلة على رسائل الخطأ:

RESOURCE_EXHAUSTED: XLA:TPU compile permanent error. Ran out of memory in memory space hbm. Used 49.34G of 32.00G hbm. Exceeded hbm capacity by 17.34G.
RESOURCE_EXHAUSTED: TPU TensorCore Hbm usage: 34.82G, SparseCore Hbm usage 174.10G, exceeding available bytes: 95.74G

البرامج الخلفية في XLA: وحدة معالجة الموتّرات (TPU)

نظرة عامة

تُجري XLA عمليات تحقّق للتأكّد من أنّ الحجم الإجمالي لجميع عمليات التخصيص الثابتة الضرورية يتناسب مع ذاكرة النطاق الترددي العالي (HBM) للجهاز.

يدير المترجم سعة ذاكرة النطاق الترددي العالي الثابتة في وحدة TPU لعدة أنواع من عمليات التخصيص:

  • مدخلات ومخرجات البرنامج: مجموعات التدريب وحالات المحسِّن وما إلى ذلك
  • الذاكرة المؤقتة لـ TensorCore + SparseCore: الذاكرة الديناميكية المطلوبة لإجراء العمليات الحسابية الوسيطة (مثل عمليات التنشيط والتدرجات وما إلى ذلك).
  • الرمز الثنائي المجمَّع: رمز الآلة لكلّ من TensorCore (TC) وSparseCore (SC).
  • مساحة إضافية للنظام: مساحة محجوزة لوقت تشغيل XLA (مثل مخازن مؤقتة داخل الخلاصة في أجيال وحدات TPU القديمة).
  • الثوابت: يتم تخصيص القيم الثابتة المضمّنة في HLO IR على HBM.
  • البرامج الفرعية للمترجم: عمليات التخصيص على مستوى البرنامج وعلى مستوى كل HLO (مثل معلومات التوجيه للعُقد في الشبكة)

يحدث هذا الخطأ عندما يتعذّر على برنامج التجميع XLA استيعاب جميع عمليات التخصيص المذكورة أعلاه في ذاكرة النطاق الترددي العالي (HBM) للجهاز.

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

حلِّل رسالة الخطأ والسجلات بعناية لتحديد فئة خطأ نفاد ذاكرة HBM أدناه التي تصف خطأك بأفضل شكل:


القسم 1 تحقيق التوازن بين استخدام "القياس المستند إلى السلوك" و"التحويلات المحسّنة"

إذا كان الخطأ يوضّح بالتفصيل الاستخدام، مثلاً: "TC Hbm usage: X, SC Hbm usage Y" مقارنة القيمتين لتحديد المؤثِّر السلبي

  • الاستخدام المرتفع لـ SparseCore:
    • تحسين استخدام حزمة HBM: يتناسب استهلاك ذاكرة حزمة HBM مع feature_width وmax_unique_nz_per_row وlogical_replica_count. يمكنك تقليل الحد الأقصى لاستخدام الذاكرة المخصّصة لتخزين البيانات مؤقتًا من خلال ضبط العلامة --xla_sc_num_serialized_tables_to_optimize_hbm التي تسلسل معالجة الجداول. ويؤدي ذلك إلى تقليل التوازي.
    • التحقّق من المساحة الإضافية: تعمل SparseCore على محاذاة جداول التضمين مع 32 بايت (8 أعداد عشرية). الجداول التي تحتوي على أعمدة ذات عرض صغير (مثل < 8 floats) incur significant padding overhead, wasting HBM.
    • تقليل استخدام الذاكرة المؤقتة: تؤدي القيم المرتفعة لـ maximum_parallel_iterations إلى زيادة مقدار بيانات الإدخال التي يتم جلبها مسبقًا إلى الذاكرة المؤقتة HBM. يمكن أن يؤدي خفض هذه القيمة إلى توفير مساحة كبيرة من الذاكرة.
    • التأكّد من التقسيم: تأكَّد من تقسيم جداول التضمين بشكل صحيح على جميع الشرائح. اطّلِع على كيفية تحويل الحدود إلى جداول.
    • اطّلِع على SC: Performance and memory bottlenecks للحصول على المزيد من الأفكار.
  • الاستخدام المرتفع لـ TensorCore:
  • متوازن
    • إذا لم يكن أي منهما مفرطًا بشكل فردي ولكن كان المجموع مرتفعًا جدًا، فهذا يعني أنّك بلغت الحد الأقصى لقدرة الشريحة. عليك محاولة تقليل استخدام كلا المكوّنين. اتّبِع الاقتراحات في جميع الأقسام الثلاثة.

القسم 2 عمليات تخصيص كبيرة بشكل غير متوقّع

إذا كانت هناك عمليات تخصيص كبيرة بشكل غير متوقّع في السجلات (أكثر من% 50 من الحد الأقصى لذاكرة النطاق الترددي العالي)، لا تكون المشكلة أبدًا متعلقة بسعة الأجهزة. ويكون هذا الخطأ عادةً مرتبطًا بمشكلة في الإعدادات. تحقَّق من تصنيف XLA (إذا كان متوفّرًا) لعمليات التخصيص الكبيرة، للحصول على تلميحات بشأن رمز مصدر JAX الخاص بها.

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

القسم 3 تتجاوز عمليات التخصيص المجمَّعة الحدّ الأقصى لـ HBM

إذا نفدت سعة البرنامج بسبب تجاوز إجمالي المجموع المخصّص الحدّ الأقصى لـ HBM، من المفيد غالبًا عرض ملف تعريف الذاكرة لتحديد المخازن المؤقتة المحدّدة التي تساهم في ذروة الاستخدام. راجِع مقالة تصحيح أخطاء نفاد الذاكرة باستخدام XProf للحصول على دليل مفصّل حول تحديد العوامل الرئيسية التي تساهم في زيادة استخدام الذاكرة.

بعد تحديد بعض المساهمين الرئيسيين، اتّبِع الخطوات التالية لتحسين حجم الذاكرة.

أ. التحقّق من مساحة التعبئة والمحاذاة في الموتر

تُعدّ أشكال الموتر غير الفعّالة سببًا شائعًا وغير ملحوظ لأخطاء نفاد الذاكرة على وحدات TPU. للحصول على أفضل أداء على وحدات TPU، تعمل وسادات XLA على توسيع أبعاد الموتر، وعادةً ما يكون ذلك بمضاعفات 128 لأصغر بُعد و8 للبعد الثاني الأصغر. يؤثر هذا الحشو في كل من مصفوفات الإدخال والموترات الوسيطة (البيانات المؤقتة في HLO)، ما قد يؤدي إلى زيادة كبيرة في استخدام الذاكرة، خاصةً مع أحجام الأبعاد الصغيرة. راجِع تنسيقات المصفوفات.

  • تدقيق أشكال المخازن المؤقتة الكبيرة: (على TPU v5 مع التنسيقات التلقائية)
    • عند تمرير مؤشر الماوس فوق مخزن مؤقت في أداة Xprof Memory Viewer، تظهر بطاقة تفاصيل المخزن المؤقت التي تحتوي على تفاصيل المخزن المؤقت، بما في ذلك معلومات المساحة المتروكة.
    • مثال: قد يتم حشو شكل (129, 1024) ليصبح (256, 1024)، ما يؤدي إلى إهدار ما يقرب من% 50 من الذاكرة.
    • تصحيح: لا يتطلّب شكل (128, 1024) أي مساحة متروكة ويؤدي إلى إهدار 0% من الذاكرة.
  • محاذاة الأبعاد: تأكَّد من أنّ جميع أبعاد الموتر الكبيرة (حجم الدُفعة، وبُعد التضمين، والحجم المخفي) هي مضاعفات للعدد 128.

ب. ضبط الإعدادات

يمكنك غالبًا حلّ أخطاء نفاد الذاكرة من خلال تعديل إعدادات الضبط التالية:

  • تقليل حجم المجموعة: تتناسب الذاكرة اللازمة للتنشيطات الوسيطة والتدرجات طرديًا مع حجم المجموعة. يمكن أن يساعد تقليل حجم الدفعة في كثير من الأحيان في تقليل استخدام الذاكرة.
  • التبرّع بمخازن الإدخال المؤقتة: عند استخدام jax.jit، حدِّد donate_argnums لمعلمات النموذج. يتيح ذلك لـ XLA استبدال ذاكرة الإدخال بالناتج.
  • تفعيل الدقة المختلطة (bfloat16): استخدِم bfloat16 أو التكميم (int8 وما إلى ذلك) لأكبر موترات في البرنامج إذا كانت بنية النموذج ومتطلبات الجودة تسمح بذلك.

ج. تحسين البنية والتجزئة

إذا لم تكن تغييرات الإعداد كافية، قد يكون تصميم النموذج كبيرًا جدًا بالنسبة إلى إعدادات الأجهزة الحالية.

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

د. تعديل علامات XLA التي تؤثر في استخدام الذاكرة الرئيسية:

يمكن ضبط علامات الذاكرة الرئيسية لتحقيق توازن بين الأداء واستخدام الذاكرة بشكل أقل. ولكن يجب استخدامها كحلّ أخير لأنّها قد تؤثّر سلبًا في الأداء.

E. Tune XLA Rematerialization Pass / Manual Checkpointing

إذا كان النموذج على وشك أن يتناسب مع الذاكرة، يمكنك فرض عملية XLA::Rematerialization لتحديد أولويات توفير الذاكرة، ربما على حساب عمليات تجميع أبطأ:

علم الوصف التأثير / المفاضلة
--xla_tpu_max_hbm_size_mib يضبط هذا الخيار يدويًا الحدّ الأقصى لحجم HBM الذي تستخدمه عملية Rematerialization. يفرض على المترجم العمل بجهد أكبر لتضمين البرنامج في حد أصغر من ذاكرة النطاق الترددي العالي (HBM) الفعلية.
--xla_tpu_rematerialization_algo=PEAK_PRIORITY تركيز الجهود على نقاط ذروة استخدام الذاكرة يمكن أن تكون أكثر فعالية في تقليل استخدام الذاكرة بشكل كبير من الخوارزمية التلقائية.
--xla_tpu_rematerialization_max_block_size_limit=32 تتحكّم هذه السمة في الحد الأقصى لعدد التعليمات في أحد الأقسام التي يمكن إعادة إنشائها في الوقت نفسه. تؤدي زيادة هذا الحد إلى توفير الذاكرة على حساب زيادة وقت التجميع بشكل كبير.
--xla_tpu_rematerialization_block_effort_factor=10.0 تحدّد هذه السمة مقدار الجهد (وقت الترجمة البرمجية) المبذول للبحث عن كتل لإعادة إنشائها. تسمح القيم الأعلى بإجراء بحث أكثر شمولاً عن توفير الذاكرة على حساب زيادة أوقات التجميع.
--xla_tpu_pre_fusion_remat=true تتيح هذه السمة تنفيذ عملية Rematerialization إضافية قبل عملية الدمج. يمكن أن يؤدي إلى توفير المزيد من الذاكرة، ولكنّه يزيد من أوقات التجميع وقد يؤثر في الثبات العددي.

بدلاً من ذلك، استخدِم أداة التزيين jax.checkpoint مع jax.grad للتحكّم يدويًا في البيانات الوسيطة التي يتم حفظها في عملية النقل الأمامي مقابل إعادة احتسابها في عملية النقل الخلفي، ما يؤدي إلى استبدال دورات الحوسبة بنطاق ترددي أعلى للذاكرة.

و. استخدام أدوات إنشاء الملفات الشخصية المتقدّمة

تقدّم مقالة تصحيح أخطاء نقص الذاكرة (OOM) باستخدام XProf برنامجًا تعليميًا حول استخدام عارض الذاكرة في XProf لتصوُّر طريقة عرض برنامج الترجمة لاستخدام الذاكرة العالية النطاق الترددي (HBM).

تتيح لك هذه الأداة الاطّلاع على الحد الأقصى لتخصيص الذاكرة وعمر المخزن المؤقت، وهو أمر بالغ الأهمية لفهم ما يستهلك ذاكرة النطاق الترددي العالي (HBM) بالضبط عند بلوغ الحد الأقصى للاستخدام. للاطّلاع على إعدادات إنشاء الملفات الشخصية العامة، راجِع بدء استخدام Xprof وإنشاء الملفات الشخصية في TensorBoard.