CUDA / KERNEL / COMPILER 18VOL · CONTENT-FIRST · A4 LANDSCAPE · 14p

Quantization Algorithms 단권화

PTQ · LLM.int8() · GPTQ · AWQ · SmoothQuant · KV Quant · FP8 Delayed Scaling · Fake↔Real
Volume V10 / 18
Tier T3 수치 (bit → 양자화)
선행 V09 (Mixed Precision · dtype)
용도 quant 알고리즘 선택·비교 지도

목차

§1. Quantization 기본 (sym/asym, scale+zp)p.2
§2. Dynamic Range 계산 (min-max / MSE / KL)p.3
§3. PTQ vs QAT — 범위·오차·시점p.4
§4. LLM.int8() — outlier-aware mixedp.5
§5. GPTQ — Hessian·OBQ block-wise updatep.6
§6. AWQ — activation-aware scale migrationp.7
§7. SmoothQuant — act→weight migration (α)p.8
§8. KV Cache Quant (INT8 / INT4)p.9
§9. Atom / KIVI — per-ch K + per-tok Vp.10
§10. FP8 Quant Flow — amax history, delayedp.11
§11. Fake ↔ Real Quant 간극p.12
§12. 평가 지표 — PPL / MMLU / GSM8Kp.13
§13. Cheat Sheet — 방법 선택 결정 트리p.14

범례

핵심 용어 (kw)
매우 중요 (kw2) / 표 헤더
정의·공식 박스
예시·워크드
빨강주의·실수
시험·실무 핵심
(!)니모닉 (권당 ≤5)
다른 권 참조 (xref)
인과·흐름
∵∴이유·결론
인쇄 A4 가로 / 여백 없음 / 배경 그래픽 포함 · Ctrl(⌘)+P
Src: GPTQ · AWQ · SmoothQuant · LLM.int8() · Atom · KIVI · TE FP8

1 Quantization 정의 FP → INT + scale

정의 연속 real x ∈ ℝ를 유한 정수 codebook xq ∈ ℤb로 사상 (b-bit). 복원은 affine dequant.
  • bit layout (FP8 E4M3 / E5M2 / FP4 E2M1) 상세 ↗ V09 §4
  • 목적: memory ↓, bandwidth ↓, compute throughput ↑
  • 대가: rounding error + clipping error

2 Uniform Symmetric ★

xq = clip(round(x / s), −2b−1, 2b−1−1)
xdq = s · xq
s = max|x| / (2b−1 − 1) s: scale (FP) · zero-point = 0 · b: bit 수 · INT8: range [−127, 127]
  • 장점: matmul 시 zp 보정항 없음 → kernel 단순
  • 용도: weight (대체로 평균 0 근방 분포)

3 Uniform Asymmetric ★

s = (xmax − xmin) / (2b − 1)
z = round(−xmin / s)   zero-point
xq = clip(round(x/s) + z, 0, 2b−1)
xdq = s · (xq − z) z ∈ ℤ · unsigned range [0, 255] at b=8 · activation 처럼 분포가 비대칭일 때

4 적용 granularity

granularityscale 수용도
per-tensor1가장 단순 · outlier 취약
per-channelCoutweight 표준 (row/col 별)
per-tokenNtokactivation (batch·seq 축)
per-groupN/GINT4/FP4 weight · G∈{32,64,128}
block-scaleN/GFP8/FP4 microscaling (MX/NV)

group-wise는 outlier 흡수 ↔ scale 메모리 trade-off.

5 Sym · Asym 선택

SymmetricAsymmetric
zp0≠0 가능
range 활용분포 대칭시 full, 비대칭시 낭비항상 full
matmul 비용낮음 (zp 항 없음)zp cross-term 2개 추가
적합weightactivation · ReLU 출력

6 Asymmetric matmul 전개

y = W·x
= sW·sx [ Wq·xq − zW·Σxq − zx·ΣWq + zWzx·K ] K: reduction 길이 · cross-term 3개는 precompute 가능 (xq 합, Wq 합은 static weight 부분 offline)

∴ weight symmetric + activation asymmetric 조합이 흔한 choice.

7 오차 분해

MSE(x) = E[(x − xdq)²] = Eround + Eclip
Eround ≈ s² / 12   uniform 가정
Eclip = ∫|x|>T (|x|−T)² p(x) dx T = s·(2b−1−1) · round와 clip은 s 결정에서 상충

8 Signed ↔ Unsigned

  • INT8: signed [−128, 127] / unsigned [0, 255]
  • symmetric INT8은 [−127, 127] 만 사용 → −128 배제 (대칭 유지)
  • INT4: signed [−8, 7] / asym unsigned [0, 15]

9 양자화 대상

대상자주 쓰는 설정
Weightper-channel sym INT8 / per-group INT4
Activationper-token asym INT8 / FP8 E4M3
KV cacheper-token (V) · per-channel (K) · INT8/INT4/FP8
GradientFP8 E5M2 (wider range)
Accumulator항상 FP32 유지
흔한 실수: accumulator까지 low-precision으로 두면 N=수백 reduction에서 수치 붕괴. TC matmul의 acc는 항상 FP32 이다.

