# التدريب بدقة مختلطة

تخزن عملية التدريب بدقة كاملة (fp32) وتُحسب جميع العمليات باستخدام 32 بت. أما الدقة المختلطة فتستخدم fp16 أو bf16 للعمليات الحسابية المكثفة في المرورين الأمامي والخلفي، مع الاحتفاظ بنسخة من الأوزان بدقة fp32 لتحديث المُحسِّن. يؤدي ذلك إلى تسريع الحسابات، وتقليل الذاكرة المخصصة للأوزان والتفعيلات، والحفاظ على استقرار التدريب.

```text
┌─────────────────────────────────────────────────────┐
│           MIXED PRECISION TRAINING LOOP             │
│                                                     │
│  fp32 master weights ──cast──▶ fp16/bf16            │
│         ▲                          │                │
│         │                    FORWARD (autocast)     │
│         │                    matmuls in fp16/bf16   │
│         │                    reductions stay fp32   │
│         │                          │ loss           │
│         │                    LOSS SCALE ×S  ──fp16  │
│         │                          │                │
│         │                    BACKWARD               │
│         │                    grads in fp16/bf16     │
│         │                          │                │
│         │                    UNSCALE ÷S    ──fp16   │
│         │                    check inf/nan          │
│         │                    cast grads → fp32      │
│         └────────────────────────── optimizer.step  │
└─────────────────────────────────────────────────────┘
```

اضبط `bf16()` أو `fp16()` على `True` لتفعيل التدريب بدقة مختلطة. كلاهما من الأنواع ذات 16 بت، لكن bf16 يتشارك نطاق الأسس نفسه مع fp32، لذا نادراً ما يحدث تجاوز للحدود. استخدم bf16 على وحدات معالجة الرسوميات من Ampere أو أحدث (A100، H100)، ولجأ إلى fp16 على الأجهزة الأقدم مثل V100 أو T4.

> [!WARNING]
> حمّل النموذج بدقة fp32، وإلا أصبح [autocast](https://docs.pytorch.org/docs/stable/amp.html#autocasting) بلا فائدة. فالتحميل بدقة bf16 أو fp16 لا يترك نسخة رئيسية بدقة fp32 يمكن لمُحسِّن التدريب (optimizer) التحديث منها.

```py
from transformers import TrainingArguments

args = TrainingArguments(..., bf16=True)
args = TrainingArguments(..., fp16=True)
```

إذا كان نموذجك مستقرًا رقميًا في bf16/fp16، يمكنك تجاوز الدقة المختلطة بالكامل وتحميل النموذج وتدريبه مباشرةً في bf16/fp16. وهذا يتجنب إنشاء نسخة من الأوزان بدقة fp32 في الذاكرة.

## tf32

[tf32](https://blogs.nvidia.com/blog/tensorfloat-32-precision-format/) هو وضع حساب على معالجات Ampere الرسومية يستخدم مانتيسا من 10 بتات لعمليات ضرب المصفوفات بدلاً من 23 بتاً. يمكن أن يمنحك هذا تسريعاً، خاصة عند اقترانه مع bf16/fp16. يفعّل PyTorch وضع tf32 لعمليات ضرب المصفوفات افتراضياً على معالجات Ampere الرسومية والأحدث، لكن ضبطه صراحةً في [TrainingArguments](/docs/transformers/main/ar/main_classes/trainer#transformers.TrainingArguments) يضمن تفعيله بغض النظر عن إصدار PyTorch أو الإعدادات الافتراضية للبيئة.

```py
from transformers import TrainingArguments

args = TrainingArguments(..., bf16=True, tf32=True)
```

## الخطوات التالية

- اطّلع على دليل [Kernels](./kernels) لمعرفة كيفية تسريع التدريب باستخدام نواة مدمجة مخصصة.
- اطّلع على دليل [torch.compile](./torch_compile) لمعرفة كيفية تجميع المسارين الأمامي والخلفي لزيادة الإنتاجية.

