Python

[Python] FP16 과 FP32 차이, 학습 수렴 특성이 왜 달라지냐

도도걸만단 2025. 12. 4. 15:54
반응형

fp16, fp32는 숫자를 컴퓨터 안에서 어떻게 표현하느냐(부동소수점 형식)를 말하는 데이터 타입 이름

쉽게 말해 소수점을 몇 비트로 저장하느냐의 차이​

기본 개념

  • FP = floating point (부동소수점). 실수(소수점 있는 숫자)를 표현하는 표준 형식.
  • 뒤 숫자는 총 비트 수를 의미함.
    • FP32: 32비트 = 4바이트, 흔히 쓰는 float / single precision.
    • FP16: 16비트 = 2바이트, half precision이라고 부름​

왜 중요한가 (딥러닝 관점)

  • 비트 수가 많을수록
    • 표현 가능한 숫자 범위·정밀도가 커짐 → 연산이 더 정확하고 학습이 안정적.
    • 대신 메모리 2배, 연산량도 증가.
  • 비트 수가 적을수록
    • 메모리·연산은 절약되고 속도는 빨라지지만
    • 표현 범위/정밀도가 줄어서 작은 gradient가 0으로 날아가거나, 큰 값이 쉽게 inf/nan으로 터질 수 있음
    • 그래서 딥러닝에서:
  • FP32: “안정한 학습용 기본 타입”으로 오랫동안 표준이었고, 여전히 마스터 weight·optimizer state에 많이 씀.​
  • FP16: 메모리 절반·속도 향상 때문에, 요즘은 연산은 FP16으로, 중요한 값은 FP32로 두는 mixed precision을 많이 씀.​

FP16이랑 FP32는 어느 쪽이 무조건 더 좋다”라기보다, 메모리·속도 vs 수렴 안정성/정밀도 트레이드오프라고 보면 된다.​

메모리 차이는 왜 나냐

  • FP32는 숫자 하나에 32bit(4바이트), FP16은 16bit(2바이트)를 씀.
  • 같은 파라미터/activation/gradient를 저장할 때 FP16은 필요한 비트 수가 절반이라, 모델/배치 크기가 같으면 메모리 사용량이 대략 절반 수준까지 줄어든다.
  • 그래서 대형 모델·큰 batch를 쓰고 싶을 때 FP16(또는 BF16, mixed precision)을 쓰는 것.

학습 수렴 특성이 왜 달라지냐

  • FP16은 표현 가능한 숫자 정밀도와 범위가 둘 다 FP32보다 좁음.
    • 작은 gradient는 0으로 날아가거나(underflow), 큰 값은 inf로 터질 수 있어서 gradient 계산이 더 불안정해짐.
    • 반올림 오차가 레이어를 많이 타고 누적되면 loss curve가 더 noisy해지거나, 특정 세팅에서 수렴이 안 되고 NaN이 나기도 함.
  • FP32는 비트 수가 많아서
    • 더 작은 gradient도 표현 가능하고
    • underflow/overflow 마진이 넓어서
      gradient norm, loss가 더 매끄럽게 변하고 수렴이 안정적인 편.

그래서 요즘은:

  • 정밀도·안정성이 더 중요한 부분(마스터 weight, optimizer state, loss 스케일링 등)은 FP32로 두고,
  • 메모리 많이 쓰는 부분(activation, 일부 matmul)은 FP16/BF16으로 돌리는 mixed precision을 많이 쓰는 거고​
  • pure FP16 학습 시에는 gradient scaling, 더 작은 lr, 클리핑 등으로 수치 불안정성을 보완하는 게 기본 패턴

FP16 = 메모리·속도 유리하지만 수치적으로 불안정할 수 있고, FP32 = 메모리 많이 먹지만 수렴은 더 안정적이라고 이해하면 된다.


 

reference

  1. https://jaeyung1001.tistory.com/entry/bf16-fp16-fp32%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90
  2. https://cheorish.tistory.com/31
  3. https://g3lu.tistory.com/55
  4. https://blog.naver.com/simula/224092217263?fromRss=true&trackingCode=rss
  5. https://brunch.co.kr/@simplifier/482
  6. https://turingpost.co.kr/p/bf16-fp16
  7. https://introduce-ai.tistory.com/entry/FP32-TF32-FP16-BFLOAT16-Mixed-Precision%EC%97%90-%EB%8C%80%ED%95%9C-%EC%9D%B4%ED%95%B4
  8. https://xippaz.tistory.com/231
  9. https://www.reddit.com/r/MachineLearning/comments/1awn2t5/d_anyone_else_notice_a_surprisingly_big/
반응형