localaiforum
登入
指南 › 模型與格式

量化深入解析

量化把權重從 16-bit 浮點縮到更少位元,用一點品質換大量記憶體。一行版(Q8 ≈ 無損、Q4_K_M ≈ 甜蜜點、Q3 以下會痛)就足以開跑。這一頁再往下鑽一層:標籤實際做什麼、K-quant 與 I-quant 差在哪、品質損失最先出現在哪。

為什麼 4-bit 行得通

訓練出來的權重不是均勻雜訊。每張張量裡的值群聚在狹窄、大致鐘形的分布中,而網路的行為由那個分布的形狀承載——不是由任何單一權重的小數點最後一位。這讓權重可壓縮:把每個權重存成小整數加共享縮放因子,你只損失細節。

一個真正的複雜點:離群通道。少數通道帶著遠大於其他的激活。整張張量只有一個縮放時,範圍全部花在那些離群值上,把其他一切都壓成泥。每個認真的量化方案本質上都是離群值處理方案——區塊縮放、激活感知保護(AWQ)、或對真實資料校準(imatrix)。

區塊量化機制

核心技巧:把每張張量切成共享同一縮放的小區塊。反量化一個權重是一次乘法:

w ≈ s · q                       # s:區塊縮放,q:儲存的整數

Q4_0:     block = 32 weights → 1×fp16 scale + 32×4-bit ints ≈ 4.5 bpw
K-quants: super-block = 256 weights
          1×fp16 super-scale + 8×fp8 sub-scales + ints ≈ 4.8 bpw

bpw=每權重位元數,含縮放開銷。這個開銷就是沒有東西剛好是 4.0 的原因:4-bit 權重是半個位元組,而 2 位元組的縮放分攤到 32 個權重就多了 0.5 bpw。K-quant 用兩層縮放攤提成本——256 權重的超級區塊,其 8 個子區塊用便宜的 fp8 縮放——以相近大小落在約 4.8 bpw,品質卻勝過 Q4_0。

K-quant 與 _M/_S 字尾

Q4_K_M 不是「戴帽子的 Q4_K」——字尾代表混合。量化器把特定張量升到較高的量化,其餘大隊留在 Q4_K:通常注意力投影(wv、wo),有時還有 token 嵌入表,會升到 Q6_K。字尾為混合排序:

  • _S(small)——升級的張量最少、檔案最小
  • _M(medium)——預設推薦,大小/品質最佳平衡
  • _L(large)——更多張量更高精度,報酬遞減

混合存在是因為各層退化的速度不均:注意力投影與嵌入比大型前饋矩陣更敏感。在那裡多花幾百 MB 買到的是實實在在的品質——這就是社群預設是 _M 而不是純 Q4_K 的原因。

I-quant:有校準、更小、CPU 上慢

IQ 量化(IQ4_XS、IQ3_XXS、IQ2_XS……)多了一道校準。先讓模型跑過一批代表性文字樣本,算出重要性矩陣(imatrix);再把量化層級放在重要權重真正聚集的地方。回報:同等品質下比對應的 K-quant 更小——IQ4_XS 以相等或更好的品質壓過 Q4_K_S,而 IQ2/IQ3 讓 3 GB 以下的 7–8B 模型成為可能。

代價是解碼速度。I-quant 的反量化不是單純乘法——需要非二次冪查表與結構化重建。在 CPU 上那些額外數學會反映在 tokens/sec;在 GPU 上則藏進記憶體延遲背後,幾乎零成本。經驗法則:CPU 機器用 K-quant、GPU 上 I-quant 沒問題、IQ2/IQ3 只在 VRAM 逼你用時才用。

誠實的品質階梯

7–8B 模型的大約檔案大小。大致與參數量線性縮放——14B 約兩倍:

量化 大小 bpw 誠實的品質評語
Q8_0 8.5 GB 8.5 透明;盲測 A/B 撐得住 FP16 對比
Q6_K 6.6 GB 6.6 近乎透明;偏執前的最後一站
Q5_K_M 5.7 GB 5.7 輕微損失,對話中難以察覺
Q4_K_M 4.9 GB 4.8 甜蜜點;基準分數掉低個位數 %
IQ4_XS 4.5 GB 4.25 ≈ Q4_K_S 品質、更小;GPU 上優先
Q3_K_M 3.9 GB 3.9 事實回憶與數學上有感
IQ3_XXS 3.2 GB 3.1 對話流暢、事實不穩;實際上僅限 GPU
Q2_K 3.2 GB 3.4 最後手段——個性還在、精度不在

把確切百分比當民俗傳說等級:損失取決於模型、語言與任務。排序是穩定的,即使幅度不是。

量化先傷到哪裡

傷害不會均勻分布在各項能力上。大致按受害順序:

  1. 事實回憶——人名、日期、數字先漂移。Q3 模型會自信地張冠李戴。
  2. 數學與多步推理——小錯在鏈上複利。
  3. 長上下文連貫性——從長提示詞深處擷取,比短提示詞行為所暗示的更不穩。
  4. 低資源語言——重度量化下韓文比英文更早退化;韓文 token 在訓練中較罕見,精度餘裕較少。如果韓文對你重要,盡量守在 Q5 以上。
  5. 對話流暢度與風格——幾乎看不出來。Q2 模型聽起來仍然很好,這正是陷阱:流暢度是傷害的壞指標。

小模型傷得更重

量化誤差吃的是冗餘,而小模型的冗餘最少。70B 用 Q4 幾乎無損;3B 用 Q4 明顯損更多;2B 以下,重度量化可能把模型掏空。實用規則:4B 參數以下一律 Q6_K 或 Q8_0——把小模型壓得更小省下的絕對 GB 反正微不足道。決定把位元花在哪之前,先到 參數量 拿到大小 vs 能力的基準線。

KV 快取是另一個決定

量化權重對 KV 快取毫無作用——那是另一條記憶體帳(預設 fp16,在 llama.cpp 可另行量化到 q8_0/q4_0)。長上下文時快取大小可與權重匹敵;在 KV 快取 獨立編列它的預算。

實用的決策階梯

實例——12 GB 卡、8B 稠密模型、8k 上下文:

weights    Q4_K_M                 4.9 GB
KV cache   8k tokens, fp16        1.0 GB    (8B GQA ≈ 128 KiB/token)
overhead   compute buffers + ctx  ~1.5 GB
─────────────────────────────────────────
total                             ~7.4 GB  → 裝得下還有剩

有了 VRAM 用量計算,階梯如下:

  1. 預算:VRAM − 上下文 − 開銷 = 權重可用的量。
  2. Q6_K 裝得下 → 跑 Q6_K。只有 Q4_K_M 裝得下 → 跑 Q4_K_M 不必內疚。
  3. 降到 IQ4_XS/Q3 只是為了塞進上下文或避免 CPU 卸載——卸載損失的速度,多於一個量化等級損失的品質。
  4. 如果目標模型 Q4 裝不下,寧可降一個規模級也不要量化到 Q2:扎實的 Q4 8B 實務上通常勝過被壓扁的 14B。

相關章節: VRAM 用量計算 · KV 快取 · 參數量 · 模型格式