TROISINH
BreakthroughsQuantization

Quantization INT8/INT4 — Ít bit hơn, nhỏ hơn 8x, vẫn chính xác

Giải mã cách nén mô hình AI từ 16-bit xuống 4-bit mà không mất chất: bản chất là khai thác dư thừa thống kê và bảo vệ 'kẻ phá bĩnh' outlier.

Bạn có thể chạy Llama 3 70B — mô hình cần 140GB VRAM ở độ chính xác đầy đủ — trên một chiếc MacBook 32GB hoặc RTX 4090 24GB. Bí mật không phải là phần cứng thần kỳ, mà là quantization: thay vì lưu trữ mỗi trọng số bằng 16-bit floating point (FP16/BF16), ta nén xuống 8-bit hoặc thậm chí 4-bit integer. Kết quả? File nhỏ hơn 4-8 lần, tốc độ inference tăng vọt, và độ chính xác vẫn giữ được trên 98%. Đây là cách nó hoạt động.

Vấn đề

Mô hình ngôn ngữ lớn (LLM) đang gặp phải bức tường băng thông nhớ (memory wall), chứ không phải bức tường tính toán. Một GPU hiện đại như H100 có thể thực hiện hàng nghìn tỷ phép tính mỗi giây (TFLOPS), nhưng băng thông bộ nhớ (memory bandwidth) chỉ loanh quanh 2-3 TB/s.

Với Llama-2-70B ở FP16, bạn cần ~140GB VRAM chỉ để chứa weights. Nhưng đó chưa phải vấn đề duy nhất. Khi inference, mỗi token mới đòi hỏi phải nạp toàn bộ trọng số mô hình qua bus nhớ — đó là lý do tại sao bạn thấy GPU chạy ở 10% capacity mà vẫn chậm. Giải pháp rõ ràng: làm cho weights nhỏ hơn. Nhưng làm sao để cắt 75% dữ liệu (16-bit → 4-bit) mà không biến mô hình thành vô dụng?

Ý tưởng cốt lõi

"Aha" moment: Mạng neural không cần 65,536 sắc thái (FP16) để ra quyết định. Chúng hoạt động bằng cách cộng dồn tín hiệu yếu từ hàng tỷ tham số — giống như một cuộc bỏ phiếu với 7 tỷ cử tri. Mỗi cử tri (parameter) chỉ cần 16 mức độ ưu tiên (INT4) thay vì 65,000; sai số của từng người sẽ triệt tiêu lẫn nhau theo Định lý Giới hạn Trung tâm (Central Limit Theorem), miễn là bạn không "bịt miệng" những kẻ có quyền phủ quyết (outliers).

Đây là ba lý do tại sao quantization hoạt động:

1. Phân phối Gaussian của weights: Trọng số sau khi train tập trung quanh 0 với đuôi mỏng. Bạn không cần dải động rộng 16-bit để biểu diện chúng — đa số thông tin nằm trong khoảng [-1, 1]. Quantization không đều (NF4 trong QLoRA) đặt nhiều "bậc thang" hơn gần 0 và ít hơn ở đuôi, tận dụng tối đa 4-bit.

2. Loss landscape phẳng: Quá trình training tìm thấy các điểm cực tiểu rộng (wide minima) — thung lũng nơi dịch chuyển trọng số một chút không làm thay đổi loss đáng kể. Quantization chỉ đơn giản là "nẩy" trọng số lên lưới gần nhất trong thung lũng đó.

3. Outliers là kẻ phá bĩnh: Trong mỗi layer, khoảng 0.1-1% trọng số có độ lớn gấp 10-100 lần các trọng số khác. Đây là những "senator phủ quyết" — nếu bạn làm tròn chúng xuống INT4, bạn không chỉ thêm nhiễu, bạn xóa sổ luôn cả feature detector. Giải pháp là hybrid quantization: giữ outliers ở FP16, nén phần còn lại xuống INT4/INT8 (LLM.int8, AWQ).

