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

혼합 정밀도

~16 min · amp, bf16, fp16

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

왜 쓰고 어떻게 작동하나

현대 가속기는 BF16/FP16 곱셈을 FP32보다 2-8x 빠르게 처리해. 혼합 정밀도 학습은 모델 가중치의 마스터 사본을 FP32로 유지하면서 행렬곱처럼 연산량이 큰 작업은 더 낮은 정밀도로 실행해. 그 결과 99%의 경우에 최종 정확도는 그대로 유지하면서 학습 속도를 높일 수 있어.

BF16은 FP32와 동적 범위가 같지만 정밀도는 더 낮아. GradScaler가 필요 없어서 2026년에는 기본값으로 선호돼. FP16은 정밀도가 더 높지만 동적 범위가 좁아서 작은 기울기가 underflow되지 않도록 GradScaler를 써야 해.

팁: 하드웨어가 BF16을 지원한다면(H100, A100, M3+) BF16을 기본값으로 써. GradScaler로 인한 복잡성을 피할 수 있어. 네이티브 BF16을 지원하지 않는 하드웨어, 예를 들어 RTX 3000 시리즈 이전 소비자용 GPU를 써야 할 때만 FP16으로 전환해.

문제가 생기면 무엇을 확인할까

손실이 NaN이 될 수 있어. 가장 흔한 원인은 FP16 순전파 과정 어딘가에서 발생한 단 한 번의 underflow가 손실까지 전파되는 거야. 보통 BF16으로 바꾸면 해결되고, FP16을 계속 써야 한다면 GradScaler를 추가하면 돼.

정확도가 미묘하게 떨어질 수도 있어. 로그-소프트맥스나 층 정규화 같은 일부 연산은 낮은 정밀도에 민감해. PyTorch autocast는 이런 연산을 자동으로 FP32에 유지하지만, 맞춤형 층에서는 그렇지 않을 수 있어. Autocast를 썼을 때 모델 정확도가 눈에 띄게 떨어진다면 어떤 연산이 낮은 정밀도로 실행되는지 프로파일링해 봐.

수치로 보면

BF16 학습은 Tensor Core에서 FP32보다 실제 경과 시간 기준 1.5-3x 빠르고, 활성화 메모리를 ~50% 절약해. FP8은 H100 이상에서 Transformer 학습 성능을 추가로 30-50% 높일 수 있지만, 2026년 기준 도구 생태계은 여전히 성숙하는 중이야.

원칙: 현대 하드웨어에서 혼합 정밀도는 사실상 공짜로 얻는 성능이야. 쓰지 않으면 별다른 이유도 없이 시간과 메모리를 2x 더 내는 셈이야.

Code

BF16 혼합 정밀도 학습(스케일러 불필요)·python
import torch
from torch.amp import autocast

device = torch.device("cuda")
model.to(device)
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(device_type="cuda", dtype=torch.bfloat16):
        logits = model(xb)
        loss = loss_fn(logits, yb)
    loss.backward()
    torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
    opt.step()

External links

Exercise

같은 모델로 한 학습 에폭을 FP32와 BF16에서 각각 실행하고 시간을 재 봐. 최대 VRAM과 실제 경과 시간을 기록하고, 최종 검증 정확도가 잡음 범위 안에서 일치하는지 확인해. 속도 향상은 1.5-3x여야 해.

Progress

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

댓글 0

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

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