혼합 정밀도란
현대 GPU는 float16 (FP16) 또는 bfloat16 (BF16) 연산을 float32 (FP32)보다 2-8x 빠르게 처리해. 혼합 정밀도에서는 순전파를 FP16/BF16으로 변환하고, FP32 마스터 가중치 사본을 유지해. 또 FP16 기울기의 좁은 동적 범위를 처리하려고 GradScaler를 사용하지. 그 결과 학습이 빨라지고 VRAM을 덜 쓰면서도 보통 정확도는 떨어지지 않아.
BF16은 FP32와 지수 범위가 같아서 GradScaler가 필요 없지만 정밀도는 더 낮아. FP16은 정밀도가 더 높지만 표현 범위가 좁아서 언더플로를 피하려면 GradScaler가 필요해. H100 / A100에서는 둘 다 빠르고, Apple Silicon에서는 보통 BF16이 적절한 선택이야.
torch.autocast + GradScaler만 적용해도 간단히 개선할 수 있어.표준 사용법
순전파와 손실 계산을 torch.autocast(device_type="cuda", dtype=torch.bfloat16)로 감싸. FP16을 쓴다면 GradScaler도 사용해. 먼저 scaler.scale(loss).backward()를 호출하고, scaler.unscale_(opt)로 스케일을 해제한 다음 기울기를 클리핑해. 이어서 scaler.step(opt)를 호출하고 마지막에 scaler.update()를 실행하면 돼.
재현할 때 주의할 점
혼합 정밀도는 시드를 고정해도 약간의 비결정성을 더해. FP16/BF16의 반올림 양상이 연산 순서에 따라 달라지기 때문이야. 최종 지표는 비트 단위로 똑같이 재현하려 하지 말고, ± 0.1% 범위의 통계적 재현성을 목표로 잡아. 정확한 결정성이 필요한 애플리케이션이라면 FP32로 실행하고 그 비용을 받아들여야 해.