Floating Point vs Integer Grid

마지막 수정:

precisiondtypefloating-pointintegerquantizationinference

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인데도 성격이 다른 이유는 무엇인가?