FP8 Training

마지막 수정:

precisionfp8trainingscaling

FP8은 값 하나를 8 bit, 즉 1 byte로 저장한다.

FP32: 4 bytes
BF16: 2 bytes
FP8:  1 byte

장점은 분명하다.

memory footprint 감소
memory bandwidth 부담 감소
FP8 GEMM throughput 증가 가능

하지만 FP8은 bit가 너무 적어서 안정성이 훨씬 어렵다.

E4M3와 E5M2

FP8에는 대표적으로 두 형식이 있다.

E4M3:
  exponent 4 bits
  mantissa 3 bits

E5M2:
  exponent 5 bits
  mantissa 2 bits

E4M3는 mantissa가 조금 더 많아서 상대적으로 resolution이 낫다. E5M2는 exponent가 더 많아서 상대적으로 range가 낫다.

E4M3: precision 쪽에 조금 더 투자
E5M2: range 쪽에 조금 더 투자

Scaling이 왜 필요한가

FP8은 표현 범위와 촘촘함이 모두 제한적이다. 그래서 실제 activation이나 weight 값을 그대로 FP8로 바꾸면 outlier 때문에 많은 값이 망가질 수 있다.

그래서 값을 FP8 범위에 맞게 scale한다.

high precision value
-> scale로 범위 조정
-> FP8로 저장/계산
-> 필요할 때 scale을 이용해 해석

scale을 하나만 쓰면 outlier 하나가 전체 tensor의 scale을 망칠 수 있다. 그래서 per-tensor, per-channel, per-block, per-tile scaling 같은 선택지가 생긴다.

DeepSeek-V3 같은 시스템은 tile 단위 scaling을 사용해 outlier 영향을 줄이고 FP8 training 안정성을 높이려 한다.

확인

  • FP8 E4M3와 E5M2의 차이는 무엇인가?
  • FP8이 BF16보다 빠를 수 있는데도 학습이 어려운 이유는 무엇인가?
  • scaling granularity가 작아지면 outlier 영향은 어떻게 달라지는가?