الفئة: وقت التجميع: نوع بيانات RHS غير متوافق على الجهاز
يحدث هذا الخطأ عندما لا يكون نوع البيانات المستخدَم في المعامِل الجانب الأيمن (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) في وحدة TPU بشكلٍ أساسي مع عمليات Float32 على جميع أجيال الأجهزة.
ومع ذلك، يختلف التوافق الأساسي مع BFloat16 وأنواع البيانات الأخرى التي تم تحويلها إلى قيم كمّية (مثل Int4 أو Int8 أو Float8) حسب جيل الأجهزة. يظهر هذا الخطأ عندما تحاول النواة ربط عملية ضرب مصفوفة بوحدة MXU باستخدام نوع بيانات لا يتضمّن جيل TPU المحدّد الدوائر الفعلية لتنفيذه.
يشير هذا الخطأ عادةً إلى أنّ عملية تحديد عنوان URL الأساسي في برنامج تجميع، التي تحاول تلقائيًا تحويل الأنواع غير المتوافقة إلى أنواع متوافقة (مثل من خلال المحاكاة البرمجية)، لم تتمكّن من العثور على قاعدة تحويل صالحة أو تم منعها من إجراء ذلك لأنّ وضع التوافق كان غير مفعَّل.
تصحيح الأخطاء
لحلّ هذا الخطأ، عليك مطابقة أنواع البيانات مع إمكانات جهازك. في ما يلي الخيارات المتاحة لك:
1- التحويل إلى أنواع أساسية
إنّ الحلّ الأكثر موثوقية هو تحويل المعامِلات يدويًا إلى نوع بيانات متوافق مع الأجهزة (مثل Float32 أو BFloat16 على TPU الإصدار 4 والإصدارات الأحدث) داخل النواة قبل عملية ضرب المصفوفات.
- السبب:
Float32هو نوع البيانات العالمي المتوافق بشكلٍ أساسي مع وحدة MXU على جميع أجيال TPU. - الموازنة: يترتّب على ذلك تكلفة وحدة معالجة متجهات (VPU)، وهي الدورات المطلوبة لإجراء عملية التحويل، ولكنها تضمن تشغيل النواة على الجهاز الحالي.
2- التحقّق من "وضع التوافق"
عادةً ما يمكن للمحوّل البرمجي التعامل تلقائيًا مع مشاكل عدم تطابق الأنواع هذه في وضع التوافق المفعَّل تلقائيًا. يُرجى التحقّق جيدًا من إعدادات XLA للتأكّد من أنّ قيمة --xla_mosaic_compat_mode ليست false.
يعمل هذا الخيار كـ "إضافة" من خلال إدخال تسلسلات المحاكاة البرمجية للعمليات التي لا يتوافق معها جهازك بشكلٍ أساسي.
ما يتيحه "وضع التوافق":
- عمليات ضرب المصفوفات المختلطة الدقة: يسمح بخلط معامِلات الأعداد الصحيحة مع أجهزة تجميع الأرقام العائمة من خلال إدراج عمليات التحويل تلقائيًا (مثل توسيع الأعداد الصحيحة إلى
Float32قبل عملية ضرب المصفوفات). - محاكاة الدقة المنخفضة: على أجيال معيّنة من الأجهزة، تتم محاكاة الأنواع غير المتوافقة، مثل النقطة العائمة
4-bit(4E2M1FN) أو النقطة العائمة8-bit(8E4M3FN) من خلال توسيعها إلى أنواع متوافقة، مثلBFloat16أوFloat32قبل التنفيذ.
يُرجى العِلم أنّ هذا الوضع يمنح الأولوية للتوافق على الأداء الأقصى لأنّ المحاكاة تتطلّب تعليمات إضافية لتحويل تنسيقات البيانات قبل أن تتمكّن وحدة MXU من معالجتها.
3- ترقية الجهاز أو طلب الدعم
إذا كانت الخوارزمية تتطلّب بشكلٍ صارم أداءً أساسيًا لأنواع مثل Int4 أو Float8 بدون تكلفة إضافية للتحويل أو المحاكاة، عليك تشغيلها على جيل أحدث من وحدات TPU يتوافق مع هذه الأنواع بشكلٍ أساسي.
طلب ميزة: إذا كنت تعتقد أنّ جهازك يتوافق مع هذه العملية، أو إذا كان المحوّل البرمجي لا يتضمّن مسار محاكاة صالحًا حتى في "وضع التوافق"، يُرجى إرسال طلب ميزة. نحن عادةً ما نضمن أنّ العمليات متوافقة مع الإصدارات الأحدث. لذلك، إذا كانت النواة تعمل على جيل معيّن من وحدات TPU، من المفترض أن تعمل على جميع الأجيال المستقبلية، ولكن لا نضمن توفّر المحاكاة للأجيال الأقدم (التي قد تكون عمليات التحويل فيها مكلفة جدًا).