# Обучение с смешанной точностью

Обучение с полной точностью (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 на GPU Ampere и новее (A100, H100), а на более старом оборудовании, таком как V100 или T4, откатывайтесь на fp16.

> [!WARNING]
> Загрузите модель в fp32, иначе [autocast](https://docs.pytorch.org/docs/stable/amp.html#autocasting) не будет выполнять никаких действий. Загрузка в bf16 или fp16 не оставляет мастер-копии в fp32, от которой оптимизатор мог бы обновлять веса.

```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/) — это режим вычислений на GPU Ampere, который использует 10-битную мантиссу для матричных умножений вместо 23 бит. Это может обеспечить ускорение, особенно в сочетании с bf16/fp16. PyTorch по умолчанию включает tf32 для матричных умножений на GPU Ampere и новее, но явное указание этого параметра в [TrainingArguments](/docs/transformers/main/ru/main_classes/trainer#transformers.TrainingArguments) гарантирует его активацию независимо от версии PyTorch или настроек окружения по умолчанию.

```py
from transformers import TrainingArguments

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

## Дальнейшие шаги

- См. руководство [Kernels](./kernels), чтобы узнать, как ускорить обучение с помощью пользовательских слиянных ядер.
- См. руководство по [torch.compile](./torch_compile), чтобы узнать, как компилировать прямой и обратный проходы для повышения пропускной способности.