1 Calibration 정의

정의 대표 입력 샘플 (calibration set, 수백~수천)로 각 tensor의 dynamic range [α, β] 또는 amax를 추정한다. 이 범위에서 s, z가 결정된다.
  • weight는 static → calibration 불필요 (직접 stat)
  • activation은 batch마다 달라짐 → sample 기반 추정

2 Min-Max ★

α = min(x), β = max(x)   (배치 평균)
s = (β − α) / (2b − 1)   asym
s = max(|α|, |β|) / (2b−1 − 1)   sym 장: 구현 최단, 정보 손실 없음 (범위 내) · 단: 1개 outlier가 전체 s를 팽창

3 Percentile

α = Pq(x), β = P100−q(x)   q ∈ {0.1, 0.01, 0.001} %
범위 밖 값은 clip outlier 몇 개를 의도적으로 clip → round error ↓ · clip error ↑ 의 균형

실무: activation INT8에 q=99.9% 이 기본값.

4 MSE-optimal ★ argmin‖x − xdq‖²

s* = argmins Σ (xi − s · clip(round(xi/s)))² 보통 grid search: s0·{0.5, 0.55, …, 1.2} · 수치 미분 불가 (round 때문)
  • 분포가 long-tail일수록 min-max보다 유리
  • per-channel로 독립 최적화 가능

5 KL-divergence (TensorRT)

s* = argmins DKL( pfp ∥ pq(s) )
pfp: FP 분포 히스토그램 (2048 bin)
pq(s): s로 양자화 후 복원된 분포 정보이론 관점: quant 후 분포가 원본과 얼마나 다른가를 최소화

TensorRT 기본 entropy calibrator의 수학적 근거.

6 Entropy / Percentile / MSE 비교

방법
min-max단순·완전 coveroutlier 민감
percentilerobustq 선택 hyperparam
MSEL2 최적grid search 비용
KL분포 보존bin 수 감도

7 Running estimator activation

  • EMA: amaxt = β · amaxt−1 + (1−β) · amaxbatch
  • delayed scaling: window 내 max 사용 (FP8 TE, §10)
  • cold-start: 초기 N batch는 max 그대로, 이후 EMA

8 Calibration pipeline

for batch in calib_set:
  y = model(batch)              # FP forward
  for tensor t in acts:
    hist[t].update(t.values)
for t in tensors:
  s[t] = argmin_KL(hist[t])     # or MSE / minmax

sample 수 ~512면 LLM activation 분포 근사에 충분.

9 분포 주의

tensor분포 특성권장
weight평균 0, 얇은 tailsym · minmax·MSE
pre-GeLU actmild asymasym · percentile
post-LayerNormheavy outlier (ch별)per-channel · SmoothQuant
attn logitslong tailpercentile 99.9
실수: calibration set이 inference 분포와 다르면 s가 편향 → out-of-dist batch에서 clipping 폭증.

1 PTQ 정의

Post-Training Quantization 학습 완료된 FP model에 calibration만으로 quant param 결정. gradient 필요 없음.
  • 입력: FP weight + 수백 sample
  • 출력: quantized weight + scale/zp 테이블
  • 소요: 분~시간 (GPTQ, AWQ는 수시간~하루)

2 QAT 정의

Quant-Aware Training FP forward 중에 fake-quant 삽입 (§11), loss에 quant error가 반영되도록 fine-tune. gradient는 STE로 통과.
  • straight-through estimator: ∂round/∂x ≈ 1
  • weight는 FP로 갱신, forward 직전 quant-dequant
  • 상세 설계는 out-of-scope

3 PTQ vs QAT ★

PTQQAT
데이터calib 수백 samplefull training set
gradient불필요 (GPTQ 제외)필수
비용분~시간수일~수주
bit 하한INT4 (세심히)INT2/INT3 가능
accuracy−0.1~−1 PPL≈ FP baseline
LLM 적용주류드묾 (비용)

4 오차 특성 비교

PTQ error: fixed grid에 FP 분포를 강제 매핑 → tail 손실
QAT error: model이 quant grid에 적합하도록 weight 분포를 재조정 QAT는 "양자화하기 쉬운 표현"으로 이동 → error 자체가 감소

5 적용 시점 분류

시점방법특징
학습 완료 후RTN / minmax PTQ가장 빠름
+ calib 수백percentile / KLactivation INT8
+ HessianGPTQ / AdaRoundper-layer 최적화
+ act 분석AWQ / SmoothQuantoutlier 대응
RetrainQAT최종 수단

6 Weight-only vs W+A

유형대상대표
W-only INT8weight만기본 PTQ
W-only INT4weight group-qGPTQ, AWQ
W8A8weight + act INT8SmoothQuant, LLM.int8()
W4A8mixed bitSpQR, QServe
W4A4둘 다 INT4Atom, QuaRot

