كان eval_chat_quality() متصلاً بالمشغل الخاطئ
فشل استمر 10 أيام كان يجب أن يتوقف في اليوم 3
ANDREA-120M v1 تدرّب لمدة 16.1 يوم على RTX 4090 بـ130W مستمر. تم تخزين مخرجات العينات كل 200 خطوة لكنها لم تُحلّل أبداً خلال التشغيل. بحلول الخطوة 80K (اليوم 4)، كانت العينات تقرأ region region region region region. بحلول الخطوة 110K، ''''' ''''' '' ''' ''. استمر التدريب لـ11 يوماً أخرى قبل إيقافه يدوياً في الخطوة 165K.
ما الذي أصاب إنذار الحريق بالخطأ
كانت دالة eval_chat_quality() موجودة في قاعدة الكود. كانت تقيم جودة العينة. بل وحتى عملت بشكل صحيح. لكنها كانت متصلة فقط بمدير التشغيل متعدد المراحل القديم. استخدم منهج v1 firehose مسار كود مختلف ولم يستدعِ التقييم أبدًا. كان الإنذار في غرفة أخرى مع باب مغلق.
التكلفة
16.1 يوم من الحوسبة. 130 واط مستمر. ~50 كيلوواط ساعة من الكهرباء. لم ينتج النموذج أي إخراج قابل للاستخدام في أي نقطة. وصل متوسط EMA للخسارة إلى 3.23 في الخطوة 110K، ثم ارتفع إلى 4.54 في الخطوة 165K عندما توقفت التدريب. رقميًا معقول؛ دلاليًا فارغ.
فرصة عشوائية لمفردات 8449 رمز هي 9.04. وصل v1 إلى خسارة EMA 3.23 بينما ينتج region region region. الخسارة وحدها لا يمكنها اكتشاف انهيار التماسك. نموذج يقلل من الإنتروبيا المتقاطعة بتكرار رمز عالي التردد واحد يحصل على مكافأة رقمية لنمط الفشل هذا.
لماذا خدعت منحنيات الخسارة
قيّم كل عينة على أربعة محاور
الدرجة المركبة
v2 يشحن بوابة تماسك تقيّم كل عينة (مأخوذة كل 100 خطوة أثناء تدريب الأنبوب الرئيسي) على أربعة مقاييس:
| المقياس | النطاق | ما يلتقطه |
|---|---|---|
| تنوع الثنائيات | 0-35 | التكرار على مستوى الرمزين (region region) |
| تنوع الثلاثيات | 0-35 | التكرار على مستوى الثلاث رموز (a, b, a, b, a, b) |
| وجود كلمات إنجليزية | 0-20 | الانحراف إلى غير الإنجليزية (CJK، السيريلية، هراء) |
| تنوع الأحرف | 0-10 | انهيار إلى حرف واحد (''''', ... ... ...) |
الإجمالي الممكن: 100. العتبة: 30.
لماذا أربعة مقاييس، لا مقياس واحد
كل مقياس يكشف عن وضع فشل مختلف:
- نموذج ينهار إلى ثنائية كبيرة واحدة يفشل في تنوع الثنائيات لكنه ينجح في تنوع الحروف.
- نموذج ينتج ضوضاء علامات ترقيم (''''' ''''' '') يفشل في تنوع الحروف لكنه قد ينجح في تنوع الثنائيات إذا كانت أزواج علامات الترقيم متنوعة.
- نموذج ينزلق إلى لغة غير إنجليزية (تلوث تدريب الترجمة) يفشل في وجود كلمات إنجليزية لكنه ينجح في تنوع Bigram & Trigram إذا أنتج مندرينية نحوية.
- نموذج ينتج a, b, a, b, a, b ينجح في Bigram (a-b & b-a يظهران) لكنه يفشل في Trigram (a-b-a, b-a-b يهيمنان).
معًا، تغطي المقاييس الأربعة مساحة الفشل. درجة مركبة أقل من 30 تعني أن محورًا واحدًا على الأقل انهار بشدة كافية ليسحب العينة بأكملها إلى الأسفل.
عداد متتالي
يُطلق التوقف التلقائي بعد 5 عينات متتالية تحصل على درجة أقل من 30. يمكن أن تحدث عينات سيئة منفردة أثناء انتقالات المراحل أو سحب مصادر نادرة؛ خمس متتالية تعني أن النموذج توقف عن التعافي. مع أخذ العينات كل 100 خطوة، 5 عينات متتالية منحرفة = 500 خطوة من انهيار التماسك المؤكد.
حساب درجة
كيف كان سيبدو v1
تشغيل الاختبار الرجعي
بناءً على عينات v1 المخزنة، تطبيق بوابة التماسك v2 رجعياً يظهر أن البوابة كانت ستنشط في الخطوة 132K. v1 استمرت إلى الخطوة 165K قبل الإنهاء اليدوي. كانت البوابة ستوقف التدريب 33,000 خطوة أبكر.
المحسوب الموفر
RTX 4090 تدربت بسرعة ~6 خطوات/دقيقة في FP16 cuBLAS. 33,000 خطوة / 6 خطوات/دقيقة = 5,500 دقيقة = 91.6 ساعة = 3.8 أيام من الحوسبة الموفرة. عند 130 واط مستمر، هذا ~12 كيلوواط ساعة من الكهرباء، بالإضافة إلى 3.8 أيام من تآكل الـ GPU.
لماذا الخطوة 132K وليس الخطوة 80K
v1 أنتجت region region region في الخطوة 80K. لماذا لم يُفعّل البوابة حينها؟
لأن عينات جيدة متقطعة ظهرت بين العينات السيئة. قام البانديت بالتبديل بين المصادر كل 7-42 خطوة. حتى النموذج المتحلل أنتج أحيانًا مخرجات أكثر تنوعًا عند أخذ عينة من مصدر مختلف، مما أعاد تعيين عداد المتتالية مؤقتًا. بحلول الخطوة 132K، انهار النموذج بعمق كافٍ بحيث أصبح 5 عينات متتالية متحللة (500 خطوة) حتمية.
الدرس: ربط إنذار الدخان بكل مسار التشغيل
v2 يربط eval_chat_quality() مباشرة بمسار كود معالجة العينات في المنهج الدراسي firehose، وليس فقط الـ runner القديم. كل عينة، كل تشغيل، كل مسار كود: نفس البوابة. استغرق الإصلاح ~30 سطر كود.