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 进一步优化:只要 GPU 上仍有容量,就尽可能将 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 多轮代理工作负载对 GLM 5.3 进行了基准测试(13 轮对话,第一轮 74,160 标记,后续轮次 753 标记,输出 220 标记)。配置使用 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