Training
mixed precision
Обучение с использованием FP16/BF16 для вычислений и FP32 для накопления — баланс скорости и точности.
Что такое mixed precision
Mixed precision training — техника, при которой большинство вычислений (forward/backward pass) выполняется в 16-битных форматах (FP16 или BF16), а накопление градиентов и обновление весов — в FP32. Это даёт 2–3× ускорение на Tensor Cores при сохранении численной стабильности обучения.
FP16 vs BF16
| FP16 | BF16 | |
|---|---|---|
| Диапазон чисел | ±65504 | ±3.4×10³⁸ (как FP32) |
| Точность мантиссы | 10 бит | 7 бит |
| Риск переполнения | Высокий | Минимальный |
| Loss scaling нужен | Да | Нет |
| Поддержка | Ampere, Hopper | Ampere, Hopper |
| Рекомендация | Только если нет BF16 | Предпочтительный выбор |
BF16 является стандартом для LLM-обучения на A100/H100: тот же диапазон, что FP32, никаких overflow, не нужен loss scaling.
Включение в PyTorch / HF Trainer
# Через TrainingArguments (самый простой способ)
from transformers import TrainingArguments
args = TrainingArguments(
bf16=True, # рекомендуется для A100/H100
# fp16=True, # для GPU без BF16 (V100, T4)
...
)
# Через torch.autocast (ручной контроль)
with torch.autocast(device_type="cuda", dtype=torch.bfloat16):
outputs = model(inputs)
loss = criterion(outputs, targets)
scaler.scale(loss).backward() # для FP16; для BF16 scaler не нужен
# Accelerate
from accelerate import Accelerator
accelerator = Accelerator(mixed_precision="bf16")
Loss scaling (только для FP16)
FP16 имеет малый диапазон и риск underflow градиентов. Loss scaling масштабирует loss перед backward, затем делит градиенты обратно:
# Автоматически через GradScaler
scaler = torch.cuda.amp.GradScaler()
loss = scaler.scale(loss)
loss.backward()
scaler.step(optimizer)
scaler.update()
Связанные термины
- BF16 — рекомендуемый формат для modern GPU
- FP16 — альтернатива для старых GPU
- FP8 — следующий шаг — только H100
- Tensor Core — аппаратная база для mixed precision
Готовы запустить GPU-задачу?
Запустить GPU-сервер