FP4
FP4 تنسيق فاصلة عائمة بأربعة بتات، غالبًا E2M1، يستخدم مقاييس لكل كتلة لتقليص نماذج الذكاء الاصطناعي وتسريعها. يتناول هذا الموضوع NVFP4 وMXFP4 والأجهزة والبرمجة.
FP4 هو تنسيق أعداد فاصلة عائمة من 4 بتات يُستخدم لتخزين أوزان الشبكات العصبية وتنشيطاتها وحسابها ضمن تكميم النماذج. وتستخدم عتاديات وبرمجيات الذكاء الاصطناعي تخطيط E2M1: بت إشارة واحد، وبتّان للأس، وبت واحد للجزء الكسري، ولا يمكنه تمثيل سوى 0 و±0.5 و±1 و±1.5 و±2 و±3 و±4 و±6. ويستهلك كل مقدار نصف الذاكرة التي يستهلكها FP8 وربع الذاكرة التي يستهلكها FP16 (الدقة النصفية)، وهو أمر بالغ الأهمية في النماذج اللغوية الكبيرة وغيرها من نماذج الذكاء الاصطناعي التوليدي التي يهيمن فيها نقل الأوزان من الذاكرة على زمن استجابة الاستدلال. وقد وصلت عمليات الضرب المصفوفي الأصلية بصيغة FP4 مع وحدات معالجة الرسومات Blackwell من NVIDIA وسلسلة Instinct MI350 من AMD، ويُستخدم FP4 للاستدلال والتدريب على نحو متزايد.
آلية عمل FP4#
لا تستطيع خمس عشرة قيمة متميزة تغطية نطاق الأوزان والتنشيطات الحقيقية، لذا يقسّم كل تنسيق FP4 عملي موترًا إلى كتل صغيرة ويخزن مقياسًا مشتركًا واحدًا لكل كتلة، يُختار بحيث تقارب أكبر قيمة مطلقة في الكتلة الحد الأقصى E2M1 البالغ 6. ويختلف التنسيقان الرئيسيان في حجم الكتلة ودقة المقياس:
- MXFP4: يعرّف مواصف Microscaling (MX) التابع لمشروع Open Compute هذا التنسيق، ويجمع MXFP4 فيه 32 قيمة تحت مقياس واحد من قوى العدد 2 بدقة 8 بتات (E8M0). وبصفته مواصفة مفتوحة، فهو مدعوم عبر مورّدين مختلفين، منهم AMD مع سلسلة MI350 وNVIDIA مع وحدات معالجة الرسومات Blackwell.
- NVFP4: يجمع تنسيق NVIDIA هذا 16 قيمة تحت مقياس FP8 (E4M3) واحد، ويضيف مقياس FP32 ثانيًا لكل موتر. وتقلل الكتل الأصغر والمقاييس الأدق خطأ التكميم، وأفادت NVIDIA بأن خسارة الدقة بلغت 1% أو أقل مقارنةً بـ FP8 في معايير DeepSeek-R1-0528.
يقرّب المقتطف أدناه موترًا يضم بعض القيم الشاذة إلى قيم E2M1 باستخدام مقياس واحد للموتر كله، ثم مقياس واحد لكل 32 قيمة ولكل 16 قيمة، أي حجمي الكتل في MXFP4 وNVFP4:
import torch
# The eight non-negative values FP4 E2M1 can represent; the sign bit mirrors them
grid = torch.tensor([0.0, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0])
torch.manual_seed(0)
x = torch.randn(4096)
x[::512] *= 20 # a few large outliers, as real weight and activation tensors have
# One shared scale for the whole tensor, then MXFP4-sized and NVFP4-sized blocks
for block in [4096, 32, 16]:
blocks = x.reshape(-1, block)
scale = blocks.abs().amax(dim=1, keepdim=True) / 6.0 # map each block's largest value to 6
nearest = ((blocks.abs() / scale).unsqueeze(-1) - grid).abs().argmin(dim=-1)
dequantized = grid[nearest] * blocks.sign() * scale
error = (dequantized.flatten() - x).abs().mean()
print(f"Block size {block:>4}: mean absolute error {error:.4f}")عند استخدام مقياس واحد للموتر كله، تمدّ القيم الشاذة المقياس كثيرًا، فتُقرّب معظم القيم العادية إلى الصفر، ويبلغ متوسط الخطأ المطلق 0.7238. أما الكتل المؤلفة من 32 و16 قيمة فتحصر كل قيمة شاذة في كتلة واحدة، لذا يحتفظ كل ما عداها بمقياس دقيق، وينخفض الخطأ إلى 0.0901 و0.0747.
الاستدلال والتدريب باستخدام FP4#
في الاستدلال، يكمّم محرك استدلال مثل TensorRT الأوزان، وغالبًا التنشيطات، إلى FP4 بعد التدريب، وينفذ عمليات الضرب المصفوفي بصيغة FP4، ويجمع النتائج بدقة أعلى. وتوفر إعدادات NVFP4 وMXFP4 في TorchAO سير العمل نفسه في PyTorch على وحدات معالجة الرسومات المدعومة. وأصدرت OpenAI النموذج gpt-oss-120b بأوزان مزيج الخبراء التي دُرّبت لاحقًا باستخدام MXFP4، ما يتيح تشغيل النموذج ذي 117 مليار معامل على وحدة GPU واحدة بسعة 80 GB.
يوسّع التدريب بصيغة FP4 التدريب متعدد الدقة إلى 4 بتات، وهو أصعب من الاستدلال لأن نطاق التدرجات والتنشيطات يتغير طوال التدريب. وقد درّبت دراسة NVIDIA حول التدريب المسبق باستخدام NVFP4 نموذجًا ذا 12 مليار معامل على 10 تريليونات رمز باستخدام NVFP4، محققة خسارة تدريب ودقة لاحقة مماثلتين لخط أساس FP8، وذلك عبر الجمع بين تحويلات Hadamard العشوائية لتوزيع القيم الشاذة، والتقريب العشوائي للتدرجات، والإبقاء على بضع طبقات بدقة أعلى.
نشر نماذج FP4#
تتطلب نوى موتر FP4 الأصلية وحدات معالجة الرسومات NVIDIA Blackwell أو الأحدث، مثل B200 وسلسلة GeForce RTX 50، أو مسرّعات AMD Instinct MI350 لتنسيق MXFP4؛ أما وحدات GPU من طراز Hopper مثل H100 فتسرّع FP8 لا FP4. وتوضح مصفوفة دعم TensorRT الدقات التي تدعمها كل وحدة GPU. ويجب التحقق من الدقة بعد التحويل وقبل نشر النموذج، لأن الطبقات الحساسة أو النماذج الصغيرة قد يتراجع أداؤها، كما يستعيد التدريب الواعي بالتكميم الدقة عندما لا يكفي التكميم بعد التدريب. ويبني تصدير TensorRT في Ultralytics YOLO26 المحركات بدقة FP16 باستخدام quantize=16 أو INT8 باستخدام quantize=8، وهما خيارا الدقة المنخفضة المتاحان لنماذج YOLO.
FP4 مقابل التنسيقات ذات الصلة#
- FP8: يضم FP8 (E4M3 أو E5M2) قيمًا متميزة أكثر بكثير ونطاقًا أوسع، وبما أن التدريب باستخدام FP8 شائع في النماذج الكبيرة، فهو خط الأساس المعتاد لمقارنة نتائج FP4.
- BFloat16: يظل BF16 التنسيق القياسي لتدريب النماذج الكبيرة وتقديمها بجودتها الكاملة، إذ يستخدم أربعة أضعاف عدد بتات FP4.
- INT4: يوزع INT4 مستوياته الستة عشر بالتساوي، بينما يكدّس FP4 مستويات أكثر قرب الصفر، حيث تتركز معظم الأوزان والتنشيطات. ولا يزال INT4 شائعًا لضغط أوزان النماذج اللغوية فقط، باستخدام طرائق مثل GPTQ وAWQ.
- مقبس FP4 من AMD: يُستخدم FP4 أيضًا اسمًا لمقبس معالج محمول من AMD لا صلة له بالتنسيق، وهو الحزمة المستخدمة في وحدات APU المحمولة من جيل Carrizo مثل FX-8800P.










