系列:社区跟踪手记

vLLM & SGLang 社区跟踪 · 2026-08-07:KV 缓存复用进入「组合正确性」阶段(HiCache / Mooncake 原理与架构)

★ 今日最值得关注

SGLang #30393「HiCache 支持 packed / sidecar 草稿缓存」——它不是性能优化,而是一次隐性正确性缺陷的披露。 凡是同时开了分层 KV 缓存(HiCache L2/L3)与投机解码(MTP / EAGLE / DSpark)的生产环境,此前都可能在「缓存命中率完全正常」的情况下,因草稿侧状态未被恢复而白白损失一截接受长度——指标不报警、日志不报错、只是吞吐上不去。今天就能做的事:对比升级 main 前后的 accept_length。

次选关注:SGLang #28836(torch 2.13 大升级,提前排期) 与 vLLM #49206(PRIORITY 调度静默丢请求,正确性级修复)。

一、版本基线(三方均无新 tag)

对象最新稳定版发布时间上一版
vLLMv0.26.02026-07-27v0.25.1(07-14)
SGLangv0.5.162026-07-25v0.5.15.post1(07-14)
阶跃 StepStep-3.7-Flash / 3.5-Flash仓库推送停 06-01 / 04-03—

本期动态全部来自 main 分支:vLLM 100+ commits、SGLang 100+ commits(48h 跑满单页上限)。

二、本期主线:KV 缓存复用进入「组合正确性」阶段

过去一年,前缀缓存 / KV 卸载的竞赛主题是命中率——能省多少重算。本期两家在同一窗口暴露并修掉了同一类问题:缓存复用与其他特性正交组合时会「静默出错」。

一句话:缓存不再是「显存里一块 buffer」,而是一套要和投机解码、PD 分离、多租户同时正确共存的存储系统。

三、🔬 原理深度:HiCache 与 Mooncake 是什么、怎么演进

3.1 HiCache —— SGLang 的分层 KV 缓存

定位:把 KV cache 从「显存内一块 buffer」扩展成跨层级存储——L1=GPU 显存、L2=主机内存、L3=远端存储(如对象存储 / 分布式 KV 池)。命中层级越低,省的重算越多;跨节点复用前缀时,L2/L3 让多副本部署不必各自重算长系统提示词。

核心结构:前缀匹配在 radix tree 上按 token 序列做——判定依据是「目标模型的 KV 是否可用」。缓存以「主机池(host pool)」为单位在 L2/L3 间整体搬运。

