Lượng hóa, chuyên sâu
Lượng hóa co trọng số từ số thực 16-bit xuống ít bit hơn, đánh đổi một chút chất lượng lấy nhiều bộ nhớ. Bản một-dòng (Q8 ≈ không tổn thất, Q4_K_M ≈ điểm ngọt, dưới Q3 là đau) đủ để chạy. Trang này xuống thêm một tầng: các nhãn thực sự làm gì, K-quant và I-quant khác nhau ra sao, và tổn thất chất lượng lộ mặt ở đâu trước.
Vì sao 4-bit lại chạy được
Trọng số đã huấn luyện không phải nhiễu đều. Giá trị trong mỗi tensor cụm lại trong một phân phối hẹp, hình chuông đại khái, và hành vi của mạng được mang bởi hình dáng phân phối đó — không phải chữ số thập phân cuối của một trọng số nào. Điều đó khiến trọng số nén được: lưu mỗi trọng số như một số nguyên nhỏ cộng một hệ số co giãn dùng chung, và bạn chỉ mất chi tiết mịn.
Một biến cố thực sự: kênh ngoại lệ (outlier). Một phần nhỏ kênh mang kích hoạt lớn hơn phần còn lại rất nhiều. Một thang đo duy nhất cho cả tensor xả toàn bộ dải của mình vào những ngoại lệ ấy và nghiền nát mọi thứ khác thành bùn. Mọi phương án lượng hóa nghiêm túc về bản chất đều là phương án xử lý ngoại lệ — thang đo theo khối, bảo vệ nhận-thức-kích-hoạt (AWQ), hay hiệu chuẩn against dữ liệu thật (imatrix).
Cơ học lượng hóa theo khối
Chiêu cốt lõi: xẻ mỗi tensor thành các khối nhỏ dùng chung một thang đo. Khử lượng hóa một trọng số là một phép nhân duy nhất:
w ≈ s · q # s: thang đo khối, q: số nguyên lưu trữ
Q4_0: khối = 32 trọng số → 1×thang fp16 + 32×số nguyên 4-bit ≈ 4.5 bpw
K-quants: siêu khối = 256 trọng số
1×thang siêu fp16 + 8×thang phụ fp8 + số nguyên ≈ 4.8 bpw
bpw = bit mỗi trọng số, tính cả phụ phí thang đo. Phụ phí đó là lý do không gì đúng 4.0: một trọng số 4-bit bằng nửa byte, và một thang 2-byte rải trên 32 trọng số cộng thêm 0.5 bpw. K-quant phân bổ chi phí bằng thang đo hai cấp — siêu khối 256 trọng số với 8 khối con nhận thang fp8 rẻ — và đáp ở ~4.8 bpw với chất lượng tốt hơn Q4_0 ở kích thước tương đương.
K-quant và các hậu tố _M / _S
Q4_K_M không phải "Q4_K đội mũ" — hậu tố là một hỗn hợp. Bộ lượng hóa nâng các tensor cụ thể lên mức lượng hóa cao hơn trong khi khối lượng chính giữ Q4_K: thường là các phép chiếu attention (wv, wo) và đôi khi bảng embedding token lên Q6_K. Hậu tố xếp hạng hỗn hợp:
_S(small) — ít tensor được nâng nhất, tệp nhỏ nhất_M(medium) — khuyến nghị mặc định, cân bằng kích-thước/chất-lượng tốt nhất_L(large) — nhiều tensor hơn ở độ chính xác cao hơn, lợi ích giảm dần
Hỗn hợp tồn tại vì các tầng suy hao không đều: phép chiếu attention và embedding nhạy cảm hơn các ma trận feed-forward to béo. Vài trăm MB thừa ở đó mua chất lượng thật — đó là lý do _M là mặc định của cộng đồng thay vì Q4_K trơn.
I-quant: hiệu chuẩn, nhỏ hơn, chậm trên CPU
Các mức IQ (IQ4_XS, IQ3_XXS, IQ2_XS…) thêm một bước hiệu chuẩn. Đầu tiên tính ma trận tầm quan trọng (imatrix) bằng cách chạy mô hình trên một mẫu văn bản đại diện; rồi đặt các mức lượng hóa ở nơi những trọng số quan trọng thực sự sống. Mối lợi: cùng chất lượng với kích thước nhỏ hơn K-quant tương đương — IQ4_XS hạ Q4_K_S ở chất lượng bằng-hoặc-tốt-hơn, và IQ2/IQ3 khiến mô hình 7–8B dưới 3 GB thành hiện thực.
Cái giá là tốc độ decode. Khử lượng hóa I-quant không phải một phép nhân đơn giản — nó cần tra bảng lũy-thừa-không-của-hai và tái dựng có cấu trúc. Trên CPU phần toán thừa ấy hiện rõ trong token/giây; trên GPU nó nấp sau độ trễ bộ nhớ và gần như miễn phí. Quy tắc ngón tay: K-quant cho máy CPU, I-quant ổn trên GPU, IQ2/IQ3 chỉ khi VRAM bóp tay bạn.
Bậc thang chất lượng, thật thà
Kích thước tệp xấp xỉ cho mô hình 7–8B. Tỉ lệ thẳng theo tham số — 14B khoảng gấp đôi:
| Mức | Kích thước | bpw | Ghi chú chất lượng thật thà |
|---|---|---|---|
| Q8_0 | 8.5 GB | 8.5 | trong suốt; sống sót qua A/B mù với FP16 |
| Q6_K | 6.6 GB | 6.6 | gần trong suốt; điểm dừng cuối trước chứng hoang tưởng |
| Q5_K_M | 5.7 GB | 5.7 | tổn thất nhẹ, khó nhận ra trong chat |
| Q4_K_M | 4.9 GB | 4.8 | điểm ngọt; giảm benchmark vài phần trăm đơn vị |
| IQ4_XS | 4.5 GB | 4.25 | chất lượng ≈ Q4_K_S, nhỏ hơn; ưu tiên trên GPU |
| Q3_K_M | 3.9 GB | 3.9 | đáng kể trên hồi tưởng sự kiện và toán |
| IQ3_XXS | 3.2 GB | 3.1 | chat trôi chảy, sự thật lắc lư; thực tế chỉ GPU |
| Q2_K | 3.2 GB | 3.4 | cánh cùng — tính cách sống sót, độ chính xác thì không |
Hãy coi các phần trăm chính xác là cấp truyền-thuyết: tổn thất phụ thuộc mô hình, ngôn ngữ và tác vụ. Thứ tự ổn định ngay cả khi độ lớn thì không.
Lượng hóa đau ở đâu trước
Thiệt hại không đều across các khả năng. Đại khái theo thứ tự giảm dần:
- Hồi tưởng sự kiện — tên, ngày tháng, con số trôi trước. Mô hình Q3 quy sai một cách tự tin.
- Toán và suy luận nhiều bước — lỗi nhỏ cộng dồn xuyên chuỗi.
- Mạch lạc ngữ-cảnh-dài — truy xuất từ sâu trong prompt dài chập chờn hơn những gì hành vi prompt-ngắn gợi ý.
- Ngôn ngữ ít tài nguyên — tiếng Hàn suy thoái sớm hơn tiếng Anh ở mức lượng hóa nặng; token tiếng Hàn hiếm hơn khi huấn luyện, nên có ít dư địa chính xác. Nếu tiếng Hàn quan trọng với bạn, giữ Q5+ ở nơi có thể.
- Sự trôi chảy và phong cách chat — gần như không lộ. Mô hình Q2 vẫn nghe ổn, đó là cái bẫy: trôi chảy là proxy tệ cho thiệt hại.
Mô hình nhỏ đau hơn
Lỗi lượng hóa ăn độ dư thừa, và mô hình nhỏ có ít nhất. 70B ở Q4 mất gần như không gì; 3B ở Q4 mất rõ hơn nhiều; dưới ~2B, lượng hóa nặng có thể moi ruột mô hình. Quy tắc thực dụng: Q6_K hoặc Q8_0 cho mọi thứ dưới ~4B tham số — số GB tuyệt đối tiết kiệm được nhờ nghiền mô hình nhỏ dù sao cũng tí hon. Lấy đường cơ sở kích-thước-vs-khả-năng ở tham số trước khi quyết định tiêu bit ở đâu.
KV cache là một quyết định riêng
Lượng hóa trọng số không làm gì KV cache — đó là một dòng bộ nhớ riêng (fp16 mặc định, lượng hóa riêng sang q8_0/q4_0 trong llama.cpp). Ở ngữ cảnh dài cache có thể sánh trọng số về kích thước; hãy ngân sách nó độc lập ở KV cache.
Bậc thang quyết định thực dụng
Ví dụ minh họa — card 12 GB, mô hình dense 8B, ngữ cảnh 8k:
trọng số Q4_K_M 4.9 GB
KV cache 8k token, fp16 1.0 GB (8B GQA ≈ 128 KiB/token)
phụ phí buffer tính toán + ctx ~1.5 GB
─────────────────────────────────────────
tổng ~7.4 GB → vừa còn dư địa
Với toán VRAM, bậc thang:
- Ngân sách: VRAM − ngữ cảnh − phụ phí = phần còn lại cho trọng số.
- Q6_K vừa → chạy Q6_K. Chỉ Q4_K_M vừa → chạy Q4_K_M không áy náy.
- Chỉ hạ xuống IQ4_XS/Q3 để vừa ngữ cảnh hoặc tránh offload CPU — offload tốn tốc độ hơn nhiều so với một bước lượng hóa tốn chất lượng.
- Nếu mô hình mục tiêu không vừa ở Q4, hạ một hạng kích thước thay vì lượng hóa xuống Q2: một 8B chắc ở Q4 thường thắng một 14B bị nghiền trong thực tế.
Liên quan: toán VRAM · KV cache · Tham số · Định dạng mô hình