vLLM FP8 KV-Cache 與 Attention 量化更新

vLLM FP8 KV-Cache 與 Attention 量化更新

vLLM 已針對 FP8 KV-cache 與 attention 量化實施了關鍵修復與優化,能夠顯著降低長文本 LLM 服務的記憶體使用量與 token 間延遲 (ITL)。透過使用 --kv-cache-dtype fp8 旗標,使用者可以將 KV-cache 儲存空間減半,並以 FP8 (e4m3) 進行 attention 計算,這對於受記憶體限制的解碼工作負載特別有效。

技術改進與錯誤修復

vLLM 的最新更新解決了在 Hopper 與 Blackwell GPU 上進行壓力測試時發現的關鍵準確度與效能退化問題。

用於提升準確度的兩層累加 (Two-Level Accumulation)

為了修復 Hopper GPU 上嚴重的準確度退化問題——在 128k needle-in-a-haystack 任務中,準確度從 91% (BF16) 降至 13% (FP8)——vLLM 引入了兩層累加策略。這種方法將部分累加結果寫入實際的 FP32 暫存器中,以減輕當收縮維度達到 100k 或更多時 Tensor Cores 的精度損失。此修復將準確度恢復至 89%。

混合 Attention 與層跳過 (Layer Skipping)

對於具有混合 attention 架構的模型(例如 GPT-OSS),其中某些層使用小窗口(例如 128 tokens)的 sliding-window attention,FP8 量化的開銷往往超過了記憶體帶來的效益。vLLM 現在包含了 --kv-cache-dtype-skip-layers sliding_window 旗標,允許這些特定層保持在 BF16 以提高解碼速度。

Kernel 與融合 (Fusion) 優化

  • Per-Head Scales: Flash Attention 3 (FA3) kernel 現在支援 FP8 量化的 scale 陣列,每個 scale 對應一個 KV-head。
  • Query Quant化融合: Query 量化已移至 torch.compile 可以進行融合的 torch 實作中,消除了固定的 per-token 開銷。
  • Tiling 配置: 針對 head_dim = 64head_dim = 128 的 prefill tiling 進行了調整,以減少由兩層累加引起的暫存器溢出 (register spills)。

效能基準測試

將 KV-cache 從 BF16 量化為 FP8 可將每個 attention 步驟的記憶體傳輸減半,這直接降低了 ITL 斜率(延遲隨輸入長度增加的速率)。

單請求延遲

在 H100 GPU 上使用 Llama-3.1-8B 時,ITL 斜率從 4.37e-05 降至 2.37e-05 ms/token(降低了 54%),使解碼盈虧平衡點降至約 7k tokens。對於 gpt-oss-20b,使用 skip-SW 變體將 ITL 斜率降低至 BF16 基準值的 71%。

高負載下的吞吐量

在高負載情境下(並發 8,約 20k 輸入 tokens),FP8 提供了以下增益:

  • Llama-3.1-8B: 輸出吞吐量提高 14.9%,總執行時間縮短 13.0%。
  • gpt-oss-20b: 輸出吞吐量提高 4.8%(使用 skip-SW 變體)。

特定架構結果

  • Blackwell (B200): 使用 FlashInfer backend,Llama-3.1-8B 的 ITL 斜率降至 BF16 的 54%,盈虧平衡點約為 4k tokens。Blackwell 不需要兩層累加,因為 Hopper 中發現的精度問題在 Blackwell 上並不存在。
  • 具有大 Head Dimensions 的 Hopper (H100): 對於 head_dim = 256 的模型(例如 gemma-4-E2B),由於兩層累加增加了暫存器壓力,prefill 效能 (TTFT) 比 BF16 慢(在長文本下約慢 1.6 倍)。

準確度與驗證

評估是使用未校準的量化 scale (scale = 1.0) 進行的,以建立效能下限。

推理與長文本任務

  • 推理: 在 Qwen3-30B-A3B-Thinking-2507 與 Qwen3.5-27B 上,FP8 KV-cache 與 attention 量化導致的準確度損失微乎其微,通常在 0 到 2 點之間。
  • 長文本 (MRCR): Llama-3.3-70B-Instruct 恢復了基準 AUC@128k 的 97-98%。Qwen3.5-27B 完全恢復了聚合 AUC@1M 指標,展現了即使在極端上下文長度下的穩定性。

何時使用校準 (Calibration)

雖然未校準的 FP8 通常已足夠,但某些模型會表現出系統性退化。例如,使用 FlashMLA backend 的 Kimi-K2.5 在不同序列長度下顯示出持續下降的準確度。在這種情況下,vLLM 支援透過 llm-compressor 或每個 attention-head 的量化 scale 進行 scale 校準。

使用建議摘要

情境 建議
解碼密集型、受記憶體限制的工作負載 使用 --kv-cache-dtype fp8
混合 attention 模型 使用 --kv-cache-dtype fp8 --kv-cache-dtype-skip-layers sliding_window
短文本 (< 7k tokens) 堅持使用 BF16 以避免微小的 FP8 固定開銷
head_dim = 256 且以 prefill 為優先 堅持使用 BF16 或禁用兩層累加(需要進行準確度驗證)
持續的準確度損失 (< 95%) 使用 llm-compressor 進行校準

Sources