Quantization là giảm độ chính xác biểu diễn của trọng số (và có thể cả activation) để tiết kiệm bộ nhớ và chạy nhanh hơn, đổi lại mất một ít chất lượng.
Các mức thường gặp:
- FP32 — độ chính xác lúc train, gần như không dùng để phục vụ vì quá tốn.
- BF16 / FP16 — chuẩn phổ biến hiện nay: một nửa bộ nhớ so với FP32, và nhanh gấp đôi trên GPU có Tensor Core. BF16 có dải giá trị rộng như FP32 nên ổn định hơn FP16, ít bị tràn số.
- INT8 — nhỏ bằng một phần tư FP32, chất lượng chỉ giảm chút ít nếu quantize đúng cách.
- INT4 — nhỏ bằng một phần tám. Mất chất lượng rõ hơn nhưng chấp nhận được với model đủ lớn.
Vì sao đáng làm — lấy model 70B làm ví dụ: FP16 cần ~140GB nên phải chia qua nhiều GPU; INT8 còn ~70GB là vừa một card 80GB; INT4 còn ~35GB, chạy được trên card phổ thông. Lượng tử hoá không chỉ tiết kiệm tiền, nó đổi hẳn loại phần cứng cần dùng.
Còn một cái lợi ít người nhắc: pha decode nghẽn ở băng thông bộ nhớ, mà trọng số nhỏ đi thì mỗi token phải đọc ít byte hơn — nên quantize còn làm sinh token nhanh hơn, không chỉ giúp model vừa với VRAM.
Cách quantize:
- Sau huấn luyện (PTQ) — cách dùng thực tế trong hầu hết trường hợp: lấy model đã train rồi nén, chỉ cần một tập hiệu chuẩn nhỏ. GPTQ tối ưu theo từng layer, AWQ giữ độ chính xác cao cho những trọng số quan trọng, GGUF là định dạng dùng cho CPU và máy Apple.
- Huấn luyện có mô phỏng lượng tử hoá (QAT) — chất lượng cao nhất nhưng phải train lại, nên hiếm khi đáng.
- Mixed precision — giữ các layer nhạy cảm ở mức cao, phần còn lại nén sâu.
Quy tắc: model càng lớn càng chịu được nén sâu. Dưới ~3B thì tránh INT4 vì chất lượng tụt mạnh. Và luôn đánh giá lại trên chính tác vụ của mình sau khi nén — điểm benchmark chung thường không đổi mấy trong khi tác vụ hẹp lại hỏng rõ.
Công cụ: bitsandbytes để thử nhanh, vLLM kèm GPTQ/AWQ cho production, llama.cpp cho CPU và thiết bị edge.