Bạn có một mô hình ngôn ngữ lớn (LLM) nặng 140 GB ở định dạng FP16. Máy tính của bạn chỉ có 16 GB VRAM. Làm sao chạy được? Câu trả lời nằm ở quantization: Kỹ thuật nén trọng số model từ số thực 16-bit xuống số nguyên 4-bit, giảm kích thước tới 75% mà chất lượng gần như nguyên vẹn. Hãy cùng mổ xẻ ba phương pháp phổ biến nhất hiện nay: GPTQ, AWQ và GGUF.

Ý tưởng cốt lõi: Không phải trọng số nào cũng quan trọng như nhau

Trong một mô hình với hàng tỷ tham số, phần lớn trọng số có giá trị rất nhỏ và ít ảnh hưởng đến đầu ra. Quantization khai thác điều này bằng cách biểu diễn mỗi trọng số chỉ với 4 bit (16 mức giá trị) thay vì 16 bit (65.536 mức). Tưởng tượng bạn đang nén ảnh JPEG: Giảm số mức màu từ 16 triệu xuống 256, mắt thường gần như không thấy khác biệt. Quantization hoạt động tương tự với trọng số AI.

GPTQ: Tối ưu bậc hai với ma trận Hessian

GPTQ (GPT Quantization) xử lý từng lớp (layer) một cách tuần tự. Với mỗi hàng trọng số, thuật toán chọn trọng số tiếp theo cần lượng tử hóa, tính giá trị tối ưu dựa trên sai số tích lũy, rồi điều chỉnh các trọng số chưa xử lý để bù đắp. Điểm then chốt là GPTQ dùng thông tin bậc hai từ ma trận Hessian, nghĩa là nó không chỉ xét giá trị từng trọng số riêng lẻ mà còn xét cách chúng tương tác với nhau. Quá trình này cần một tập dữ liệu hiệu chuẩn (calibration dataset), thường vài trăm mẫu từ WikiText hoặc C4, để tính toán Hessian. Kết quả: Perplexity chỉ tăng khoảng 5,2% so với FP16 gốc (từ 6,56 lên 6,90).

AWQ: Chỉ 1% trọng số quyết định tất cả

AWQ (Activation-Aware Weight Quantization) dựa trên nhận định rằng dưới 1% trọng số là "quan trọng" (salient), ảnh hưởng vượt trội đến chất lượng đầu ra. Thay vì xử lý tất cả trọng số giống nhau, AWQ quan sát giá trị kích hoạt (activation) trong quá trình chạy thử trên tập hiệu chuẩn để xác định những trọng số nào thực sự ảnh hưởng. Những trọng số quan trọng được giữ ở độ chính xác cao hơn hoặc không bị lượng tử hóa, trong khi 99% còn lại bị nén mạnh xuống 4-bit. AWQ còn áp dụng hệ số co giãn (scaling factors) để thu hẹp phạm vi động (dynamic range) trước khi lượng tử hóa, giúp giảm sai số. Perplexity chỉ tăng 4,3% so với FP16 (từ 6,56 lên 6,84), và tốc độ suy luận đạt 741 token/giây với Marlin-AWQ, nhanh hơn cả FP16 gốc.

GGUF: Lượng tử hóa theo khối, linh hoạt trên CPU

GGUF là định dạng được llama.cpp và Ollama sử dụng, tiếp cận theo hướng khác: Chia mô hình thành các khối trọng số, mỗi khối có hệ số co giãn (scale factor) riêng lưu cùng giá trị đã lượng tử hóa. Điều này cho phép phân bổ độ chính xác linh hoạt: Lớp attention nhận nhiều bit hơn, lớp feed-forward nhận ít hơn. GGUF hỗ trợ nhiều mức nén từ Q2_K (cực mạnh) đến Q8_0 (nhẹ), và chạy được trên cả CPU lẫn GPU. Mức Q4_K_M giữ được 92% chất lượng FP16, Q5_K_M đạt 97%, còn Q3_K_M chỉ còn 85%.

Vai trò của tập hiệu chuẩn và lượng tử hóa theo nhóm

Cả GPTQ và AWQ đều dựa vào tập dữ liệu hiệu chuẩn để đo lường ảnh hưởng của việc nén. Dùng dữ liệu hiệu chuẩn chuyên ngành (ví dụ: Dữ liệu y tế cho mô hình y khoa) cho kết quả tốt hơn đáng kể so với dữ liệu mặc định. Về độ phân giải lượng tử hóa, thay vì áp dụng cùng một tỷ lệ nén cho toàn bộ kênh (per-channel), phương pháp hiện đại chia trọng số thành nhóm nhỏ (per-group, thường 128 phần tử mỗi nhóm trong AWQ) để mỗi nhóm có tham số co giãn riêng, giữ được nhiều thông tin hơn.

Khi nào dùng phương pháp nào?

Nếu bạn cần chạy model trên laptop hoặc máy tính cá nhân, GGUF Q4_K_M hoặc Q5_K_M là lựa chọn tốt nhất nhờ hỗ trợ CPU linh hoạt. Với hệ thống phục vụ nhiều người dùng đồng thời, AWQ kết hợp vLLM cho thông lượng cao nhất. GPTQ phù hợp khi bạn cần tùy chỉnh sâu với dữ liệu hiệu chuẩn chuyên biệt. Cả ba phương pháp đều là post-training quantization, nghĩa là bạn không cần huấn luyện lại model, chỉ cần vài giờ xử lý trên GPU là có thể nén model hàng trăm tỷ tham số xuống kích thước chạy được trên phần cứng tiêu dùng.