vLLM 使用 DSpark 進行自適應驗證
vLLM 已實作了使用 DSpark 置信度調度驗證(confidence-scheduled verification)的自適應驗證,以優化投機解碼(speculative decoding)。透過使用學習到的置信度頭(confidence head)來評估草擬標記(drafted tokens)的生存機率,vLLM 可以根據系統負載和標記置信度,動態決定每一步要驗證多少個標記,從而消除了手動調整 num_speculative_tokens 的需求。
為高併發優化投機解碼
投機解碼通常是以增加計算量來換取更少的解碼步驟。雖然這在 GPU 記憶體受限(memory-bound)的低批次大小(batch size)情況下是有效率的,但在高併發(例如 batch size 256)的情況下會變得成問題,因為草擬標記會與真實標記競爭計算資源。當接受率下降時——例如在 DeepSeek-V4-Pro-0813 上,一個 7 個標記的區塊中最後一個標記的生存率低於 10% 時——被拒絕的標記會浪費關鍵的計算資源並降低整體吞吐量。
DSpark 置信度調度機制
自適應驗證利用 DSpark 置信度頭來為每個草擬標記分配生存機率。系統透過以下邏輯,藉由最大化單位步進時間內預期產生的標記數量來確定最佳草擬預算(draft budget, $B$):
- Global Top-B Selection: 該調度器會在所有請求中識別出前 $B$ 個最佳草擬位置(draft slots)。由於生存機率會隨著草擬位置的增加而降低,系統只需接受每個請求草擬部分的連續前綴(contiguous prefix)。
- Budget Calculation: 預算 $B$ 是從一個成本模型中推導出來的,該模型在預期額外標記(每個採樣請求一個額外標記加上 $B$ 個最佳位置的生存標記)與分析出的步進成本(非草擬標記 $T$ 與草擬標記 $B$ 的總和)之間取得平衡。
- Execution Pipeline: 預算大小的計算是在 CPU 上進行的,使用的是來自前一步的雙緩衝置信度陣列(double-buffered confidence array)。實際將位置分配給請求的過程是在 GPU 上透過 PyTorch 和
torch.compile(降級為 Triton)執行的,以避免主機與裝置之間的讀回(read-backs)。
技術實作與 CUDA Graphs
為了支援變長驗證,vLLM 整合了 varlen decode CUDA graphs。此實作依賴於以下組件:
- Attention Kernel Support: 系統使用來自 DeepGEMM 的稀疏 MLA 核心(sparse MLA kernels)和變長索引器核心(varlen indexer kernel)來處理變長度。
- Graph Capture: 解碼圖(decode graphs)是以
num_speculative_tokens + 1作為最大查詢長度進行擷取的。單個圖可以服務於每個請求中 1 到num_speculative_tokens + 1個標記的任何混合組合。 - Cost Modeling: 在啟動時,引擎會對虛擬步進進行分析(profile),以建立驗證與草擬成本的查找表(lookup tables)。為了處理分析中的雜訊與核心單元格大小(kernel tile size)的變化,成本曲線被強制設定為單調遞增。
- CUDA Graph Padding: 成本模型考慮了 CUDA graph padding 的「階梯式」效應,其中一個包含 121 個標記的批次可能會產生 128 個標記圖的成本。這鼓勵了預算演算法在 CUDA graph 區域內運行,以實現最大效率。
性能結果
在 DeepSeek-V4-Pro-0813(TP=8,運行於 8×B300 SM100)上的測試顯示,在 1 到 256 的併發掃描中,自適應驗證始終保持在吞吐量與互動性之間的 Pareto 前沿(Pareto frontier)。
該系統在低併發時有效地模擬長固定區塊,在高併發時有效地模擬短固定區塊,無需預先知曉工作負載的形狀,即可同時獲得兩者的優點。
目前的限制
自適應驗證目前具有以下限制:
- Hardware/Backend Requirements: 完整的 varlen decode graphs 需要
AttentionCGSupport.ALWAYS,目前根據 SM100 上的 DSV4 sparse-MLA、sparse-SWA 和 indexer 後端報告。 - Unsupported Features: 此功能不相容於
--enforce-eager模式、LoRA 或流水線並行(pipeline parallelism)。 - Logprobs: 不支援輸出 logprobs,因為驗證過程會在前向傳播後壓縮 logits。
配置與重現
自適應驗證透過 speculative-config JSON 中的 enable_adaptive_verification: true 標記來啟用。為了獲得最佳性能,max_cudagraph_capture_size 應設定為 (num_speculative_tokens + 1) * max_num_seq,以確保驗證批次保持在擷取的圖形中。
Sources
相關
- Dispatch
- Dispatch
- Dispatch
- Dispatch
- Dispatch