Floating Point Formats
마지막 수정:
GPU에서 tensor 값은 그냥 “숫자”가 아니라 특정 데이터 형식(dtype) 으로 저장된다.
가장 기본은 float32, 즉 FP32다.
FP32 = 32 bits = 4 bytes
floating point 숫자는 보통 세 부분으로 나뉜다.
sign : 양수/음수
exponent : 숫자의 크기 범위
mantissa : 유효 숫자, 즉 얼마나 촘촘하게 표현하는가
FP32
sign exponent = range mantissa = precision
Range vs precision
bytes/value 4
exponent bits 8
mantissa bits 23
핵심 trade-off
bit 수를 줄이면 메모리와 대역폭 비용은 줄어든다.
FP32: 4 bytes
FP16: 2 bytes
BF16: 2 bytes
FP8: 1 byte
하지만 줄어든 bit는 어디선가 빠져야 한다.
exponent bit를 줄이면:
표현 가능한 숫자 범위가 좁아진다.
mantissa bit를 줄이면:
가까운 두 숫자 사이를 덜 촘촘하게 구분한다.
그래서 FP16과 BF16은 둘 다 16 bit지만 성격이 다르다.
FP16:
exponent가 작다
range가 좁다
underflow/overflow에 더 취약하다
BF16:
FP32와 같은 exponent 폭을 쓴다
range가 넓다
mantissa가 작아 precision은 더 거칠다
확인
- FP16과 BF16은 둘 다 2 bytes인데 왜 성격이 다른가?
- exponent bit를 줄이면 무엇을 잃는가?
- mantissa bit를 줄이면 무엇을 잃는가?