반응형
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
- https://jaeyung1001.tistory.com/entry/bf16-fp16-fp32%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90
- https://cheorish.tistory.com/31
- https://g3lu.tistory.com/55
- https://blog.naver.com/simula/224092217263?fromRss=true&trackingCode=rss
- https://brunch.co.kr/@simplifier/482
- https://turingpost.co.kr/p/bf16-fp16
- 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
- https://xippaz.tistory.com/231
- https://www.reddit.com/r/MachineLearning/comments/1awn2t5/d_anyone_else_notice_a_surprisingly_big/
반응형
'Python' 카테고리의 다른 글
| [Python] tensor dimension 맞추기 문법 총정리! unsqueeze(0), squeeze, permute() (1) | 2025.03.09 |
|---|---|
| [Python] tensorflow 버전 확인 지정 pip show / python 다운그레이드 (4) | 2024.06.21 |
| [Python] python 다운그레이드 / 버전 낮추기 (0) | 2024.06.20 |
| [Python] conda 가상환경 명령어 모음 / requirement.txt 리스트 설치 (1) | 2024.06.11 |
| [Python] opencv cv2 function 함수 모음집 / import cv2 (4) | 2024.06.07 |