AWQ — Nhìn activation để bảo vệ weight nhạy cảm
Activation-aware Weight Quantization bảo vệ các weight quan trọng bằng cách nhìn vào activation, giảm 4x memory mà giữ gần 100% độ chính xác của FP16.
Mọi phương pháp quantization đều tìm cách nén model xuống ít bit hơn, nhưng AWQ nhận ra một điểm yếu chết người: không phải weight nào cũng có giá trị như nhau. Một lỗi làm tròn nhỏ trên weight kết nối với activation lớn có thể khuếch đại thành lỗi khổng lồ ở output. AWQ giải quyết điều này bằng cách "xem trước" activation để biết weight nào cần được bảo vệ đặc biệt — giảm 4x bộ nhớ mà gần như không mất độ chính xác.
Vấn đề
Quantization truyền thống — dù là round-to-nearest đơn giản hay các phương pháp phức tạp như GPTQ — đều mắc cùng một sai lầm: chúng đối xử tất cả weights như nhau. Khi bạn quantize một weight từ 0.1234 xuống 0.1250 (4-bit), lỗi 0.0016 tưởng chừng vô hại.
Nhưng trong inference, weight này nhân với activation. Nếu activation là 0.01, lỗi output chỉ là 0.000016 — không đáng kể. Nếu activation là 500, lỗi bỗng dưng thành 0.8 — đủ để flip một token prediction từ "Paris" sang "London".
Vấn đề là error amplification. Các weight kết nối với channels có activation magnitude cao (những "salient channels") cần độ chính xác cao hơn vì lỗi của chúng bị khuếch đại tuyến tính bởi tín hiệu mạnh. Standard quantization không biết điều này, dẫn đến mất mát thông tin nghiêm trọng ở những pathways quan trọng nhất của model.
Ý tưởng cốt lõi
AWQ (Activation-aware Weight Quantization) có một insight đơn giản nhưng tinh tế: weights chỉ là multipliers, và lỗi quantization của chúng scale tuyến tính với signal mà chúng carry. Channels nào thường xuyên "fire" với magnitude lớn cần "multiplier" chính xác hơn.
Thay vì dùng Hessian matrix như GPTQ (second-order, tốn kém tính toán), AWQ nhìn vào chính activation magnitudes (first-order) để xác định độ quan trọng — nhanh hơn 10× nhưng vẫn đạt độ chính xác tương đương.
The Scaling Trick — Phép thuật đại số:
Thay vì quantize weight gốc w, AWQ scale nó lên trước khi quantize: w' = w × s. Điều này spread các giá trị weight quan trọng ra nhiều bins quantization hơn (tương đương cho chúng độ phân giải cao hơn).
Để giữ phép toán tương đương, ta scale activation x ngược lại: x' = x / s. Bây giờ phép nhân w' × x' vẫn bằng w × x về mặt toán học, nhưng weight đã được bảo vệ tốt hơn.
Đây là "chiêu trò" đóng gói: tưởng tượng bạn đi máy bay với hạn nặng nghiêm ngặt (quantization bins). Bạn có vàng nặng (high-activation weights) và lông nhẹ (low-activation weights). Quantization thường cho mọi người hộp nhỏ như nhau — vàng bị ép vỡ. AWQ nói: "Hãy tạm thời giả vờ vàng nặng hơn (scale up), cho nó hộp lớn hơn, nhưng bảo hãng máy bay bên kia mong đợi hành lý nhẹ hơn (scale activation down)." Hãng (GPU) thấy hộp bình thường, nhưng hàng của bạn đến nơi nguyên vẹn.
Quy trình thực tế:
- Calibration: Chạy ~100 câu mẫu qua model FP16 để thu thập thống kê activation (magnitude trung bình mỗi channel).
- Salience detection: Xác định channels có activation magnitude cao — đây là "important channels".
- Grid search: Tìm scaling factor s tối ưu (thường 1.2–2.0×) để minimize MSE giữa output quantized và FP16.
- Scale & Quantize: Nhân salient weights với s rồi quantize 4-bit.
- Fusion: "Nướng" inverse scale 1/s vào operation tiếp theo (layer norm hoặc linear). Kết quả: inference dùng standard INT4 GEMM kernels, không overhead.
Tại sao nó hoạt động
Error Amplification Principle: Lỗi quantization không sinh ra bình đẳng. Khi bạn làm tròn weight, lỗi đó được nhân với activation trong inference. AWQ bảo vệ những weight nằm trên đường dẫn có tín hiệu mạnh, nơi lỗi sẽ bị phóng đại thành sai lầm lớn.
First-Order vs Second-Order: GPTQ dùng Hessian (ma trận second-order derivatives) để xác định hướng weight space quan trọng — mathematically rigorous nhưng computationally expensive. AWQ dùng activation magnitudes làm proxy. Giống như thay vì tính toán chính xác cầu sẽ sập dưới stress nào (GPTQ), AWQ chỉ nhìn xem dầm nào đang chịu nhiều traffic nhất — heuristic này hóa ra chính xác đáng ngạc nhiên và nhanh hơn nhiều.
Hardware Efficiency: Vì phép scale được fuse vào layer tiếp theo, GPU vẫn chạy standard INT4 matrix multiplication. Không cần custom kernels phức tạp. Đây là lý do AWQ được vLLM, TensorRT-LLM, và AutoAWQ hỗ trợ rộng rãi.
Ý nghĩa thực tế
Benchmarks thực tế: Llama-2-70B 4-bit AWQ đạt perplexity chỉ chênh 0.1% so với FP16 gốc — trong khi giảm 4× bộ nhớ (70B fit vào single A100 80GB). Tốc độ inference ~52 tok/s trên GPU consumer so với ~40 tok/s của GGUF 4-bit.
Ai đang dùng: AutoAWQ (thư viện chuẩn), vLLM (production serving), HuggingFace Optimum, NVIDIA TensorRT-LLM, AMD Quark. Đây là lựa chọn mặc định cho production deployment Llama/Mistral/Qwen với 4-bit quantization.
Limitations đáng chú ý:
- Calibration data required: Không giống data-free methods, AWQ cần ~100 samples đại diện để đo activation. Dữ liệu không liên quan sẽ cho kết quả tệ.
- Weight-only: Chỉ quantize weights, activations vẫn là FP16/BF16. Memory bandwidth vẫn là bottleneck trong inference dài.
- Sub-4-bit khó khăn: Dưới 4-bit (3-bit), accuracy degrades nghiêm trọng vì dynamic range quá hẹp để bảo vệ cả salient và non-salient weights.
Đào sâu hơn
Paper gốc: AWQ: Activation-aware Weight Quantization for LLM Compression (arXiv:2306.00978, 2023) — bài gốc từ MIT và Microsoft Research.
Bài liên quan TroiSinh:
-
Cùng cụm:
- quantization-basics — Nền tảng quantization INT8/INT4, rounding error, và Hessian intuition
- gptq — Phương pháp dùng Hessian thay vì activation, trade-off giữa accuracy và speed
- gguf-llamacpp — 4-bit packing cho local inference, khác biệt với AWQ serving
-
Đọc tiếp:
- TurboQuant — Random rotation trước quantization, xuống được 3-bit KV cache không mất accuracy (Level 2 — Frontier)
- KV Cache Quantization — Nén activation cache INT4 để mở khóa ultra-long context (liên quan đến memory bottleneck của AWQ)
External Resources:
- Blog Lei Mao về AWQ — Phân tích toán học sâu về group-wise quantization error và scaling factor derivation
- Reddit comparison AWQ vs GPTQ vs EXL2 — Benchmark thực tế về perplexity, VRAM, và inference speed trên các phương pháp quantization khác nhau
GPTQ — Dùng Hessian để biết weight nào quan trọng khi round
GPTQ giải mã cách nén LLM xuống 4-bit bằng ma trận Hessian: xác định hướng trọng số nhạy cảm và bù lỗi ngay lập tức, chạy 70B model trên GPU 24GB.
GGUF & llama.cpp — Chạy 70B trên laptop bằng 4-bit packing
GGUF là định dạng nén 4-bit giúp chạy Llama 3 70B trên laptop 64GB RAM, biến GPU từ 'kẻ đợi băng thông' thành 'máy tính thực thụ' mà không cần Python stack nặng nề.