İçeriğe geç

AWQ Algoritması: Activation-Aware Salient Channel Scaling — Outlier'lara Saygı

AWQ (Lin et al. 2023) — GPTQ'nun aktivasyon-bilinçli alternatifi. Activation outlier'larını protect eden 'salient channel scaling' tekniği. autoawq lib ile Llama 3.1 8B'yi RTX 4090'da 8 dakikada int4'e quantize, GPTQ'dan biraz daha iyi WikiText-2 perplexity + vLLM serving uyumu daha kolay.

Şükrü Yusuf KAYA
30 dakikalık okuma
İleri
AWQ Algoritması: Activation-Aware Salient Channel Scaling — Outlier'lara Saygı

1. AWQ'nun İçgörüsü#

LLM activation'larında outlier channels var — birkaç channel mean'in 4-6x'i değerinde. Bu channel'lar:
  • Tüm output'un %1'ini (channel sayısı) oluşturur
  • Output'un %~30'una katkı yapar (signal)
Klasik quantization bu outlier'ları "feda eder" (yuvarlayarak hassasiyet kaybeder) → büyük perplexity artışı.
AWQ'nun trick'i:
  • Calibration data ile her channel'ın activation magnitude'unu ölç
  • "Salient" (önemli) channel'ları belirle
  • Bu channel'lara karşılık gelen weights'i
    s
    faktörüyle scale et
  • Quantize et — scale sayesinde precision korunur
  • Inference'ta scale'i tersine al

2. AWQ Matematik#

W' = W × diag(s) (scale uygula) W_q = quantize(W') (artık daha yüksek precision için) output = (W_q × diag(s)^-1) × x (scale'i geri al)
s
scale faktörü:
s_i = avg(|activation_i|)^α / mean^α
, α genelde 0.5.
Sonuç: salient channel'lar yüksek scale → daha küçük value'lar (range içinde) → quantization daha hassas.
Cookbook'un kuralı: AWQ ve GPTQ kalite olarak çok yakın; AWQ vLLM serving'inde daha uyumlu (default support varies).
python
# === AWQ ile Llama 3.1 8B int4 quantization ===
from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer
 
model_path = "meta-llama/Meta-Llama-3.1-8B-Instruct"
quant_path = "llama-3.1-8b-int4-awq"
 
# 1. Load
model = AutoAWQForCausalLM.from_pretrained(model_path, device_map="cuda",
torch_dtype="bfloat16")
tok = AutoTokenizer.from_pretrained(model_path)
 
# 2. Quantization config
quant_config = {
"zero_point": True, # asymmetric quant
"q_group_size": 128,
"w_bit": 4,
"version": "GEMM", # vLLM compat (GEMM kernel)
}
 
# 3. Quantize — ~8 dakika RTX 4090
model.quantize(tok, quant_config=quant_config)
model.save_quantized(quant_path)
tok.save_pretrained(quant_path)
 
# Bench (vs bf16):
# - Size: 16 GB → 4.4 GB (-73%)
# - WikiText-2 PPL: 5.93 → 5.99 (+1.0%) ← GPTQ'dan ~%1 iyi
# - vLLM tok/s (single, batch=1): 95 → 175 (+84%)
# - vLLM tok/s (batch=16): 540 → 920 (+70%)
AWQ ile Llama 8B int4 quantization

3. GPTQ vs AWQ Karşılaştırma#

KriterGPTQAWQ
Quantization süresi (8B, 4090)12 dk8 dk
WikiText-2 PPL delta+1.9%+1.0%
vLLM uyumuiyi (auto-gptq + vllm-flash-attn)mükemmel (native)
Inference throughput (vLLM)+%74+%84
Marlin kernel desteğievet (vLLM auto)evet
Multi-modal supportsınırlıbüyüyen
Cookbook tercihi (2026)yedekdefault
Cookbook'un yeni Lab'ları AWQ tercih ediyor.
✅ Teslim
  1. Llama 3.1 8B'yi AWQ ile quantize et. 2) Aynı modeli GPTQ ile de quantize et. 3) WikiText-2 + TR-MMLU karşılaştır. 4) Sonraki ders: 10.4 — GGUF K-Quants.

Yorumlar & Soru-Cevap

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

İlgili İçerikler