AMP
Automatic Mixed Precision
AMP (Automatic Mixed Precision) — техника обучения, автоматически использующая FP16/BF16 где возможно и FP32 для критичных операций. Ускоряет обучение в 1.5-2× при минимальной потере точности.
Что такое AMP
AMP (Automatic Mixed Precision) — подход к обучению, при котором часть вычислений выполняется в пониженной точности (FP16 или BF16), а критичные операции — в полной (FP32). PyTorch автоматически решает, какую точность использовать для каждой операции.
Зачем нужна смешанная точность
| Тип данных | Бит | Диапазон | Ускорение на Tensor Cores |
|---|---|---|---|
| FP32 | 32 | ±3.4×10³⁸ | 1× (базовая) |
| FP16 | 16 | ±65504 | 8-16× |
| BF16 | 16 | ±3.4×10³⁸ | 8-16× |
BF16 — тот же диапазон, что FP32, но меньше точность дробной части. Не требует loss scaling. Доступен на Ampere+ (A100, H100).
Loss Scaling (для FP16)
Проблема FP16: малые градиенты (~10⁻⁸) обнуляются (underflow). Решение:
1. Умножить loss на большое число (scale factor) перед backward
2. Градиенты получаются пропорционально большими → не теряются
3. Перед optimizer.step() поделить обратно
BF16 не требует loss scaling — для A100/H100 рекомендуется BF16.
Пример
from torch.cuda.amp import autocast, GradScaler
scaler = GradScaler()
for batch in dataloader:
optimizer.zero_grad()
with autocast(dtype=torch.float16):
output = model(batch)
loss = criterion(output, target)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()
Эффект
| Сценарий | Ускорение | Экономия VRAM |
|---|---|---|
| FP16 (Ampere) | 1.5-2× | ~40% |
| BF16 (Ampere+) | 1.5-2× | ~40% |
| FP8 (Hopper+) | 2-3× | ~60% |
AMP — одна из первых оптимизаций, которую стоит включить. Практически бесплатное ускорение.