Skip to content

Quantization Mathematics: Symmetric/Asymmetric, Per-Tensor/Per-Channel/Per-Group, QAT vs PTQ

Mathematical foundations of quantization: float→int mapping formula, symmetric vs asymmetric, per-tensor vs per-channel vs per-group granularity, QAT vs PTQ, bit-width choice. Quantization characteristic of every tensor in Llama 8B's 32 layers on RTX 4090.

Şükrü Yusuf KAYA
32 min read
Advanced
Quantization Matematiği: Symmetric/Asymmetric, Per-Tensor/Per-Channel/Per-Group, QAT vs PTQ

1. Niye Quantization?#

FormatBit/weight8B model sizeRTX 4090 fit?Quality loss
fp323232 GBreference
bf161616 GB⚠️ borderline<%0.1
int888 GB%0.5-1
int4 (NF4)44 GB✅ rahat%1-3
int2 (HQQ/AQLM)22 GB%5-10
Quantization = memory tasarrufu + inference throughput artışı + bazen training-time tasarruf.

2. Quantization Formülü#

Q(x) = round(x / scale) + zero_point deQ(q) = (q - zero_point) × scale
Iki ana parametre:
  • scale (
    s
    ) — fp range / int range
  • zero_point (
    z
    ) — fp 0'ın hangi int'e karşılık geldiği

Symmetric quantization (
z = 0
):#

s = max(|x|) / (2^(b-1) - 1)
  • Range simetrik: [-x_max, +x_max] → [-128, +127] (int8 örnek)
  • zero_point
    yok → daha az compute
  • Kullanım: weights (genelde simetrik dağılım)

Asymmetric quantization (
z ≠ 0
):#

s = (x_max - x_min) / (2^b - 1) z = round(-x_min / s)
  • Range asimetrik: [x_min, x_max] → [0, 255] (uint8 örnek)
  • zero_point
    var → biraz fazla compute
  • Kullanım: activations (ReLU sonrası ≥ 0 asimetrik)

3. Granularity — Quantization Hangi Eksende?#

GranularityScale tensor shapeTrade-off
Per-tensorscalaren az parametre, en kötü kalite
Per-channel (per-row)[out_channels]LLM weights için klasik
Per-group (block-wise)[out_channels, n_groups]en iyi kalite, en fazla parametre
Per-token (activations)[batch, seq]activation runtime
Cookbook'un standardı: weights için per-channel + per-group=64-128 (GPTQ/AWQ default).
# Per-tensor — scale tek bir sayı W_q = round(W / s) # s.shape == () # Per-channel — her output channel için ayrı scale s = max(|W|, dim=-1) / 127 # s.shape == (out,) W_q = round(W / s[:, None]) # Per-group (block-wise) — her 64 elemanlık blok için ayrı scale W_grouped = W.reshape(out, in_features // 64, 64) s = max(|W_grouped|, dim=-1) / 7 # 4-bit → -7..7 W_q = round(W_grouped / s[..., None])

4. QAT (Quantization-Aware Training) vs PTQ (Post-Training Quantization)#

PTQ (cookbook'un default'u)#

  • Train edilmiş model'i quantize et
  • Calibration set ile scale/zero_point hesapla
  • Cost: dakikalar (örneğin GPTQ Llama 8B → 12 dk RTX 4090)
  • Quality loss: %1-3

QAT#

  • Training sırasında "fake quantize" işlemleri ekle
  • Forward'da quantized weights kullan, backward'da gradient akıt
  • Cost: saatler (training kadar pahalı)
  • Quality loss: %0-1 (PTQ'dan daha iyi ama az)
Cookbook'un kuralı:
  • LLM fine-tuning → QLoRA (NF4) ≈ PTQ on weights + FP backward, en pragmatic
  • Production serving → PTQ (AWQ/GPTQ) for inference speed
  • Mission-critical → QAT araştırma yatırımı (akademi + Meta/Google)

5. Llama 3.1 8B Tensor Karakteristikleri#

Quantization stratejisi seçmek için her tensor tipinin dağılımı önemli:
TensorDağılımÖnerilen scheme
embed_tokens
(input embedding)
sparse-ishper-token (kept fp16)
q_proj
,
k_proj
,
v_proj
weights
Gaussian-likeper-channel int4, group=128
o_proj
weights
broader tailper-channel int4, group=64
gate_proj
,
up_proj
,
down_proj
SwiGLU FFN, daha genişper-channel int4, group=128
lm_head
quasi-Gaussianper-channel int8 ya da bf16
RMSNorm weightsvery narrowfp16/bf16 kept
Activations (mid-FFN)outlier-heavy (4-6x mean)AWQ scaling gerekli
Bu yüzden GPTQ ve AWQ farklı yöntemler — bu özellikleri ayrı ele alıyorlar (Ders 10.2 + 10.3).
✅ Teslim
  1. Llama 3.1 8B'nin bir layer'ının weight histogram'larını çıkar (matplotlib). 2) Per-tensor vs per-channel vs per-group quantization noise'u ölç. 3) Sonraki ders: 10.2 — GPTQ Algoritması.

Yorumlar & Soru-Cevap

(0)
Yorum yazmak için giriş yap.
Yorumlar yükleniyor...

Related Content