7 왜 LLM은 PTQ 주류인가

  1. param ≥ 수십B → QAT compute 감당 불가
  2. 체크포인트만 공개 · 학습 데이터 부재
  3. PTQ+clever (GPTQ/AWQ)로 INT4 달성 가능
  4. serving 쪽 요구 (↗ V16 §7)가 빠른 iteration 선호

8 Calibration-free

  • RTN: round-to-nearest · weight stat만
  • 장: 1분 내 완료 · 단: INT8 이하에서 accuracy drop
  • baseline으로 항상 측정 → 다른 방법이 이걸 못 이기면 의미 없음

9 Hybrid 흐름

FP ckpt
  │
  ├─ RTN (baseline)
  │
  ├─ GPTQ      ← weight INT4
  │
  ├─ SmoothQ   ← act outlier migrate
  │
  └─ AWQ       ← scale per-channel
  ↓
W4A8 / W4A16 / W8A8 deploy
혼동 금지: "calibration"과 "QAT"는 다르다. calibration은 무학습 range 추정, QAT는 gradient fine-tune.

1 문제: emergent outlier ★

현상 6.7B+ LLM의 activation에는 일부 feature dimension이 다른 ch 대비 20×~100× 큰 magnitude를 갖는다. 이 outlier가 per-tensor INT8 양자화를 파괴.
  • outlier ch 수 ≈ 0.1% (hidden=12288에서 약 150개)
  • transformer block을 타고 동일 ch에서 지속

2 핵심 아이디어 ★

LLM.int8() outlier ch는 FP16으로 유지하고, 나머지만 INT8 vector-wise 양자화. 두 결과를 합산.
X = X_reg  (대부분 ch, INT8)
  + X_out  (~0.1% ch, FP16)
Y = W_reg · X_reg   (INT8 GEMM)
  + W_out · X_out   (FP16 GEMM)

3 Outlier detection

outlier(j) = 1 if maxbatch,seq |X[:,:,j]| > α
α = 6.0 (기본 threshold) ch j가 한 batch라도 6 초과 → 영구 outlier 집합에 등록

4 Vector-wise INT8 식

Cf16 = (1/(cx ⊗ cw)) · (Aq · Wq) cx: row-wise absmax of X (per-token) · cw: col-wise absmax of W (per-channel) · 결과는 외적 (row × col scale)
  • scale이 벡터이므로 per-tensor 대비 outlier-robust
  • matmul 후 FP16 rescale 단계가 epilogue

5 Mixed decomposition

Y = Dequant(Aq,reg · Wq,reg) + Af16,out · Wf16,out reg: |ch|≈0.999·d · out: sparse FP16 경로 · 두 결과는 hidden 축에서 합쳐짐

Dettmers et al. (2022) — bitsandbytes `int8_linear`.

6 속도 trade

modelINT8 speedupPPL Δ
OPT-6.7B~1.0× (offload 존재시 ↑)≈0
OPT-13B~1.2×≈0
OPT-175B~2× (fit on 1 node)≈0

소형 model은 outlier 없음 → PTQ INT8 그대로 OK.

7 장점

  • zero-shot PTQ: 학습 불필요
  • PPL 손실 ≈ 0 (13B+에서 검증)
  • 기존 FP16 ckpt 즉시 변환

8 한계

  • 두 GEMM 경로 → kernel overhead
  • FP16 outlier 경로가 INT8 이득 일부 상쇄
  • 4-bit로 밀지 못함 (outlier 비중 상승)
  • 이후 AWQ/SmoothQuant가 outlier를 weight로 옮겨 single-path 회복

9 개념도

X (B·N·d)
 ├── ch∈outlier ──► FP16 path
 └── ch∈regular ──► INT8 (vec-scale)
         │              │
         ▼              ▼
      W_f16·X_f16 + Dq(W_q·X_q)
                ▼
               Y (FP16)
주의: outlier 집합은 모델별·layer별 다름 → 한 번 식별 후 고정 사용. runtime 감지는 overhead 큼.

1 Layer-wise objective ★

argminWq ‖ W·X − Wq·X ‖F² X ∈ ℝd×N: calibration activation · weight 한 layer만 독립 최적화
  • full model loss 대신 layer output reconstruction
  • → layer 단위 병렬화 가능, gradient 불필요

2 Hessian 정의

H = 2 X XT   ∈ ℝd×d objective의 W에 대한 Hessian · layer input의 second moment · 한번 계산해 재사용

dampening: H ← H + λ·diag(H) · I, λ=1% (수치 안정).

3 OBQ 기원

Optimal Brain Quantizer OBS (Optimal Brain Surgeon)의 양자화 버전. 한 weight를 quant하면 그 error를 나머지 weight에 Hessian 가중으로 분배하여 보상.

4 OBQ single-step 수식 ★★

wF* = quant(wF)
e = (wF − wF*) / [H−1]FF
δWrestF = − e · [H−1]restF, F F: 현재 양자화 중인 index · rest: 아직 남은 column · e: 보상 크기 · error를 H−1 방향으로 남은 weight에 분산

5 GPTQ block-wise ★

