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)이 발생합니다.

일반적인 데이터 타입

타입비트특징
FP3232full-precision, 학습 기본
FP1616half-precision, 범위가 FP32보다 훨씬 좁음
BF1616FP32와 유사한 범위(가수↓, 지수↑), 딥러닝 표준
INT88정수 연산, FP32 대비 1/4 비트
INT44더 공격적인 압축

하드웨어에 따라 정수 연산이 부동소수점 연산보다 빠를 수 있고, 일반적으로 비트 수가 적을수록 연산이 빨라집니다.

비트를 줄일 때 핵심은 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.083.02가 INT8에서 둘 다 36으로 매핑되어 구분이 사라지면, 이를 양자화 오차(quantization error) 라고 부릅니다. 비트가 줄수록 오차는 일반적으로 커집니다.

Asymmetric Quantization — zero-point

0 기준 비대칭. zero-point 양자화가 대표적입니다. 최솟값(β)·최댓값(α)을 INT8 범위 [-128, 127]로 매핑합니다.

  • 스케일: s = (2^b - 1) / (α - β)
  • zero-point z를 별도로 계산해 0의 위치를 시프트
  • 분포가 한쪽으로 치우친 경우(예: ReLU 후 활성)에 유리
구분SymmetricAsymmetric
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_subsuper 블록의 scale s_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 동작 단계:

  1. Weight 양자화: 학습 중에는 INT8로 저장, signum 함수로 1-bit화. 분포를 0 중심으로 시프트한 뒤 0 미만은 -1, 이상은 1. 평균 절대값 β를 추적
  2. Activation 양자화: absmax로 FP16 → INT8. 최대 절대값 α 추적
  3. 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/BF1616학습/추론표준 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.581.58학습 처음부터차세대 효율적 LLM

양자화는 “수를 더 적은 비트로 표현해 LLM을 가볍게” 만드는 기술입니다. 핵심은 두 가지로 압축됩니다:

  1. 표현 범위 선택 — calibration이 모든 것을 결정한다
  2. 오차 보정 전략 — GPTQ의 Hessian 분배, GGUF의 block-wise 스케일, BitNet의 학습 단계 통합

미래의 LLM이 얼마나 작아질 수 있을지는 — 0이라는 글자가 알려주듯 — 양자화 자체보다 표현의 환원에 달려 있을지도 모릅니다.


참고 자료

원논문:

  1. Frantar, E. et al. GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers, arXiv:2210.17323 (2022)
  2. Wang, H. et al. BitNet: Scaling 1-bit Transformers for Large Language Models, arXiv:2310.11453 (2023)
  3. Ma, S. et al. The Era of 1-bit LLMs: All Large Language Models are in 1.58 Bits, arXiv:2402.17764 (2024)
  4. Dettmers, T. et al. QLoRA: Efficient Finetuning of Quantized LLMs, NeurIPS 36 (2024)