Mixed Precision
يدرّب التدريب مختلط الدقة الشبكات العصبية بحسابات 16 بت وأوزان رئيسية بدقة FP32، ما يقلل استخدام الذاكرة ووقت التدريب. يتناول تحجيم الخسارة وBF16 وAMP.
الدقة المختلطة تقنية تدريب تنفذ معظم العمليات الحسابية في الشبكة العصبية بتنسيق فاصلة عائمة ذي 16 بت، إما FP16 (دقة نصفية) أو BF16، مع الاحتفاظ بنسخة رئيسية من أوزان النموذج ذات 32 بت (FP32) وتنفيذ العمليات الحساسة عدديًا بدقة FP32. تستهلك قيم 16 بت نصف الذاكرة وعرض النطاق الترددي الذي تستهلكه قيم FP32، وتضرب أنوية Tensor في وحدات GPU الحديثة هذه القيم بسرعة أكبر بكثير، لذا تقلل الدقة المختلطة مدة التدريب وتتيح احتواء أحجام دفعات أكبر في الذاكرة مع الحفاظ على دقة FP32. والوصفة التي وصفها Micikevicius وآخرون عام 2018، باستخدام أوزان رئيسية FP32 وحسابات FP16 وتحجيم الخسارة، هي ما تؤتمته الآن أطر التعلم العميق تحت مسمى الدقة المختلطة التلقائية (AMP).
آلية عمل الدقة المختلطة#
تتيح ثلاثة عناصر مطابقة دقة الانتشار العكسي وتحديثات الأوزان في التدريب ذي 16 بت لدقة التدريب باستخدام FP32:
- الأوزان الرئيسية FP32: يطبّق المحسّن كل تحديث على نسخة FP32 من الأوزان. وغالبًا ما يُقرَّب تحديث ضئيل يُضاف مباشرةً إلى وزن FP16 إلى الصفر، لأن FP16 لا يحتفظ إلا بنحو ثلاثة أرقام عشرية معنوية.
- الدقة لكل عملية: ينفذ سياق autocast عمليات ضرب المصفوفات والالتفافات بدقة 16 بت، حيث تمنح أنوية Tensor أكبر تسريع، ويُبقي عمليات الاختزال وسوفت ماكس والخسارة بدقة FP32.
- تحجيم الخسارة: لا يستطيع FP16 تمثيل مقادير أصغر من نحو 6 × 10⁻⁸، لذلك قد يهبط العديد من التدرجات الصغيرة إلى الصفر. ويؤدي ضرب الخسارة بعامل تحجيم قبل الانتشار العكسي إلى نقل كل تدرج إلى نطاق FP16، ثم تُقسم التدرجات على العامل نفسه قبل تحديث الأوزان.
في AMP في PyTorch، يتولى torch.autocast التحويل لكل عملية، ويتولى GradScaler تحجيم الخسارة:
import torch
from torch import nn
# Use FP16 on an NVIDIA GPU and BF16 on CPU
device = "cuda" if torch.cuda.is_available() else "cpu"
dtype = torch.float16 if device == "cuda" else torch.bfloat16
model = nn.Linear(512, 10).to(device) # master weights stay in FP32
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
scaler = torch.amp.GradScaler(device, enabled=dtype == torch.float16) # loss scaling for FP16 only
x = torch.randn(64, 512, device=device)
with torch.autocast(device_type=device, dtype=dtype):
out = model(x) # the matrix multiply runs in 16-bit
loss = out.float().pow(2).mean()
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()
print(f"Output: {out.dtype}, weights: {model.weight.dtype}, gradients: {model.weight.grad.dtype}")على CPU، يطبع المقتطف torch.bfloat16 لمخرج الطبقة وtorch.float32 لكل من الأوزان وتدرجاتها؛ أما على وحدة NVIDIA GPU، فالمخرج هو torch.float16. وتتعايش حسابات 16 بت والأوزان الرئيسية FP32 في خطوة تدريب واحدة.
يعدّل GradScaler في PyTorch عامل التحجيم ديناميكيًا. يبدأ من 65,536، ويخفض العامل إلى النصف ويتخطى الخطوة كلما احتوت التدرجات المحجّمة على قيم inf أو NaN، ثم يضاعف العامل بعد 2,000 خطوة متتالية من دون تجاوز، ليستقر العامل دون النقطة التي تفيض عندها التدرجات بقليل.
FP16 وBF16 ودقات أقل#
يخصص FP16 خمسة بتات للأس، وعشرة للجزء الكسري، لذا فهو دقيق لكنه يفيض عند تجاوز 65,504. ويحتفظ BF16 ببتات الأس الثمانية الخاصة بـFP32، فيغطي النطاق نفسه حتى نحو 3.4 × 10³⁸، مع سبعة بتات فقط للجزء الكسري، ولذلك لا يحتاج إلى تحجيم الخسارة مقابل تقريب أقل دقة. يعمل BF16 على وحدات NVIDIA GPU بدءًا من جيل Ampere، وعلى TPU من Google، وعلى كثير من وحدات CPU الحديثة، وهو تنسيق التدريب المعتاد لـنماذج اللغة الكبيرة. وتمتد الفكرة نفسها إلى FP8 على وحدات GPU من طرازي Hopper وBlackwell عبر Transformer Engine من NVIDIA، وإلى تنسيقات FP4 مثل NVFP4 على Blackwell.
الدقة المختلطة عمليًا#
يتمثل الخطر العملي الرئيسي لـAMP في نموذج أو وحدة GPU تنتج خسائر NaN عند استخدام دقة 16 بت. ويُفعّل تدريب Ultralytics YOLO26 تقنية AMP افتراضيًا باستخدام amp=True، إذ يقارن أولًا تنبؤات FP32 وAMP من نموذج YOLO26n على وحدات GPU التي تستخدم CUDA، ثم يعود إلى FP32 إذا اختلفت التنبؤات أو كانت وحدة GPU من سلسلة معروفة بإنتاج خسائر NaN عند استخدام AMP، مثل سلسلة GTX 16. ويحوّل إعداد amp="bf16" السياق التلقائي إلى BF16 مع تعطيل تحجيم الخسارة.
تُستخدم الدقة المختلطة على نطاق واسع حيثما كان التدريب مقيدًا بالذاكرة أو الوقت. تدرّب الفرق التي تبني المركبات ذاتية القيادة نماذج اكتشاف الكائنات على ملايين الإطارات عالية الدقة، حيث يتيح خفض ذاكرة التنشيطات إلى النصف استخدام صور ودفعات أكبر. وفي تحليل الصور الطبية، تتجاوز أحجام التصوير المقطعي والرنين المغناطيسي ثلاثي الأبعاد غالبًا سعة ذاكرة GPU عند استخدام FP32، وتتيح التنشيطات ذات 16 بت تدريب نماذج التجزئة على أحجام كاملة.
الدقة المختلطة مقارنةً بالمفاهيم ذات الصلة#
- تكميم النماذج: يحوّل التكميم نموذجًا مدرّبًا إلى أعداد صحيحة منخفضة الدقة مثل INT8 لتسريع الاستدلال، بينما تسرّع الدقة المختلطة التدريب وتُبقي الأوزان بأعداد فاصلة عائمة.
- التدريب الواعي بالتكميم: تحاكي QAT التقريب إلى أعداد صحيحة أثناء التدريب، ليحافظ النموذج على دقته بعد نشره باستخدام INT8.
- الدقة النصفية: تشير الدقة النصفية إلى تنسيق الأعداد FP16 نفسه، أما الدقة المختلطة فهي تقنية التدريب التي تجمعه مع FP32. ويؤدي التدريب باستخدام FP16 وحده، دون أوزان رئيسية FP32 أو تحجيم للخسارة، إلى فقدان التحديثات الصغيرة بسبب التقريب والتدرجات الصغيرة بسبب الهبوط إلى ما دون النطاق، وغالبًا ما يمنع تقارب النموذج.










