본문 바로가기
C.W.K.
Stream
Lesson 10 of 10 · published

혼합 정밀도와 재현성

~18 min · amp, fp16, bf16

Level 0호기심
0 XP0/73 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

혼합 정밀도란

현대 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이 적절한 선택이야.

팁: 현대 가속기에서 학습하면서 혼합 정밀도를 쓰지 않는다면, 뚜렷한 이유도 없이 시간과 VRAM 비용을 2x 치르는 셈이야. 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로 실행하고 그 비용을 받아들여야 해.

원칙: 현대 하드웨어에서 혼합 정밀도는 사실상 정확도 손실 없이 속도를 얻는 방법이야. 사용하지 않을 타당한 이유는 pre-Volta GPU처럼 Tensor Core가 없거나, 애플리케이션에서 비트 단위 결정성이 반드시 필요할 때뿐이야.

Code

2026년 PyTorch 혼합 정밀도 학습·python
import torch
from torch.cuda.amp import autocast, GradScaler

scaler = GradScaler()
opt = torch.optim.AdamW(model.parameters(), lr=3e-4)

for xb, yb in train_loader:
    xb, yb = xb.to(device), yb.to(device)
    opt.zero_grad()

    with autocast(dtype=torch.bfloat16):
        logits = model(xb)
        loss = loss_fn(logits, yb)

    # FP16 needs GradScaler; BF16 doesn't (but it's harmless to use)
    scaler.scale(loss).backward()
    scaler.unscale_(opt)
    torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
    scaler.step(opt)
    scaler.update()

External links

Exercise

같은 모델과 데이터셋으로 학습 에폭 하나를 FP32와 BF16에서 각각 실행하고 시간을 재 봐. Wall-clock time, 최대 VRAM, 최종 검증 정확도를 비교해. 정확도 손실 없이 1.5-3x의 속도 향상이 나와야 해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인 — 댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.