W:,B ← quant(W:,B) block 단위
EB = (W − Wq):,B · [H−1BB]−1
W:,rest ← W:,rest − EB · H−1B, rest B = 128 column block · Cholesky로 H−1 미리 분해 · OBQ per-weight의 O(d4)를 O(d3)로 축소

6 알고리즘 개요

1. H = 2·X X^T + λ·diag
2. L = Cholesky(H^{-1})
3. for block B in columns (stride 128):
     for j in B:
       wq[j] = quant(w[j])
       err   = (w[j]-wq[j]) / L[j,j]
       W[:, j+1:B_end] -= err · L[j, j+1:B_end]
     W[:, rest] -= err_block · L[B, rest]

7 복잡도 / 비용

모델시간 (A100)메모리
LLaMA-7B~1h~25 GB
LLaMA-13B~2h~35 GB
LLaMA-65B~20h~160 GB
OPT-175B~4dmulti-GPU

cf. RTN은 분 단위지만 INT4에서 PPL +3 이상.

8 설정 grid

  • W4 group 128, sym · act-order: on
  • act-order: |X|2 큰 col부터 양자화 → error 축적 ↓
  • damp_percent: 0.01 (H diag에 추가)
  • → W4A16 표준 (AutoGPTQ / ExLlama)

9 결과 (요약)

설정PPL Δ (WikiText)
LLaMA-7B FP16base 5.68
W4 RTN+0.3~+0.6
W4 GPTQ+0.1~+0.2
W3 GPTQ+0.4~+0.9

Frantar et al. (2022) · 값은 논문 표 기준, 세부는 버전 의존.

주의: Hessian 계산용 calib set이 편향되면 error 분산이 잘못된 방향으로 전파 → OOD 데이터에서 성능 하락. 균형 잡힌 sample 사용.

1 핵심 관찰

  • weight 중 1% salient channel이 accuracy 대부분 결정
  • salient 기준은 activation magnitude가 큰 ch (weight 자체가 아님)
  • → 그 ch의 quant error만 줄이면 전체 PPL 유지

2 Naive 보호의 문제

관찰 salient ch만 FP16 유지, 나머지 INT4? → kernel은 mixed 경로 필요 · hardware 비효율. AWQ는 mixed 없이 해결.

3 Scale migration 아이디어 ★★ W·x = (W·s)·(x/s)

W · x = (W · diag(s)) · (diag(s)−1 · x)
W' = W · diag(s),   x' = x / s
수학적으로 동치, INT4 양자화는 W'에 수행 s ∈ ℝdin · per-input-channel scale · activation 큰 ch는 s↑ → W' 그 column 값도 커져서 round error 상대적 ↓

4 Scale s 선택 ★

sj = |xj|meanα
α* = argminα∈[0,1] ‖ W·X − Q(W·diag(s(α)))·(X/s(α)) ‖ |xj|mean: ch j의 평균 absolute activation · α=0: scale 없음 · α=1: 과도 · 보통 α*∈[0.5, 0.7]

5 Activation 흡수

x' = diag(s)−1 · x   online
but: 이전 layer의 출력 (LayerNorm 등)에 s−1 fuse 가능
runtime cost 0 attention out-proj 앞 LN scale, FFN up-proj 앞 act 등에 정적으로 흡수

6 Why it works

  • quant error ∝ s · step · ‖x‖ → s가 salient ch 보호
  • non-salient ch는 s 작음 → x/s로 처리 부담 ↑지만 FP 경로 (계산량 증가 없음)
  • weight만 INT4, activation은 FP16 유지 가능

7 AWQ vs GPTQ

GPTQAWQ
근거Hessian H=2XXTactivation magnitude
최적화column 순 block updateper-ch scale s 탐색
calib 시간시간 단위분 단위
runtime fuse불필요 (weight only)prev-layer fuse
W4A16강점강점 (양립 가능)

8 절차

