Floating Point Formats

마지막 수정:

precisiondtypefloating-pointfp32fp16bf16fp8

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

지수(exponent) 비트는 아주 작은 수부터 큰 수까지의 범위를 늘리고, 가수(mantissa) 비트는 가까운 두 숫자를 더 촘촘하게 구분하게 해준다.

핵심 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를 줄이면 무엇을 잃는가?