FP8 Training
마지막 수정:
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 영향은 어떻게 달라지는가?