FP8
FP8 تنسيق فاصلة عائمة بثمانية بتات، له متغيرا E4M3 وE5M2، يخفض استهلاك الذاكرة إلى النصف مقارنةً بـ16 بت ويضاعف إنتاجية المصفوفات على وحدات GPU المدعومة.
FP8 تنسيق أعداد فاصلة عائمة من 8 بتات، يُستخدم لتدريب الشبكات العصبية وتشغيلها بنصف الذاكرة وحركة البيانات مقارنةً بالتنسيقات ذات 16 بتًا. وكما هو الحال مع أي نوع من أعداد الفاصلة العائمة، تتكون كل قيمة من بت إشارة، وبتات أسّ تحدد مداها، وبتات جزء تحدد دقتها، لكن اقتصارها على ثمانية بتات إجمالًا يقتطع كثيرًا من المدى والدقة. وقد حدّد مهندسون من NVIDIA وArm وIntel النوعين القياسيين، E4M3 وE5M2، في ورقة تنسيقات FP8 للتعلم العميق الصادرة في سبتمبر 2022، وأثبتوا إمكان تدريب نماذج لغوية يصل عدد معلماتها إلى 175 مليارًا باستخدامهما. وعلى وحدات معالجة الرسومات (GPUs) المزودة بأنوية Tensor لـ FP8، مثل NVIDIA Hopper H100 التي طُرحت عام 2022، تنفّذ عمليات ضرب المصفوفات FP8 ضعف معدل FP16 أو BF16.
E4M3 وE5M2#
يقسّم النوعان البتات السبعة غير المخصصة للإشارة بطرائق مختلفة:
- E4M3: أربعة بتات للأسّ وثلاثة بتات للجزء. ويتخلى عن اللانهايات ويحتفظ بنمط NaN واحد ليصل إلى قيمة قصوى تبلغ 448، ويناسب الأوزان والتنشيطات في التمرير الأمامي.
- E5M2: خمسة بتات للأسّ وبتان للجزء، وفق أعراف IEEE 754 للقيم الخاصة. ويصل إلى 57,344 بخطوات أخشن، ويناسب التدرجات التي تتغير مقاديرها على نطاق أوسع.
يحوّل كلا التنسيقين القيم الصغيرة إلى صفر ويقص القيم الكبيرة، لذا تحمل موترات FP8 عادةً عامل مقياس ينقل قيمها إلى النطاق القابل للتمثيل. ويبيّن تحويل القيم بحجم التدرجات مع عامل مقياس أو بدونه السبب:
import torch
torch.manual_seed(0)
grads = torch.randn(10_000) * 1e-4 # gradient-sized values, far below 1
e4m3, e5m2 = torch.float8_e4m3fn, torch.float8_e5m2
print(f"E4M3 max {torch.finfo(e4m3).max:g}, E5M2 max {torch.finfo(e5m2).max:g}")
# Per-tensor scaling maps the largest magnitude onto the E4M3 maximum before casting
scale = torch.finfo(e4m3).max / grads.abs().max()
results = {
"E4M3 direct": grads.to(e4m3).float(),
"E5M2 direct": grads.to(e5m2).float(),
"E4M3 scaled": (grads * scale).to(e4m3).float() / scale,
}
for name, restored in results.items():
zeros = (restored == 0).float().mean()
error = ((restored - grads).abs() / grads.abs()).median()
print(f"{name}: {zeros:.0%} rounded to zero, median relative error {error:.1%}")يقرّب التحويل المباشر إلى E4M3 100% من القيم إلى الصفر، بينما يحتفظ النطاق الأوسع في E5M2 بمعظمها مع خطأ نسبي وسيط قدره 6.4% وفقدان 7%، كما يتيح التحجيم أولًا لـ E4M3 الاحتفاظ بكل القيم بخطأ وسيط قدره 2.2%. وتوفر PyTorch أيضًا float8_e4m3fnuz وfloat8_e5m2fnuz، وهما النوعان المستخدمان في مسرّعات AMD MI300، ويحذفان الصفر السالب ويغيّران انحياز الأسّ، ما يحدد الحد الأقصى لـ E4M3 عند 240. لذلك لا يمكن نقل نموذج FP8 تلقائيًا بين مورّدين مختلفين.
استراتيجيات التحجيم#
يفشل استخدام مقياس واحد لموتر كامل عندما تحدد بعض القيم المتطرفة القيمة القصوى، فتدفع كل القيم الأخرى نحو الصفر، وهو أمر شائع في تنشيطات المحوّلات. وتختلف أساليب التحجيم في مستوى تفصيلها:
- التحجيم المؤجل لكل موتر: يحدد Transformer Engine من NVIDIA مقياس كل موتر استنادًا إلى القيم القصوى المرصودة في خطوات التدريب الحديثة، فلا حاجة إلى تمرير إضافي على البيانات.
- تحجيم الكتل: حجّم DeepSeek-V3 التنشيطات لكل رقعة من 1 × 128 قيمة، والأوزان لكل كتلة من 128 × 128، وأفاد فريقه بأنه أول من تحقق من تدريب FP8 على نموذج فائق الضخامة يضم 671 مليار معلمة.
- MXFP8: يشارك تنسيق التحجيم المصغّر التابع لـ Open Compute Project مقياسًا واحدًا بقوة اثنين لكل 32 قيمة، وتنفّذه وحدات معالجة الرسومات Blackwell من NVIDIA عتاديًا.
تجمع عمليات ضرب المصفوفات نتائجها بدقة أعلى، بينما تبقى الطبقات الحساسة أو منخفضة التكلفة، مثل التطبيع وsoftmax وأوزان المحسّن الرئيسية، بصيغة BF16 أو FP32. ولذلك يشكل FP8 جزءًا واحدًا من وصفة الدقة المختلطة.
FP8 في التدريب والاستدلال#
في التدريب، يستبدل Transformer Engine من NVIDIA وTorchAO الطبقات الخطية بنسخ FP8، مع الإبقاء على الأوزان الرئيسية بدقة أعلى. وفي الاستدلال، تخزن محركات تقديم النماذج أوزان النماذج وذاكرة KV المؤقتة للنماذج اللغوية الكبيرة بصيغة FP8، ما يخفض استهلاك الذاكرة إلى النصف مقارنةً بالتنسيقات ذات 16 بتًا، ويوفر مساحة لمزيد من الطلبات المتزامنة. كما تنشئ TensorRT محركات FP8 لوحدات معالجة الرسومات المزودة بأنوية Tensor لـ FP8. ويتطلب تحقيق فائدة من التنسيق دعمًا عتاديًا: إذ تشغّل A100 من NVIDIA تنسيقات FP16 وBF16 وINT8 على أنوية Tensor، لكنها لا تتضمن وحدات FP8، بينما تدعمها وحدات معالجة الرسومات Ada Lovelace وHopper وBlackwell وسلسلة MI300 من AMD.
يقع FP8 بين التنسيقات المجاورة:
- FP16 أو الدقة النصفية: ضعف عدد البتات، مع 10 بتات للجزء ومدى يكفي لمعظم مهام الاستدلال دون مقاييس لكل موتر.
- FP4: نصف عدد البتات مرة أخرى، ويعتمد على مقاييس دقيقة للكتل للحفاظ على الدقة.
- INT8: التنسيق الآخر ذو 8 بتات، ويضم 256 مستوى متساوي التباعد بدلًا من تباعد FP8 القائم على الأسّ، لذا يحتاج إلى مقاييس معايرة، لكنه يعمل على نطاق أوسع بكثير من العتاد، بما في ذلك معظم وحدات CPU وNPU.
يعتمد Ultralytics YOLO26 مسار INT8 للاستدلال ذي 8 بتات: إذ يؤدي التصدير باستخدام quantize=8 في وضع التصدير إلى تنسيقات مثل TensorRT وOpenVINO إلى تنفيذ تكميم النموذج بعد التدريب، ومعايرة المقاييس على صور من مجموعة بيانات data، بينما يُصدَّر النموذج المضبوط باستخدام quantize=8 عبر التدريب الواعي بالتكميم إلى TensorRT بالنطاقات التي تعلمها، دون الحاجة إلى معايرة.










