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 = 64與head_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 進行校準 |