為什麼本地 LLM 感覺更笨:量化與推論後端的影響

本地 LLM 的效能經常與官方基準測試結果不符,這並非因為基礎模型的智慧不足,而是由於實作上的特定風險累積所致。注意力後端的選擇、KV 快取量化以及權重量化方法等因素,可能導致「token 錯誤」——模型在預測下一個 token 時與參考實作產生分歧——進而在工具呼叫等複雜任務中引發災難性失敗。

推論後端的差異

不同的注意力後端對相同的模型權重可能產生不同的 logits,進而在預填(prefill)階段導致不同的 token 選擇。在使用 RTX PRO 6000 Blackwell GPU 的 Qwen3.6-27B 實驗中,比較了三種 vLLM 注意力後端——FlashAttention 2、Flash Inference 和 Triton Attention——在 100k token 的真實工作流上的表現。

主要發現包括:

  • 位元對位元的相同性: 重複執行相同後端會產生完全相同的 logits,表示差異並非由隨機雜訊造成,而是來自核心函式內的矩陣乘法與加法運算的特定實作方式。
  • 與上下文相關的差異: 不同後端之間的分歧(token 錯誤)以群集形式出現,且依提示內容而異,而非隨上下文長度線性增加。
  • 精度的權衡: 差異的產生是因為不同 CUDA 核心在不同 GPU 家族與 SM 計算能力上對數學運算的實作方式不同。

KV 快取量化的影响

對 KV(Key-Value)快取進行量化會隨著上下文長度增加而顯著降低模型的智慧,特別是影響模型在長序列中維持邏輯的能力。

以 Qwen3.6-27B 測試顯示,雖然 BF16(Brain Floating Point 16)KV 快取保持穩定,但量化引入了關鍵性失敗:

  • INT8 KV 快取: 雖能從部分工具呼叫錯誤中恢復,但顯示出明顯的分歧。
  • INT4 KV 快取: 完全無法正確執行工具呼叫,顯示 KV 快取量化可能導致模型的「智商」在約 40k token 後急劇下降。

權重量化與保真度

並非所有量化方法都相同。權重與激活值的壓縮方式直接影響模型遵循複雜語法與正確關閉工具呼叫的能力。

在 Qwen3.6-27B 的五種變體對比測試中,結果如下:

量化方法 性能觀察
BF16 參考 基準保真度。
INT8 (W8A16) 高保真度;表現優於第一方 FP8 及 NVIDIA 的 FP4 版本。
FP8 (W8A8) 中等保真度;能完成正確的工具呼叫。
AWQ (W4A16) 低保真度;無法正確關閉工具呼叫,且錯誤地處理 Cisco CLI 語法。
NVFP4 最低保真度;在 88k 上下文時達到約 50% 的 token 錯誤,並失敗工具呼叫。

關鍵的是,INT8 (W8A16) 變體表現優異,因其使用 BF16 激活值,並未對 Gated DeltaNet (GDN) 投影進行量化。

量化以外的實作風險

社群見解指出,本地模型感覺「笨」的現象,通常歸因於設定錯誤,而非模型權重本身:

  • 對話模板: 使用錯誤的對話模板(例如,當模型需要特定格式時卻回退至 ChatML)會嚴重降低效能。
  • 取樣設定: 忽略廠商建議的 temperature 與 top-p 設定,可能導致迴圈或無意義輸出。
  • 語法約束: 某些執行器(如 llama.cpp)透過在 token 生成時強制語法約束,來緩解量化所導致的工具呼叫失敗。

「大多數情況下,當本地模型感覺笨,問題不在量化,而在對話模板。許多 gguf 建構版本只是從元資料中丟棄模板,執行時便靜默地回退至 chatml。」

本地推論的最佳實務總結

為最大化本地 LLM 的智慧,使用者應優先考慮以下設定:

  1. 避免 KV 快取量化: 將 KV 快取保持在 BF16,以防止長上下文視窗中的邏輯崩潰。
  2. 優先使用高比特權重: 若 VRAM 允許,使用 Q8 或 BF16 權重;避免在代理任務中使用激進的 4 位量化(如 NVFP4 或 AWQ)。
  3. 驗證對話模板: 確保執行時使用模型 Hugging Face 卡片中明確指定的模板。
  4. 匹配取樣設定: 使用建議的 temperature 與 top-p 值,以避免常見的失敗模式,如輸出迴圈。

Sources

相關