본문 바로가기
HRDI_AI/머신러닝_딥러닝 핵심 기술과 실무 중심 생성형 AI 프로젝트

2. fp32 vs fp16 – 왜 fp32에서 grad_norm이 더 안정적으로 보였을까?

by Toddler_AD 2025. 11. 27.

실제 실험에서:

  • fp16 (half precision) 으로 학습했을 때는
    → grad_norm: nan 이 자주 발생
  • 동일 코드 + 비슷한 설정에서 fp32 (single precision) 로 바꿨더니
    → grad_norm 값이 정상적으로 잘 기록되었다

이 차이는 두 데이터 타입의 “숫자 표현 능력”에서 옵니다.


2-1. 두 타입을 직관적으로 비교

아주 거칠게 요약하면:

타입비트 수대략적인 수 범위 (최대)유효 숫자 자리수특징
fp16 16비트 ≈ 6.5 × 10⁴ 약 3자리 메모리 적게, 속도 빠름, 대신 잘 터짐
fp32 32비트 ≈ 3.4 × 10³⁸ 약 7자리 범위·정밀도 넓음, 대신 메모리 2배
  • fp16:
    • 표현할 수 있는 최대값이 약 6.5만 수준이라
      조금만 값이 커져도 inf로 넘어가고,
      이상한 연산(inf - inf, 0 * inf 등)이 섞이면 바로 nan이 됩니다.
  • fp32:
    • 같은 상황에서도 아직 충분히 표현 가능한 범위 안에 있는 경우가 많아서
      overflow까지 가기 전에 버텨줍니다.

2-2. grad_norm과 NaN의 연결

grad_norm은 각 파라미터 gradient의 L2 norm입니다.

  • 내부에서 하는 일:
    1. 각 파라미터 텐서의 p.grad에 대해 L2 norm 계산
    2. 그 값들을 제곱해서 다 더한 뒤
    3. 마지막에 sqrt

여기서 어느 한 파라미터의 gradient라도 inf 또는 nan이 섞이면:

  • 합계도 망가지고
  • 최종적으로 grad_norm이 nan으로 표시됩니다.

fp16 환경에서는:

  • T5 같이 깊고 복잡한 모델에서
  • learning rate, 배치 크기 등을 크게 쓰면

→ 일부 gradient가 표현 가능한 범위를 넘어서 inf가 되기 훨씬 쉽습니다.
→ 그 결과 grad_norm도 nan으로 터지는 경우가 자주 나옵니다.

반대로 fp32에서는:

  • 같은 설정에서도 아직 overflow까지는 여유가 있어서
  • gradient 값이 크긴 해도 유한(finite)한 수로 유지되는 경우가 많습니다.
    → 그래서 grad_norm 로그가 끝까지 잘 찍힌 것이라고 볼 수 있습니다.

2-3. 실무적인 정리

한 줄로 요약하면:

fp16은 메모리와 속도에서 큰 장점이 있지만,
표현할 수 있는 숫자 범위가 좁고 정밀도가 낮아서
gradient가 쉽게 overflow → inf → nan으로 이어집니다.
fp32는 같은 조건에서 훨씬 안정적으로 grad_norm이 계산됩니다.

  1. 먼저 fp32로 안정적인 학습 세팅을 찾는다
    •   loss가 잘 내려가는지
    •   grad_norm이 이상하게 폭발하지 않는지 확인
  2. 그 다음에 fp16/mixed precision으로 옮겨가면서
    •   learning rate를 조금 줄이거나
    •   max_grad_norm 등 gradient clipping을 적극적으로 사용해
    •   NaN 없이 돌아가는 조합을 찾습니다.

 

2-4. 마무리 요약

fp32 vs fp16

  • fp16은 메모리와 속도에 유리하지만, 표현할 수 있는 수 범위가 좁고 정밀도가 낮아서
    gradient가 쉽게 overflow → inf → nan으로 이어집니다.
  • fp32는 같은 조건에서도 훨씬 안정적으로 grad_norm을 계산할 수 있고,
    특히 큰 T5 계열 모델 + 높은 LR 조합에서는 먼저 fp32로 세팅을 안정화한 뒤 fp16으로 옮기는 전략이 안전합니다.