vLLM GLM 5.3 優化:混合 HiSparse 離線處理

vLLM 引入了混合 HiSparse 離線處理,使 GLM 5.3 的服務更快速且更具成本效益。此優化讓 GLM 5.3 可在單一 8x H200 節點上以完整的 100 萬上下文長度運行——這在以往的硬體上是不可能實現的——同時大幅提高各種上下文長度下的併發性。

解決 KV 快取記憶體壓力

代理工作負載通常涉及許多並行請求,且上下文長度不斷增長。由於 GPU 塊池大小固定,KV 快取最終會耗盡可用記憶體,迫使選擇兩種傳統方法之一:

  • 中斷:請求的 KV 快取被捨棄,稍後必須重新預填充,導致完整的首次令牌時間(TTFT)懲罰。
  • 離線處理:KV 塊被移至主機記憶體,但密集注意力需要所有令牌都保留在 GPU 上才能運行,因此併發性受限於 GPU 的記憶體容量。

混合 HiSparse 透過利用 GLM 5.3 的稀疏-MLA(多頭潛在注意力)KV 快取解決此問題。在稀疏-MLA 中,索引器僅選擇頂 K 個令牌進行注意力運算。HiSparse 將所有 KV 快取離線至 CPU,僅保留這些選中的令牌。

混合 HiSparse 進一步優化:只要記憶體容量允許,便將 KV 快取保留在 GPU 上。僅在系統面臨 KV 快取壓力時才觸發離線處理。此方法最小化 CPU-GPU 記憶體傳輸,僅在高併發期間支付成本。

混合 HiSparse 的技術實作

混合 HiSparse 透過 vLLM 的混合記憶體分配器(HMA)使用共享 GPU 塊池來管理駐留狀態。它根據記憶體壓力追蹤每頁的駐留狀態,將請求分為三種狀態:

  1. 完全駐留:所有稀疏-MLA KV 仍保留在 GPU 上,已完成的前綴頁則主動複製到主機記憶體。
  2. 混合駐留:請求尾部仍留在 GPU 上,但較舊的頁面位於 CPU 記憶體中。索引器所需的行儲存在 GPU 上的「熱緩衝區」中。融合核心處理頂 K 解決方案:原地讀取駐留的令牌,讀取熱令牌並更新其 LRU 條目,或在未命中時將單一行從固定主機記憶體複製到 LRU 條目中。
  3. 無駐留:對於僅在 CPU 記憶體中存在前綴的請求,系統從占位符和熱頁開始,僅在索引器選中時才載入行。

關鍵架構細節

  • 熱緩衝區:這些並非獨立配置,而是從 HMA 儲存池租用的普通 KV 快取塊。預設為每請求 2 倍頂 K 行,以在最小尺寸下維持高命中率。
  • 主動複製:為準備壓力,HiSparse 在頁面仍由 GPU 提供服務時,便將已完成的前綴頁排隊複製到 CPU 記憶體。這使得壓力到來時,GPU 條目可立即釋放,無需再次複製。
  • 輕量執行hisparse-glm 分支在前向傳播後,以單一啟動方式一次性複製所有稀疏-MLA 層,並依模型的 GPU 流順序排列,以簡化同步。

與 vLLM 堆疊的整合

混合 HiSparse 作為共享 HMA 儲存池上的駐留策略運作。它與現有的 vLLM 機制整合,不干擾其他元件:

  • 前綴快取:其他快取群組繼續使用標準前綴快取和離線處理。
  • 索引器 KV:索引器 KV 由標準 OffloadingConnector 獨立處理,使用塊級儲存。
  • P/D 分離:若前綴無法適應駐留記憶體,來自預填/解碼分離的匯入可落在主機端。
  • 預測解碼:透過每步可重播的解析計畫運作,共享請求的熱狀態。

性能基準測試

vLLM 在 8x H200 GPU 上使用 OpenHands 多回合代理工作負載(13 回合對話,第一回合 74,160 令牌,後續回合 753 令牌,輸出 220 令牌)對 GLM 5.3 進行基準測試。配置使用 MTP3、FP8 KV 快取,以及 142K 接入限制。

將混合 HiSparse(384 GiB HiSparse 儲存池與 128 GiB 離線處理儲存池)與標準離線處理基線(512 GiB 離線處理儲存池)比較,混合 HiSparse 展現出更優的互動性-吞吐量帕累托曲線,以及更高的平均併發執行請求數。

可用性與設定

混合 HiSparse 計畫於 vLLM v0.30 中廣泛可用。目前僅支援 NVIDIA GPU。如需當前重現,需使用 hisparse-glm 分支(提交 e8ef1e07bd)。

啟用混合 HiSparse 的設定如下,於 vllm serve 命令中使用:

--attention-config '{"hisparse_config":{"host_pool_gib":384}}'
--kv-transfer-config '{"kv_connector":"OffloadingConnector","kv_role":"kv_both","kv_connector_extra_config":{"spec_name":"TieringOffloadingSpec","cpu_bytes_to_use":137438953472}}'

Sources