vLLM 針對長文本工作負載的解碼上下文並行 (Decode Context Parallelism) 技術
TL;DR
vLLM 已實作了解碼上下文並行 (Decode Context Parallelism, DCP),這是一種沿著序列維度而非僅僅透過注意力頭 (attention head) 來切分 KV cache 的技術。這能防止在 Grouped-Query Attention (GQA) 和 Multi-head Latent Attention (MLA) 模型中發生 KV cache 重複,從而顯著提升長文本推理時的請求併發量與吞吐量。
長文本推理中的記憶體牆問題
標準的張量並行 (Tensor Parallelism, TP) 是透過注意力頭來切分 KV cache。當 GPU 數量超過 KV heads 的數量時,這種方法會造成記憶體瓶頸,因為系統必須在多個 GPU 之間重複複製 KV cache。
- Grouped-Query Attention (GQA): TP 只能將 KV cache 切分到每個 GPU 只有一個 head。一旦 TP 超過 KV heads 的數量,cache 就會被重複複製。
- Multi-head Latent Attention (MLA): MLA 將 KV 壓縮成一個在所有 query heads 之間共享的單一低秩潛在向量 (low-rank latent vector)。由於它實際上只有一個 KV head,潛在 KV cache 會在每個 TP rank 中完整地被複製,這嚴重限制了可用於併發請求的 GPU 記憶體。
這種重複複製會消耗關鍵的 GPU 記憶體,限制了併發請求的數量,並增加了每個 token 的成本。
解碼上下文並行 (DCP) 原理解析
解碼上下文並行 (DCP) 透過沿著序列 (context) 維度在 GPU 之間切分 KV cache,從而解決了記憶體瓶頸。與其讓每個 GPU 持有整個序列中特定 head 的完整 cache 副本,不如讓每個 GPU 負責同一個序列中一段 token 位置的區塊。
例如,在一個 200K-token 的請求中,使用 DCP 的四個 GPU 可能會將工作負載切分,使得 GPU 0 持有 tokens 0–50K,GPU 1 持有 50K–100K,依此類推。
DCP 執行流程
DCP 遵循特定的通訊協調節奏,以在解碼階段維持正確性:
- AllGather Q: 由於注意力機制需要完整的 query vector,因此會透過 all-gather 操作在每個 GPU 上組裝出完整的 query 副本。 (對於 MLA 模型,可以透過
VLLM_DCP_Q_REPLICATE=1在載入時複製 query projections 來進行優化)。 - Compute: 每個 GPU 在其本地的 KV cache 切片 (slice) 與收集到的 query 之間進行注意力計算。
- AllGather + ReduceScatter: 部分結果與 Log-Sum-Exp (LSE) 值會透過 AllGather 進行共享。LSE 值用於透過 online-softmax 技巧來重新加權並合併部分結果,而 ReduceScatter 則在加總它們的同時,僅將相關的 head-slice 返回給每個 GPU。
性能基準測試
vLLM 使用 Kimi K2.6 在 NVFP4 格式下,於一個 8×B200 節點上測試了 DCP 與基準 TP 部署的對比,並使用了具有中位數輸入約 67k tokens 的 agentic 長文本追蹤數據。
吞吐量與併發量
DCP 與基準 TP 相比,能維持顯著更高的併發量與吞吐量:
- Baseline TP: 在併發量為 64 時達到 100% 記憶體使用率,吞吐量在接近 1,863 tok/s/GPU 時達到平台期。
- DCP: 規模擴展至併發量 512,在僅使用 82% KV 記憶體的情況下,達到 6,091 tok/s/GPU。
跨序列長度穩定性
即使在上下文長度增加時,性能表現依然穩定。在 200k+ token 範圍內,DCP 維持了高吞吐量與互動性的邊界,而重複 KV 的基準方案則經常因記憶體不足而失敗,無法擴展。
實作與使用方法
DCP 可透過 --decode-context-parallel-size 參數來啟用。
Multi-head Latent Attention (MLA) 後端
用於 DeepSeek-V2, V3, R1, 以及 Kimi K2.6 等模型。由於 MLA 實際上只有一個 KV head,序列可以切分到完整的 TP 程度。
- 限制條件:
tensor_parallel_size >= decode_context_parallel_size且tensor_parallel_size % decode_context_parallel_size == 0。
Grouped-Query Attention (GQA) 後端
用於 Qwen3-235B 與 Llama 系列模型。TP 首先按 KV heads 切分;接著 DCP 會切分剩餘的冗餘副本。
- 限制條件:
(tensor_parallel_size // num_key_value_heads) >= decode_context_parallel_size且(tensor_parallel_size // num_key_value_heads) % decode_context_parallel_size == 0。
未來發展藍圖
vLLM 計畫透過以下開發項目來擴展 DCP:
- 更細粒度的並行化: 對 TP 與 DCP 大小的更精確控制,以減少過度配置。
- 通訊核心 (Communication Kernels): 為單節點與多節點設定開發更好的 all-to-all (A2A) kernels,以提升計算重疊 (compute overlap)。
- Speculative Decoding: 整合 DCP 與 MTP 與投機解碼 (speculative decoding) 以維持延遲優勢。
- Disaggregated Serving: 加強對 prefill/decode (P/D) 分離式服務 (disaggregation) 的支援。
- 擴展模型支援: 擴展支援至 GLM-5.2, Kimi K3,並開發 Prefill Context Parallelism (PCP)。
Sources
相關
- Dispatch
- 專案
- Dispatch
- 專案
- Dispatch