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-сервер