Floating Point vs Integer Grid
마지막 수정:
Floating point와 integer quantization의 차이는 단순히 “소수점이 있나 없나”가 아니다.
둘은 숫자 자를 놓는 방식이 다르다.
floating point:
mantissa 눈금을 exponent가 확대/축소한다
integer quantization:
scale로 정한 고정 grid 하나에 값을 붙인다
Floating point는 여러 배율의 자를 쓴다
Floating point 값은 대략 이렇게 해석할 수 있다.
value = sign x mantissa x 2^exponent
mantissa는 자의 눈금이고, exponent는 그 자의 배율이다.
예를 들어 mantissa 눈금이 단순히 네 개만 있다고 해보자.
1.00, 1.25, 1.50, 1.75
여기에 2^2 = 4를 곱하면 큰 구간의 자가 된다.
4, 5, 6, 7
간격 = 1
반대로 2^-2 = 0.25를 곱하면 작은 구간의 자가 된다.
0.25, 0.3125, 0.375, 0.4375
간격 = 0.0625
같은 mantissa 눈금이어도 exponent가 작아지면 실제 값 사이 간격이 작아진다. 그래서 floating point는 작은 값 근처에서 촘촘하고, 큰 값 쪽에서는 듬성듬성하다.
이것이 floating point의 표현력이다. 아주 작은 값과 큰 값을 같은 format 안에서 다루면서, 값의 크기에 비례하는 상대 정밀도를 유지한다.
Integer quantization은 고정 grid 하나를 쓴다
Integer quantization에서는 먼저 real value 범위를 정하고, 그 범위에 integer code를 깐다.
예를 들어 어떤 weight가 대략 -1.0부터 1.0 사이에 있다면 INT8의 256개 code를 그 범위에 배치한다.
-1.0 ---------------- 0 ---------------- +1.0
| | | | | | | | | | | |
이 grid의 한 칸 간격이 scale이다.
real value ~= scale x integer value
이제 0.1234 같은 값은 정확히 저장되지 않는다. 가장 가까운 grid 위치로 반올림된다.
0.1234 -> 0.1250
즉 integer quantization은 표현 가능한 값을 고정된 위치로 제한한다. 대신 그 제한 덕분에 저장과 실행이 단순해진다.
1장의 주장은 보통 FP16/BF16에서 INT8/INT4로 내려가는 그림이다
LLM inference에서 흔한 출발점은 FP16 또는 BF16 weight다.
FP16/BF16 weight: 2 bytes
INT8 weight: 1 byte
INT4 weight: 0.5 byte
이 비교에서는 두 일이 동시에 일어난다.
1. bit 수가 줄어든다
-> HBM에서 움직이는 byte가 줄어든다
2. format이 바뀐다
-> exponent/mantissa 기반 표현에서 scale 기반 integer grid로 바뀐다
많은 decode workload에서는 FLOPs보다 weight와 KV cache를 읽는 byte가 병목이 된다. 그래서 FP16 weight를 INT8이나 INT4로 줄이면, 같은 memory bandwidth로 더 많은 token, 더 큰 batch, 더 긴 context를 처리할 여지가 생긴다.
이것이 “표현력을 포기하고 효율을 얻는다”는 말의 실전 의미다.
정확한 숫자 표현 일부를 포기한다
-> 더 적은 byte를 움직인다
-> serving memory, bandwidth, energy 압박이 줄어든다
같은 8-bit끼리는 다른 질문이다
FP8과 INT8은 둘 다 1 byte다. 따라서 이 경우에는 “누가 더 작나”가 핵심이 아니다.
핵심은 256개 표현 위치를 어디에 배치하느냐다.
INT8:
같은 간격의 grid
FP8:
0 근처는 촘촘하고 큰 값 쪽은 듬성한 grid
그래서 FP8 vs INT8은 단순한 비용 비교가 아니라 tensor 분포와 hardware 지원의 문제다. 값이 0 근처에 몰려 있고 H100 이후 GPU의 FP8 tensor core를 쓸 수 있다면 FP8이 좋은 선택이 될 수 있다. 반대로 INT8도 per-channel scale처럼 granularity를 잘 잡으면 강력하다.
확인
- Floating point에서 exponent는 왜 “자의 배율”이라고 볼 수 있는가?
- FP16/BF16에서 INT8/INT4로 내려갈 때 줄어드는 것은 무엇인가?
- FP8과 INT8이 같은 1 byte인데도 성격이 다른 이유는 무엇인가?