رمز الخطأ: E2001

الفئة: وقت الترجمة البرمجية: نوع بيانات RHS غير متوافق على الجهاز

يحدث هذا الخطأ عندما يكون نوع البيانات المستخدَم في الجانب الأيمن من المعامل في عملية ضرب المصفوفات (مثل jax.lax.dot_general أو jax.lax.conv أو jax.numpy.matmul أو المعامل @) غير متوافق بشكل أصلي مع الجيل المحدّد من وحدات TPU المستخدَمة.

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

INTERNAL: Mosaic failed to compile TPU kernel: Unsupported matmul RHS type on target: 'vector<256x256xi8>'
...

The MLIR operation involved:
%13440 = "tpu.matmul"(%13435, %13437, %13439) <dimension_numbers = #tpu.dot_dimension_numbers<...>

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

نظرة عامة

تتيح وحدة ضرب المصفوفات (MXU) في وحدة معالجة Tensor عمليات Float32 بشكل أصلي على جميع أجيال الأجهزة.

ومع ذلك، فإنّ التوافق الأصلي مع BFloat16 وأنواع البيانات الكمية الأخرى (مثل Int4 أو Int8 أو Float8) حسب جيل الأجهزة. يحدث هذا الخطأ عندما تحاول النواة ربط عملية ضرب مصفوفة بوحدة MXU باستخدام نوع بيانات لا يتضمّن الجيل المحدّد من وحدات TPU الدوائر المادية اللازمة لتنفيذ العملية.

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

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

لحلّ هذا الخطأ، يجب أن تتوافق أنواع البيانات مع إمكانات جهازك. تتوفّر لك الخيارات التالية:

1. التحويل إلى أنواع أصلية

والحلّ الأكثر موثوقية هو تحويل المعامِلات يدويًا إلى نوع بيانات متوافق مع الأجهزة (مثل Float32 أو BFloat16 على TPU v4+) داخل النواة قبل عملية ضرب المصفوفات.

  • السبب: Float32 هو نوع البيانات العام المتوافق أصلاً مع MXU على جميع أجيال وحدات TPU.
  • المفاضلة: يتطلّب ذلك تكلفة وحدة معالجة متوازية (VPU)، أي الدورات المطلوبة لتنفيذ عملية التحويل، ولكنّه يضمن تشغيل النواة على الأجهزة الحالية.

2. التحقّق من "وضع التوافق"

يمكن للمترجم عادةً معالجة مشاكل عدم تطابق الأنواع هذه تلقائيًا في وضع التوافق الذي يكون مفعَّلاً تلقائيًا. تحقَّق من إعدادات XLA للتأكّد من أنّ --xla_mosaic_compat_mode لم يتم ضبطها على "خطأ".

يعمل هذا الخيار كـ "polyfill"، أي أنّه يضيف تسلسلات محاكاة برمجية للعمليات التي لا تتوافق معها أجهزتك بشكلٍ أصلي.

ما يتيحه "وضع التوافق":

  • عمليات ضرب المصفوفات بدقة مختلطة: تتيح هذه العمليات دمج معاملات عدد صحيح مع مجمّعات Float من خلال إدراج عمليات تحويل تلقائيًا (مثل توسيع الأعداد الصحيحة إلى Float32 قبل عملية ضرب المصفوفات).
  • المحاكاة المنخفضة الدقة: في بعض أجيال الأجهزة، تتم محاكاة الأنواع غير المتوافقة، مثل النقطة العائمة 4-bit (4E2M1FN) أو النقطة العائمة 8-bit (8E4M3FN)، من خلال توسيعها إلى أنواع متوافقة، مثل BFloat16 أو Float32، قبل التنفيذ.

يُرجى العِلم أنّ هذا الوضع يعطي الأولوية للتوافق على الأداء الأقصى، لأنّ المحاكاة تتطلّب تعليمات إضافية لتحويل تنسيقات البيانات قبل أن تتمكّن وحدة MXU من معالجتها.

3- ترقية الأجهزة أو طلب الدعم

إذا كانت الخوارزمية تتطلّب أداءً أصليًا لأنواع مثل Int4 أو Float8 بدون الحاجة إلى عمليات تحويل أو محاكاة، عليك تشغيلها على جيل أحدث من وحدات TPU يتوافق معها بشكل أصلي.

طلب ميزة: إذا كنت تعتقد أنّ جهازك يتيح تنفيذ هذه العملية، أو إذا كان المحوّل البرمجي لا يتضمّن مسار محاكاة صالحًا حتى في "وضع التوافق"، يُرجى تقديم طلب ميزة. ونضمن عادةً أنّ العمليات متوافقة مع الإصدارات الأحدث. لذلك، إذا كان النواة يعمل على جيل من وحدات TPU، من المفترض أن يعمل على جميع الأجيال المستقبلية. ولكن لا يمكن ضمان توفّر محاكي للأجيال القديمة (لأنّ بعض عمليات التحويل ستكون مكلفة جدًا).