Maarten Grootendorst가 Exploring Language Models 뉴스레터에 공개한 A Visual Guide to Quantization은 LLM 양자화의 직관을 50여 장의 커스텀 비주얼로 풀어낸 글입니다. 이 글은 그 핵심을 한국어로 정리합니다 — 숫자 표현의 기초부터 FP32→INT4의 매핑 수학, GPTQ·GGUF의 작동 원리, 그리고 1-bit/1.58-bit BitNet까지.
원문: A Visual Guide to Quantization — Maarten Grootendorst
Part 1. LLM의 “문제점”
LLM은 수십억 개 파라미터(주로 weights)와 추론 중 만들어지는 activations로 구성됩니다. 가능한 적은 비트로 값을 표현해야 메모리와 연산 비용을 줄일 수 있습니다.
수치 표현의 기초
값은 보통 부동소수점(IEEE-754 표준)으로 표현되며, 비트는 세 부분으로 나뉩니다:
- Sign: 부호 (1비트)
- Exponent: 지수
- Fraction (Mantissa): 가수
비트 수가 많을수록 정밀도가 높습니다. 표현 가능한 값의 구간을 dynamic range, 인접한 두 값 사이의 거리를 precision이라고 부릅니다.
메모리 제약
70B 파라미터 모델을 FP32로 로딩하면 약 280GB가 필요하다.
8비트 = 1바이트라는 단순 산수가 LLM에서는 살벌한 비용으로 돌아옵니다. 그래서 정밀도를 유지하면서 비트 수를 줄이는 양자화가 필요해집니다.
Part 2. 양자화 입문
양자화는 고비트(예: FP32) → 저비트(예: INT8) 로 정밀도를 줄이는 작업입니다. 이미지에 8가지 색만 쓰면 거칠어지듯, 정밀도 손실(granularity loss)이 발생합니다.
일반적인 데이터 타입
| 타입 | 비트 | 특징 |
|---|---|---|
| FP32 | 32 | full-precision, 학습 기본 |
| FP16 | 16 | half-precision, 범위가 FP32보다 훨씬 좁음 |
| BF16 | 16 | FP32와 유사한 범위(가수↓, 지수↑), 딥러닝 표준 |
| INT8 | 8 | 정수 연산, FP32 대비 1/4 비트 |
| INT4 | 4 | 더 공격적인 압축 |
하드웨어에 따라 정수 연산이 부동소수점 연산보다 빠를 수 있고, 일반적으로 비트 수가 적을수록 연산이 빨라집니다.
비트를 줄일 때 핵심은 FP32의 전체 범위를 INT8로 매핑할 필요가 없다는 점입니다. 실제 모델 파라미터의 분포 범위만 INT8로 매핑하면 됩니다.
Symmetric Quantization — absmax
0을 중심으로 대칭 매핑. 대표 예가 absolute maximum(absmax) 양자화입니다.
- 스케일 인자:
s = (2^(b-1) - 1) / α, 여기서 α = max(|x|) - 양자화:
x_q = round(s · x) - 역양자화:
x = x_q / s
예를 들어 3.08과 3.02가 INT8에서 둘 다 36으로 매핑되어 구분이 사라지면, 이를 양자화 오차(quantization error) 라고 부릅니다. 비트가 줄수록 오차는 일반적으로 커집니다.
Asymmetric Quantization — zero-point
0 기준 비대칭. zero-point 양자화가 대표적입니다. 최솟값(β)·최댓값(α)을 INT8 범위 [-128, 127]로 매핑합니다.
- 스케일:
s = (2^b - 1) / (α - β) - zero-point
z를 별도로 계산해 0의 위치를 시프트 - 분포가 한쪽으로 치우친 경우(예: ReLU 후 활성)에 유리
| 구분 | Symmetric | Asymmetric |
|---|---|---|
| 0의 위치 | 항상 정수 0에 매핑 | shift된 zero-point z |
| 범위 | [-α, α] 대칭 | [β, α] 비대칭 |
| 계산 복잡도 | 단순 | z 계산 추가 필요 |
| 적합 | 0 중심 대칭 분포 | 치우친 분포 |
Range Mapping과 Clipping
outlier(이상치) 가 하나라도 있으면 전체 범위를 매핑할 때 작은 값들이 모두 같은 정수에 뭉개집니다. 동적 범위를 [-5, 5]처럼 임의로 잘라내는 clipping이 해법입니다 — 비-이상치의 양자화 오차는 줄지만 이상치의 오차는 커지는 트레이드오프가 발생합니다.
Calibration — 범위 고르는 법
범위 선택 과정 자체를 calibration이라 부릅니다. 오차를 최소화하면서 가능한 많은 값을 포함하는 범위를 찾는 작업입니다. 적용 대상에 따라 방식이 달라집니다.
Weights & Biases (정적): Llama 3의 ~20GB가 거의 weights입니다. bias는 수가 적어 INT16 등 고정밀 유지가 흔합니다. 캘리브레이션 방법:
- 입력 범위의 percentile 수동 선택
- 원본–양자화 weights의 MSE 최소화
- KL-divergence(엔트로피) 최소화
Activations (동적): 입력마다 변하므로 추론 중에만 알 수 있어 어렵습니다. 캘리브레이션 시점에 따라 두 가지 갈래로 나뉩니다:
- PTQ (Post-Training Quantization): 학습 후 양자화
- QAT (Quantization-Aware Training): 학습 중 양자화 학습
Part 3. PTQ — 학습 후 양자화
가중치는 symmetric/asymmetric으로 그대로 양자화. 활성에는 두 방식이 있습니다.
Dynamic Quantization
- 입력이 hidden layer를 통과할 때마다 활성 분포를 수집하여
s, z계산 - 레이어마다 다른
s, z사용 - 더 정확하지만 추론 시 계산 오버헤드 증가
Static Quantization
- 사전에 calibration dataset으로 모든 활성 분포를 수집
- 추론 시
s, z를 재계산하지 않고 전역적으로 사용 - 빠르지만 정확도는 약간 낮음
4-bit 영역 — GPTQ vs GGUF
8비트 미만으로 가면 양자화 오차가 급격히 커집니다. HuggingFace에서 자주 보는 두 방법:
GPTQ — GPU에서 풀모델 실행
- 비대칭 양자화, 레이어 단위로 독립적으로 처리
- 레이어 weights를 inverse-Hessian(loss의 2차 미분)으로 변환 → 각 weight의 (역)중요도. Hessian 값이 작은 weight일수록 중요
- 첫 행 weight를 양자화 → 역양자화 → 양자화 오차 q 계산
- 이 오차에 inverse-Hessian을 곱해 다른 weights에 분배(가중치 보정). 예:
x_2 += q · h_2 - 모든 weight를 양자화할 때까지 반복
- 추가 트릭: Hessian dampening, lazy batching, Cholesky 사전계산
- 추론 속도 최적화 변형으로 EXL2 추천
weight들은 보통 서로 연관되어 있으므로, 한 weight의 양자화 오차를 관련 weights에 분배하면 네트워크의 전체 함수 형태가 보존됩니다.
GGUF — CPU 오프로딩
- llama.cpp 포맷. CPU+GPU 혼합 실행 가능
- 레이어 weights를 “super” 블록 / “sub” 블록으로 분할
- 각 sub 블록은 absmax로 양자화:
W_q = round(W · s_sub) - sub 블록의 scale
s_sub는 super 블록의 scales_super로 다시 양자화 — 이중 스케일(block-wise) 양자화 - 2-bit / 4-bit / 6-bit 등 다양한 양자화 레벨, 일부 타입은 zero-point 조정용 최솟값
m도 함께 양자화
Part 4. QAT — 학습 중 양자화
학습 중에 “fake” quantization 노드를 삽입합니다: weights를 INT4로 양자화 → 다시 FP32로 역양자화. 모델이 양자화 노이즈를 고려하면서 학습/loss 계산/weight 업데이트를 수행합니다.
QAT의 핵심은 손실 평면에서 “wide” minima(넓은 골짜기)를 찾도록 유도한다는 점입니다. “narrow” minima는 양자화 오차가 더 크기 때문입니다.
| 시나리오 | FP32에서의 손실 | INT4에서의 손실 |
|---|---|---|
| PTQ | 낮음 | 높음 (양자화 오차 누적) |
| QAT | 약간 높음 | 낮음 (목표 정밀도에 적응) |
즉, FP32에서는 PTQ가 더 좋아 보이지만 INT4에서는 QAT가 더 낮은 손실을 기록합니다.
The Era of 1-bit LLMs — BitNet
가중치를 -1 또는 1의 1-bit로 표현. Transformer의 linear layer를 BitLinear로 교체합니다.
BitLinear 동작 단계:
- Weight 양자화: 학습 중에는 INT8로 저장, signum 함수로 1-bit화. 분포를 0 중심으로 시프트한 뒤 0 미만은 -1, 이상은 1. 평균 절대값 β를 추적
- Activation 양자화: absmax로 FP16 → INT8. 최대 절대값 α 추적
- Dequantization: 출력 활성을
{α, β}로 스케일 복원
모델이 클수록(>30B) 1-bit와 FP16의 성능 격차가 좁혀집니다. 다만 작은 모델에서의 갭은 여전히 큽니다.
BitNet 1.58b — “All LLMs are in 1.58 Bits”
가중치를 {-1, 0, 1} 의 ternary로 확장. 가능한 상태 3개이므로 비트 수는 log2(3) ≈ 1.58 bit.
0의 힘 — 곱셈 없는 행렬 곱
ternary 가중치는 다음 의미를 갖습니다:
- 1: 더한다
- 0: 무시한다 (= feature filtering)
- -1: 뺀다
행렬 곱이 곱셈 없이 덧셈만으로 구현된다. 0의 추가는 단순한 표현력 확장이 아니라 연산 자체의 환원이다.
양자화 방식
- Weight: absmean 양자화 (절대 평균 α로 스케일 후 -1, 0, 1 중 하나로 반올림)
- Activation: BitNet과 동일한 absmax, 다만 [0, 2^(b-1)] 대신 [-2^(b-1), 2^(b-1)] 로 스케일
결과
“13B BitNet b1.58은 지연시간·메모리·에너지 측면에서 3B FP16 LLM보다 효율적이다.”
정리 — 어떤 방법을 언제 쓰나
| 방법 | 비트 | 시점 | 적합한 환경 |
|---|---|---|---|
| FP16/BF16 | 16 | 학습/추론 | 표준 GPU 학습 |
| PTQ Static (INT8) | 8 | 학습 후 | 빠른 배포, 약간의 정확도 손실 허용 |
| PTQ Dynamic (INT8) | 8 | 추론 시 | 정확도 중시, 약간의 추론 오버헤드 허용 |
| GPTQ (4-bit) | 4 | 학습 후 | GPU 추론, Hessian 기반 보정 |
| GGUF (2~6 bit) | 2–6 | 학습 후 | CPU/Apple Silicon, llama.cpp |
| QAT (4-bit) | 4 | 학습 중 | 정확도 우선, 재학습 비용 허용 |
| BitNet b1.58 | 1.58 | 학습 처음부터 | 차세대 효율적 LLM |
양자화는 “수를 더 적은 비트로 표현해 LLM을 가볍게” 만드는 기술입니다. 핵심은 두 가지로 압축됩니다:
- 표현 범위 선택 — calibration이 모든 것을 결정한다
- 오차 보정 전략 — GPTQ의 Hessian 분배, GGUF의 block-wise 스케일, BitNet의 학습 단계 통합
미래의 LLM이 얼마나 작아질 수 있을지는 — 0이라는 글자가 알려주듯 — 양자화 자체보다 표현의 환원에 달려 있을지도 모릅니다.
참고 자료
- LLM.int8() — HuggingFace 블로그, 논문
- Embedding Quantization — HuggingFace
- Transformer Math 101 — EleutherAI
- VRAM 계산기: NyxKrage Space, vram.asmirnov.xyz
- GPTQ 해설 YouTube
- Hands-On Large Language Models (Maarten Grootendorst & Jay Alammar)
원논문:
- Frantar, E. et al. GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers, arXiv:2210.17323 (2022)
- Wang, H. et al. BitNet: Scaling 1-bit Transformers for Large Language Models, arXiv:2310.11453 (2023)
- Ma, S. et al. The Era of 1-bit LLMs: All Large Language Models are in 1.58 Bits, arXiv:2402.17764 (2024)
- Dettmers, T. et al. QLoRA: Efficient Finetuning of Quantized LLMs, NeurIPS 36 (2024)