本期关键演进(#30393):投机解码引入了第二套状态机,HiCache 此前只搬运目标池,导致草稿侧状态缺失。本 PR 给出两条集成路径:

路径适用拓扑主机池布局
Packed(打包)标准 NextN MTP/EAGLE:DeepSeek-V3.2/V4、GLM-5.x、MiMo-V2.5;含 DeepSeek-V4 DSpark草稿 KV / indexer / SWA 缓冲追加到目标主机池尾部层,同槽位、同一次 HiCache 操作搬运
Sidecar(挎斗)独立 EAGLE/EAGLE3、DFlash、非 DeepSeek-V4 的 DSpark仅为非空草稿状态建独立 DRAFT / DRAFT_INDEXER / DRAFT_SWA 池,索引由目标 KV/SWA 派生,挂到同一次 L2/L3 操作

约束:草稿缓存的索引空间必须能从目标缓存索引空间派生,否则一次搬运无法对齐两边。Packed 用于「草稿层就是目标模型多出来的几层」;Sidecar 用于结构上独立的草稿模型(层数/维度对不上)。只为非空草稿状态建 sidecar——不开投机时零开销。

3.2 Mooncake —— 分布式 KV 存储(vLLM 侧主推)

定位:Mooncake 是 vLLM 的 KV 连接器(KV connector) 生态里的分布式 KV 存储标准件,把 KV cache 托管到独立集群,让多个 vLLM 部署共享一套前缀缓存,实现 PD 分离与跨部署复用。

本期关键演进(#48069 / #44956):补齐多租户与分组语义。

部署影响:共用一套 Mooncake 集群跑多套 vLLM(多业务线 / 多环境)终于有官方隔离手段,此前只能靠 key 前缀土办法。#51067 进一步把 Docker 改用 Mooncake 官方 wheel 而非自建构建——Mooncake 已从「某个连接器实现」变成两大框架共同依赖的标准件,这是生态收敛信号。

3.3 为什么「分层缓存 × 投机解码」会静默掉性能

一次「前缀命中」在指标上是布尔的。但在投机解码系统里,命中其实有两种质量:

残缺命中不会报错、不会降命中率指标,只会让接受长度悄悄变短,最后表现为「缓存命中率很高,但吞吐没涨」。

投机解码到底缓存了什么(第二套状态机):

这些在 SGLang 里放在与目标 KV 分离的设备池。HiCache 做 L2/L3 分层时若只搬目标池,草稿池要么没备份、要么恢复回来时 slot 映射对不上。前缀匹配按目标 KV 判定「这段算过」→ 跳过 prefill 直接 decode → 草稿模型拿空/错位的草稿 KV 提议 → 大量被拒 → accept_length 从 45 掉到 12,cache_hit_rate 漂亮但 TPS 原地踏步。没有任何日志告诉你哪里错了。

同一天、同一类 bug 的另两个版本:

可迁移的判断:特性矩阵已大到无法穷举组合测试(前缀缓存 × 分层存储 × 投机解码 × PD 分离 × 混合架构 × 异构 TP)。这类 bug 共同形态是「A 模块的隐含假设被 B 模块打破,且系统没有断言去检查」。对使用方:不要假设两个特性都标了 stable 一起开就没事;每引入一个新特性,都把 accept_length、cached_tokens、TTFT 做一次前后对比,而不只是看有没有报错。

四、🟢 vLLM 要点(main 08-05 ~ 08-07)

五、🟠 SGLang 要点(main 08-05 ~ 08-07)

六、🇨🇳 阶跃星辰 Step:MTP 主线仍卡在 open PR

vLLM #49642(仍 open,+18/−5,两周未合):Step3p5AMultiTokenPredictor 在 range(num_hidden_layers, num_hidden_layers + num_nextn_predict_layers) 上构造草稿块,即 MTP 层 layer_idx == num_hidden_layers,比基础解码层多一位;而 step3p5.py 若干按层查表的配置(layer_types / rope_theta / use_rope_layers / partial_rotary_factors / swiglu_limits)都是长度 num_hidden_layers 的列表且无越界检查 → 在 Step-3.7-Flash 上加 --speculative-config '{"method":"mtp"}' 直接 IndexError 起不来。修法:对每处按 layer_idx 查表加边界判断,越界草稿层退回标准默认。

为什么重要:Step-3.7-Flash 三大卖点是「混合滑窗注意力 + MTP 自带草稿 + 稀疏 MoE(196B 总参 / 11B 激活)」,MTP 恰恰是官方宣传吞吐的关键,却在 vLLM 主线上开不起来。同一窗口内 vLLM 给蚂蚁 Ling 3.0 Flash 一次性合入「BF16 + MTP + parser」全套。差距不在模型能力,在上游维护投入。

行动建议:① 现在跑 Step-3.7-Flash 先别开 MTP,或自行 cherry-pick #49642;② 要 MTP 收益短期用 SGLang 路线(--reasoning-parser step3p5 --tool-call-parser step3p5 + NVFP4)更稳。

七、⚖️ 横向对比

维度vLLMSGLang
KV 复用主攻外部存储生态:Mooncake 租户/分组语义/官方 wheel、块内尾部细粒度复用内部层级耦合:HiCache 打通投机草稿状态 + 可观测性增强
多模态提速拆物理拓扑:E/P/D 分离消灭重复变换、预处理上 GPU(1.9~8.6×)换执行语言:整条视觉管线纯 Rust、worker pool + rid sidecar 零拷贝
对 Python 态度保留回退与 transformers 兼容路径,广度优先不支持即启动失败、不留回退,确定性优先
依赖节奏FlashAttention 转 torch stable ABI,渐进解耦torch 2.11→2.13 一次性大升,激进跟进
产品边界聚焦 LLM/VLM 服务,前端 Rust 化 + 调度治理向扩散模型大幅扩张(FLUX/ERNIE-Image/Ideogram/Z-Image + dp-size)
Step 适配官方 recipe 完备,但 MTP 开不起来(#49642 open)NVFP4 + trtllm_mha + 双 parser 可用,社区活跃度停 07-06

一句话对照:本期两家解决同一个问题的两半——「请求进 GPU 之前和缓存出显存之后的那段路」。vLLM 手法是重新切分物理资源(encoder 拆独立节点、预处理上 GPU、KV 托给外部多租户存储);SGLang 手法是重写执行载体(管线搬进 Rust、草稿状态纳入分层缓存、PD 传输对齐网格)。选型:要广度、快速接新模型选 vLLM;要尾延迟确定性、且扛得住 torch 2.13 大升级节奏,选 SGLang。

数据来源:GitHub API 直查 vLLM / SGLang releases、main commits、指定 PR(#30393 / #30545 / #28836 / #48069 / #44956 / #50507 / #49206 / #51045 / #49642 等)。性能数字与增删行数均取自官方仓库与 PR 描述原文;判断与选型建议为分析观点,请结合自身负载实测。

觉得有用?欢迎点赞、收藏,或请作者喝咖啡 ☕️

支付宝收款码

支付宝

微信收款码

微信

💬 留言

评论由 Giscus 驱动(基于 GitHub Discussions)。 当前仓库 NaphJohn/LLM-blog 尚未启用 Discussions:请在 GitHub 仓库 Settings → General → Features 勾选 Discussions 后刷新本页,评论区即自动显示。