1. calib forward → per-ch |x|_mean
2. α grid: {0, 0.1, …, 1.0}
3. for each α:
     s = |x|_mean^α / geomean
     W' = W·diag(s)
     loss = ‖W·X − Q(W')·(X/s)‖
4. α* = argmin
5. fuse s^{-1} into prev layer

9 결과 (요약)

모델W4 RTNW4 AWQ
LLaMA-7B+0.6+0.1
LLaMA-13B+0.4+0.08
LLaMA-65B+0.3+0.05

Lin et al. (2023) · group=128, sym. vLLM 통합 ↗ V16 §7.

주의: prev-layer가 LayerNorm/RMSNorm이어야 s fuse 가능. Residual branch에서는 fuse 지점 선택에 주의.

1 목표: W8A8 달성

문제 activation outlier 때문에 A8 (INT8 activation) 적용이 어렵다. W8는 쉽지만 A8는 per-tensor range가 outlier에 지배됨.
  • INT8 TC는 W8A8일 때만 이득 (W8A16은 GEMM dtype mix)

2 Migration 핵심 ★ 난이도 이전

Y = X · W = (X · diag(s)−1) · (diag(s) · W)
X' = X / s   activation 쉬움
W' = s · W   weight 어려움 ↑ per-input-ch scale s · activation에서 outlier 크기만큼 나눠서 weight로 이전 · weight는 원래 분포가 균일하므로 감당 가능

3 α 파라미터 ★

sj = max|X:,j|α / max|Wj,:|1−α α ∈ [0, 1] · migration 강도 · α=0: 이전 없음 · α=1: 완전 이전 (weight가 못 견딤)
  • OPT / BLOOM: α ≈ 0.5
  • LLaMA: α ≈ 0.75~0.85 (outlier 심함)
  • layer별 개별 튜닝 가능

4 효과 시각화

before:
 X  : ───|▇▇▇|─── (outlier ch 극단)
 W  : ──▂▂▂▂▂──   (균일)

after (s fused):
 X' : ──▃▃▃▃▃──   (평탄화)
 W' : ──▃▅▅▅▃──   (약간 커짐)
 → 둘 다 INT8에 안전

5 Fuse 대상

위치fuse 대상
QKV proj 앞LayerNorm γ
FFN up 앞LayerNorm γ
Out proj 앞별도 div op (추가)
FFN down 앞element-wise scale

out-proj 앞은 fuse 지점이 없어 작은 runtime overhead 발생.

6 AWQ와의 관계

SmoothQuantAWQ
목표W8A8W4A16
이전 방향act → weightweight → act (역)
scale 식max|x|α/max|w|1−α|x|meanα
primary 용도activation int8 가능화weight int4 보호

7 PPL 결과 (요약)

모델W8A8 baselineW8A8 SQ
OPT-6.7B+2.1+0.1
OPT-66B+12.5+0.2
BLOOM-176B+3.2+0.1

Xiao et al. (2022) · 대형 model에서 효과 두드러짐.

8 결정 절차

1. FP16 forward on calib
2. per-ch:
     a_max[j] = max |X[:,:,j]|
     w_max[j] = max |W[j,:]|
3. sweep α:
     s(α) = a_max^α / w_max^{1-α}
     fuse s, quant W', quant X'
     eval loss
4. pick α* minimizing PPL

9 한계

  • W4 로 내리면 weight 쪽이 못 견딤 (AWQ/GPTQ 필요)
  • α 튜닝은 layer 단위 sweep 필요 — 전체 calib 시간 ↑
  • attention softmax 출력은 별도 처리 (per-head range)
혼동: AWQ와 SmoothQuant 모두 "scale migration"을 쓰지만, 목표 (W4 vs W8A8)와 scale 공식이 다르다. 같이 사용 가능 (hybrid).

1 KV cache의 bandwidth 부담

배경 autoregressive decode는 step당 새 토큰 1개 · 과거 KV 전부 재로드. batch·seq 증가시 HBM→TC bandwidth가 latency 지배.
  • KV 메모리 = 2·L·H·dhead·seq·dtype · attention 상세 ↗ V07 §5
  • FP16→INT8: 2× bandwidth·capacity, INT4: 4×

2 Quant 설정 패턴 ★

INT8INT4
granularityper-tokenper-token + group=128
sym/asymasymasym
실효 speed~1.8×~3.2×
PPL Δ≈0+0.1~+0.3

asym 선택 이유는 §4에서 설명.

3 Per-token scale 수식

Kt ∈ ℝH·d   token t의 key
st = (max(Kt) − min(Kt)) / 255
zt = round(−min(Kt) / st)
Kq,t = clip(round(Kt/st) + zt, 0, 255) 각 new token이 생성될 때 그 token 자신의 s,z만 계산 · 과거는 cached 그대로

4 asym 선택 이유 ★

  1. K는 LayerNorm 직후 → 분포가 0 근처이지만 mild skew 있음
  2. V는 activation (attention 가중합 입력) → 비대칭 분포
  3. sym은 range 한쪽이 낭비 → clipping or step 팽창
  4. per-token은 새 token마다 s,z 재계산 — cost 작음

5 Attention에서의 결합

Sij = Qi · Kj / √d
= Qi · sK,j · (Kq,j − zK,j) / √d Q는 FP16 유지 · K는 on-the-fly dequant · per-token scale은 softmax 전 rescale

dequant를 matmul에 fuse하면 extra load 없음 (load·dequant·mma).

6 INT4 group scheme

K[t, h, :] size d_head=128
group_size = 32 → 4 group/token
 s_K[t, h, g] × 4
 z_K[t, h, g] × 4
quant: K_q[t, h, g·32:(g+1)·32] ∈ [0,15]

group=32가 PPL-overhead 균형점 (Atom).

7 Per-channel vs per-token

per-channel (head dim)per-token
scale 저장H·d (static)seq·H (dynamic)
K에 적합○ (ch별 bias)
V에 적합○ (token별 magnitude)
메모리고정 overheadseq 비례

8 Paged KV 적합성

  • PagedAttention 블록 (16 tok) 경계에 scale block 정렬 → cache 친화
  • scale 자체는 FP16 그대로 (small)
  • vLLM의 kv-cache dtype: int8_e4m3, fp8 옵션
  • vLLM quant 통합은 ↗ V16 §7

9 주의점

  • prefill 단계의 KV도 함께 양자화 (불일치 시 drift)
  • RoPE 적용 양자화는 회전 오차 유발 → 후에 양자화
  • speculative decoding과 조합 시 rollback token도 재dequant 필요
실수: K에 per-token sym을 쓰면 channel-wise bias (head별 상수 shift)가 양자화 step을 팽창시킨다. per-channel 또는 asym 필요.

1 K와 V의 분포 차이 ★

K (Key)V (Value)
출처LN·WK·xLN·WV·x
채널 bias (ch별 fixed offset)작음
token variance작음
최적 scaleper-channelper-token

2 KIVI 공식

KIVI KV Cache Quantization with Mixed Granularity. K는 channel 축으로, V는 token 축으로 scale 부여.
  • K quant: sK ∈ ℝdhead
  • V quant: sV ∈ ℝseq
  • INT2/INT4 모두 가능 (논문은 INT2까지 검증)

3 수식

Kq[c, t] = round((K[c, t] − zK,c) / sK,c)
Vq[t, c] = round((V[t, c] − zV,t) / sV,t) c: channel index · t: token index · K는 ch축으로 정렬, V는 token축으로 정렬 → 다른 layout 필요

4 Atom 추가 설계 ★ W4A4 + mixed KV

  • weight/activation INT4 (W4A4) + KV INT4
  • activation도 outlier와 reg 분리 (LLM.int8() 계보)
  • group=128, fused dequant
  • FP16 baseline 대비 2.5~3× end-to-end

5 왜 per-channel K가 이득인가

K[c, t] = γc · x'[c, t] + βc LN affine param γ,β가 ch별로 상수 offset 생성 · 같은 ch 내 값들은 비슷한 range · 다른 ch는 range 다름

per-token sym은 ch shift를 scale로 흡수 못 함.

6 왜 per-token V가 이득인가

  • V는 attention 가중합의 input → 토큰별 magnitude 차이 큼
  • 특정 token이 informative → magnitude ↑
  • per-token scale이 그 가변성 흡수

7 Layout 관점

K tensor : [L, H, d_head, seq]
            ↑ scale 축

V tensor : [L, H, seq, d_head]
                   ↑ scale 축

→ K / V의 스토리지를 서로 다른
  stride로 유지하면 per-axis scale이
  coalesced load와 맞음.

8 정리 매트릭스

schemeKVbit
naiveper-token symper-token sym8
vLLM FP8per-tensorper-tensor8 (FP8)
KIVIper-ch asymper-tok asym4/2
Atomper-ch asymper-tok asym4

9 결과 (요약)

설정PPL Δ
LLaMA-7B KV8 per-tok sym+0.05
LLaMA-7B KV4 per-tok sym+1.1
LLaMA-7B KIVI INT4+0.2
LLaMA-7B KIVI INT2+0.5

Liu et al. (2024) · WikiText-2 PPL.

구현 주의: K,V를 다른 axis로 layout하면 attention kernel의 memory access pattern이 달라진다. FlashAttention 변형 또는 별도 dequant pass 필요.

1 FP8 vs INT8 차이

INT8FP8
표현uniform [-127, 127]exp+mant (E4M3/E5M2)
dynamic range고정 (s로 이동만)~107 (E4M3)
calibration필수필수 (amax)
outlierclip or scaleexp가 일부 흡수
bit layoutint↗ V09 §4

2 Per-tensor amax 기본 ★

amax = max |x|
s = amax / FP8max
FP8max = 448 (E4M3), 57344 (E5M2)
xq = castFP8(x / s)   s는 FP32
xdq = xq · s sym · per-tensor 기준 · weight는 static amax, activation은 batch마다 갱신

3 Delayed Scaling ★★ window amax

Delayed Scaling 현재 batch의 amax를 그대로 쓰지 않고, 최근 N batch의 amax history에서 max를 취해 다음 batch의 s로 사용.
hist = [amax_{t-N}, …, amax_{t-1}]
s_t  = max(hist) / FP8_max
amax_t = measure(x_t / s_t … )  ← 기록만, 다음에 씀
hist.shift_and_insert(amax_t)

4 왜 delayed인가

  1. non-blocking: amax 계산 결과를 기다리지 않고 다음 kernel 실행
  2. 이전 N step의 max가 현재와 비슷 → 안정성 확보
  3. 통신·scheduling 비동기화 가능
  4. 수렴 초기에는 fallback (current amax 사용)

5 TE (Transformer Engine) 흐름

forward:
 1. load s (from prev hist)
 2. x_fp8 = cast(x / s)
 3. y = GEMM_fp8(x_fp8, w_fp8, acc=fp32)
 4. amax_t = max|x|      (비동기)
 5. hist[t] = amax_t
 6. s_{t+1} = max(hist) / 448

backward:
 gradient는 E5M2 (range 넓음)

6 E4M3 vs E5M2 사용 방침

대상dtype이유
weightE4M3정밀 우선, range 충분
forward actE4M3정밀 우선
backward gradE5M2range 넓음
accumulatorFP32누적 오차 방지

7 attention에서의 FP8

  • FlashAttention-3: Q/K/V → FP8, softmax는 FP32
  • P=softmax(S/√d) · FP8 clamp [0,1] · P·V matmul FP8
  • incoherent processing으로 outlier 억제 (↗ V07 §8)

8 Kernel fusion 관점

load_fp16 → cast_fp8 → mma_fp8
                              │
  FP32 accumulator ←─────────┘
                              │
                     cast_fp16 or fp8 ← epilogue

WGMMA는 FP8 operand · FP32 acc (Hopper). 상세 ↗ V04 §8.

9 Block-scale (MX / NV FP4)

block-scale group G마다 FP8 또는 UE8M0 scale. FP8/FP4 element + tiny scale = per-tensor outlier 흡수 + per-channel 메모리 효율.
  • MXFP8: G=32, scale UE8M0
  • NVFP4: G=16, scale FP8 E4M3
  • Blackwell 5th-gen TC가 group dot + scale 단일 명령
실수: forward 중 current-batch amax를 그대로 쓰면 amax reduction이 다음 kernel을 block → utilization ↓. delayed가 표준.

1 두 경로의 정의 ★

경로Fake (simulated)Real
dtypeFP32/FP16 내부INT8/FP8 실제
연산quant → dequant → FP matmullow-prec matmul
속도baseline과 유사~2× / ~4×
용도accuracy 평가, QAT실제 배포
오차round+clip만+ accumulator error

2 Fake quant 수식

x' = s · clip(round(x/s), qmin, qmax)
y = FP_matmul(x', w') quant-dequant를 in-place로 수행, matmul은 여전히 FP32 · 정확도 평가용

3 Real quant 수식

xq = castINT8(x / sx)
wq = castINT8(w / sw)
accINT32 = Σ xq · wq   TC
yFP16 = sx · sw · accINT32

4 왜 결과가 다른가 ★

  1. fake는 dequant 결과를 FP32로 곱 · round error 1회
  2. real은 INT 곱 · accumulator 폭 제한 (INT32)
  3. real은 dequant 시점이 matmul 이후 → scaling fusion 오차
  4. activation의 epilogue 조합 (bias, GeLU)이 경로마다 다름

5 Accumulator 폭

연산acc dtypesaturate?
INT8·INT8 TCINT32K≤216이면 안전
FP8·FP8 TCFP32항상 안전
INT4·INT4INT32안전
FP4·FP4FP32안전 (block-scale과 결합)

6 Epilogue fusion 차이

fake:
 FP(W·X) → +bias → GeLU → next quant

real:
 INT(W_q·X_q)
    ↓ dequant (s_w·s_x)
    ↓ +bias (FP)
    ↓ GeLU   (FP, approximated)
    ↓ quant (next layer)

7 GeLU / SiLU 근사

  • fake: 정확한 tanh-based GeLU
  • real kernel: piecewise LUT or 근사 polynomial → 미세 오차
  • 이 오차가 깊은 layer를 거쳐 누적될 수 있음

8 검증 워크플로우

  1. fake quant로 PPL 측정 (학습·디버깅)
  2. real kernel로 동일 batch 재측정
  3. 차이 > 0.1 PPL이면 epilogue / acc 조사
  4. 주요 tensor에 FP32 tap 넣어 비교

9 STE 관점

forward: x' = Q(x)
backward: ∂L/∂x ≈ ∂L/∂x'   (pass-through) QAT에서 fake-quant를 미분 가능하게 만드는 트릭 · round는 원래 gradient가 0이지만 1로 근사
주의: fake quant PPL이 좋다고 real kernel PPL이 그대로 나오지 않는다. accumulator saturation · epilogue 근사를 반드시 별도 검증.

1 Perplexity 정의 exp(−log p)

PPL = exp( −(1/N) Σ log p(xt | x<t) ) N: 전체 token 수 · 작을수록 좋음 · WikiText-2 / C4 데이터셋 표준
  • 빠른 quant accuracy sanity check
  • 소수점 단위 변화가 유의미 (FP16 base 대비 +0.1 이하 목표)

2 MMLU · GSM8K

벤치측정특징
MMLU다분야 지식 zero-shot accuracyknowledge tail 민감
GSM8K수학 체인오브소트reasoning 누적 오차 반영
BBH / HumanEvalreasoning / codetask 세분

PPL은 통과하지만 MMLU·GSM8K에서 점수 drop하는 quant 흔함.

3 지표별 quant 민감도

  • PPL: 평균적 likelihood → outlier 덜 보임
  • MMLU: rare knowledge · tail weight 양자화에 민감
  • GSM8K: 단계마다 오류 누적 · reasoning layer 민감
  • HumanEval: 정확 token 생성 → 한 bit 오차 치명

4 Quantization error norm

εW = ‖W − WdqF / ‖W‖F
εY = ‖Y − YqF / ‖Y‖F εW: weight 내재 오차 · εY: layer 출력 오차 (더 중요한 지표)

per-layer εY 를 plot하면 문제 layer가 드러남.

5 Cosine similarity

cos(y, yq) = y · yq / (‖y‖ · ‖yq‖) 방향 일치도 · magnitude 불변 · layer 누적 후에도 의미 유지

activation은 magnitude보다 방향이 downstream에 중요.

6 벤치 selection 표

quant 목적필수 지표
W8 (min loss)PPL
W4 (W-only)PPL + MMLU
W4A8PPL + MMLU + GSM8K
W4A4전부 + humaneval
KV quantlong-context PPL

7 Layer drop-out 진단

for L in layers:
  run with L quantized, others FP
  measure ΔPPL
→ sort layers by impact
→ 최악 top-k는 FP16 유지 (mixed-bit)

8 Long-context 특수

  • KV quant는 seq↑에 따라 드리프트 누적 가능
  • needle-in-haystack · RULER 벤치 사용
  • PPL은 seq 짧을수록 underestimate

9 어떤 지표를 언제

상황지표
sweep 중 빠른 비교PPL (WikiText-2)
release gatingMMLU + GSM8K + PPL
per-layer debugεY, cos
long-contextRULER / needle
RL·codeHumanEval / pass@k
주의: PPL은 toy benchmark. 동일 PPL이어도 MMLU는 2~3pt 차이 날 수 있다. release 전엔 task 벤치 필수.

1 방법 × 대상 × 설정 매트릭스 ★★

방법WAKVbitsym/asymgranularity
RTN××8symper-ch
LLM.int8()×8sym (vec)per-tok (A) · per-ch (W)
GPTQ××4/3symper-group 128
AWQ××4symper-group 128
SmoothQuant×8sym+asymper-ch/tok
FP8 (TE)8 (FP)symper-tensor
MX / NVFP4×4/8 (FP)symblock (16/32)
KIVI××4/2asymper-ch K + per-tok V
Atom4asymgroup 128 + KV mixed

2 핵심 수식 재정리

Sym: xq=clip(round(x/s)), s=max|x|/(2b−1−1)
Asym: s=(xmax−xmin)/(2b−1), z=round(−xmin/s)
GPTQ: e=(w−wq)/[H−1]FF, Wrest−=e·H−1
AWQ: W·x=(W·s)·(x/s), s=|x|meanα
SQ: sj=max|X:,j|α/max|Wj,:|1−α
FP8: s=amax/FP8max, delayed: st=max(hist)/FP8max

3 선택 결정 트리 ★

Q: accuracy 예산 ΔPPL?
 ├─ ≤0.05 ──► FP16 유지 (no quant)
 ├─ ≤0.2  ──► W8 RTN / FP8 (E4M3)
 │            └ A8도 원함 → SmoothQuant
 ├─ ≤0.5  ──► W4 AWQ or GPTQ (g=128)
 │            └ KV도 줄임 → +KIVI INT4
 └─ ≤1.0  ──► W4A4 Atom / MXFP4
              └ 학습 가능? → QAT

4 하드웨어 매핑

GPU지원 low-prec TC
A100 (Ampere)INT8 / INT4 / BF16
H100 (Hopper)+ FP8 E4M3/E5M2 + TE
B200 (Blackwell)+ FP4 / MX / NVFP4 block-scale

arch 상세 ↗ V02 §7.

5 모델 크기 × latency 축

모델latency 중요throughput 중요
<3BW8 / FP8FP16 batch ↑
7–13BW4 AWQ + KV8W4A8 SmoothQuant
30–70BW4 AWQ + KV4 KIVIW4A4 Atom / MXFP4
175B+W4 GPTQ + FP8 + TP동일 + EP

6 Do / Don't ★

DoDon't
weight: per-ch symper-tensor sym on large LLM
act: per-tok asym (or SQ)per-tensor act without smoothing
accumulator FP32low-prec accumulator
RTN baseline 측정 선행RTN 건너뛰고 GPTQ
MMLU·GSM8K 최종 검증PPL만 믿기
FP8 delayed scalingcurrent-batch amax block

7 흔한 실수 5선 (!) acc·RoPE·soft·cal·fake

  1. accumulator까지 low-prec → reduction 붕괴
  2. RoPE 적용 전 K 양자화 → 회전 오차
  3. softmax 출력을 INT로 → dynamic range 부족
  4. calibration 분포가 serving과 다름
  5. fake quant PPL만 보고 deploy

8 1-liner 요약

  • RTN: round, 끝
  • LLM.int8(): outlier ch FP16, 나머지 INT8
  • GPTQ: H−1로 error 분산
  • AWQ: W·s, x/s로 salient 보호
  • SmoothQuant: outlier act→weight 이전
  • KIVI: K per-ch + V per-tok
  • FP8: amax history·delayed·E4M3/E5M2

9 연결 지도

  • dtype 비트 layout → ↗ V09 §4
  • KV 구조·attention → ↗ V07 §5
  • vLLM quant 통합 → ↗ V16 §7
  • Tensor Core dtype 지원 → ↗ V02 §7
  • FA3 FP8 schedule → ↗ V07 §8