Quantization Basics
마지막 수정:
Quantization은 높은 precision의 값을 더 낮은 bit 표현으로 바꾸는 기법이다.
FP8도 넓게 보면 낮은 precision으로 가는 흐름에 있지만, 보통 inference quantization에서는 int8, int4 같은 integer 표현도 많이 쓴다.
기본 아이디어
실수 값을 작은 integer로 저장하려면 scale이 필요하다.
real value ~= scale x integer value
예를 들어 어떤 weight block의 값이 대략 -1.0부터 1.0 사이에 있다면, 이 범위를 int8의 제한된 정수 범위에 맞춰 넣는다.
float weight
-> scale로 나눔
-> int8로 반올림해 저장
계산할 때는 scale을 이용해 원래 크기 의미를 복원한다.
왜 inference에서 많이 쓰나
LLM inference는 weight와 KV cache를 계속 읽는 memory-bound 구간이 많다. dtype을 낮추면 같은 bandwidth로 더 많은 값을 읽을 수 있다.
FP16 weight: 2 bytes
INT8 weight: 1 byte
INT4 weight: 0.5 byte
그래서 quantization은 추론 비용과 latency를 줄이는 데 중요하다.
정확도 손실
문제는 quantization error다.
원래 값: 0.1234
저장 가능한 값: 0.1250
오차: 0.0016
bit 수가 낮아질수록 저장 가능한 값의 개수는 줄어든다. scale을 어떻게 잡는지, block을 얼마나 작게 나누는지, 어떤 tensor를 quantize하는지에 따라 품질이 달라진다.
나중에 이어질 주제
이 카드는 출발점이다. 이후에는 다음 주제로 확장할 수 있다.
weight-only quantization
activation quantization
KV cache quantization
per-channel / per-token / per-block scaling
calibration
dequantization overhead
확인
- quantization에서 scale은 왜 필요한가?
- INT8 weight가 FP16 weight보다 memory bandwidth에 유리한 이유는 무엇인가?
- bit 수를 낮출 때 정확도 손실이 생기는 이유는 무엇인가?