Misception phổ biến: "Quantization làm mất thông tin nên chất lượng phải giảm nhiều." Thực tế, quantization là nhiễu có cấu trúc (deterministic noise) mà mạng đã được training để chịu đựng. Giống như bạn có thể nghe hiểu tiếng người qua điện thoại 8-bit (điện thoại cổ điển) mà không cần âm thanh 24-bit studio.

Tại sao nó hoạt động

Cơ chế toán học đằng sau quantization là ánh xạ tuyến tính (linear mapping) từ không gian số thực sang số nguyên:

Q = round(R / S + Z)

Trong đó:

  • R là giá trị FP16 gốc
  • S (scale) và Z (zero-point) là hằng số để ánh xạ range của R vào INT4 [-8, 7] hoặc INT8 [-128, 127]

Nhưng điểm then chốt là group-wise quantization (dùng trong GPTQ, AWQ). Thay vì dùng một scale cho toàn bộ layer (dễ bị outliers phá hoại), ta chia layer thành các nhóm 128 trọng số, mỗi nhóm có scale riêng. Điều này tương tự như điều chỉnh độ phân giải của bản đồ theo từng khu vực — vùng núi chi tiết hơn, vùng đồng bằng thô hơn.

Với KV Cache quantization (KIVI, KVQuant), ta áp dụng quantization bất đối xứng: Keys dùng per-channel (do RoPE rotation), Values dùng per-token (do variance theo vị trí). Kết hợp với Hadamard transform để "trải đều" outlier trước khi nén, tránh hiện tượng softmax collapse.

# Pseudo-code cho INT8 symmetric quantization
scale = max(abs(weight)) / 127
quantized = round(weight / scale)
dequantized = quantized * scale  # Runtime dequantization cho matmul

Ý nghĩa thực tế

MetricFP16INT8INT4 (Q4_K_M)
Llama-3-8B Size16 GB8 GB~4.5 GB
Llama-3-70B Size140 GB70 GB~40 GB
Perplexity Loss0%< 1%< 2%
Inference Speed1x1.5-2x2-3x
MMLU AccuracyBaseline-0.5%-2-3%
HumanEval (Code)Baseline-1%-8%

Impact thực tế:

  • Consumer AI: Bạn có thể chạy Mistral 7B trên iPhone 15 Pro (RAM 8GB) với llama.cpp, mang LLM vào túi quần.
  • Cost reduction: OpenAI và Anthropic chạy INT8/FP8 trong production để giảm 50% chi phí inference.
  • Long context: KV cache INT4 giúp mở rộng context window lên 10M tokens trên cùng phần cứng (KVQuant).

Các giới hạn:

  • Code generation: INT4 thường làm giảm hiệu suất trên HumanEval (code syntax cần độ chính xác cao hơn ngôn ngữ tự nhiên).
  • Calibration data: Post-training quantization (GPTQ/AWQ) cần ~100-1000 samples đại diện để tính scale — không phải zero-shot.
  • KV cache vẫn lớn: Quantization chủ yếu nén weights; KV cache ở FP16 vẫn là bottleneck cho context dài (cần KV Cache Quantization riêng biệt).

Đào sâu hơn

Paper gốc:

Bài liên quan TroiSinh:

Cùng cụm (Quantization):

  • GPTQ — Dùng Hessian để xác định trọng số nào quan trọng khi làm tròn, giảm thiểu lỗi tích lũy qua các layer.
  • AWQ — Nhìn vào activation thay vì chỉ weights, bảo vệ các channel có activation lớn khỏi quantization error.
  • GGUF & llama.cpp — Format file và runtime để chạy 70B trên laptop bằng 4-bit packing.

Đọc tiếp:

  • TurboQuant — Xoay ngẫu nhiên trước khi quantize để đạt 3-bit KV cache không mất accuracy (Level 2).
  • KV Cache — Hiểu cách cache hoạt động để thấy tại sao nén KV lại quan trọng cho long-context inference.

Mở rộng:

On this page