메모리 절반, 속도 두 배 (자주)
Mixed-precision training 은 대부분 op 를 float16 또는 bfloat16 으로 돌리고 numerically sensitive op (softmax, normalization, loss reduction) 작은 set 만 float32 유지. Ampere+ GPU 와 Apple Silicon 에서 보통 1.5–2x speedup AND activation 메모리 약 절반.
modern PyTorch API 는 torch.amp (옛 torch.cuda.amp 는 deprecated). 두 재료:
autocast(device_type='cuda', dtype=...)— op 별 정밀도 선택하는 context manager.GradScaler(device_type)— fp16 에만 필요. backward 전 loss 를 scale-up 해서 좁은 fp16 range 에서 gradient underflow 방지, optimizer step 전 unscale.
fp16 vs bf16
- bfloat16 — float32 와 같은 exponent range, mantissa 정밀도 적음. Ampere+ NVIDIA GPU (A100, RTX 30/40, H100) 와 Apple Silicon. GradScaler 불필요. 추천 modern default.
- float16 — 좁은 exponent range. GradScaler 필요. 옛 GPU (V100, T4, RTX 20-series) 때문에 여전히 관련.
실제로 wrap 하는 거
forward pass 와 loss 계산 wrap. backward 는 autocast 블록 밖. optimizer step 도 밖.