菜单

Administrator
发布于 2026-10-30 / 0 阅读
0

从单机 KV Cache 扩容到跨节点共享:SGLang HiCache 与 Mooncake 架构解析

摘要:大模型推理中的 KV Cache 既是计算结果,也是影响首 Token 延迟、吞吐量和显存利用率的关键资源。SGLang HiCache 将前缀缓存组织为 GPU、CPU 与外部存储三级体系;Mooncake 则提供跨节点数据传输和分布式存储能力。两者分别解决缓存管理与分布式基础设施问题,可独立使用,也可组合为跨实例 KV Cache 复用架构。

关键词:SGLang、HiCache、Mooncake、KV Cache、RadixAttention、PD 分离、RDMA、分布式推理

1. 背景:KV Cache 为什么需要分层

大语言模型推理通常包含 Prefill(预填充)与 Decode(逐 Token 解码)两个阶段。Prefill 处理输入上下文,生成注意力计算所需的 KV Cache。对于共享相同 Token 前缀的请求,可以直接复用已经计算过的前缀 KV,避免重复执行相同的 Prefill 计算。

SGLang 的 RadixAttention 通过前缀树组织并复用 GPU 显存中的 KV Cache。但 GPU 显存还要存放模型权重、运行时工作区和活跃请求状态,无法无限保留历史上下文。当多个会话交替运行、长文档被反复查询,或者历史前缀持续增长时,旧 KV 数据可能被驱逐出显存。缺少下层备份时,相同前缀再次出现就需要重新计算。

分层缓存利用更廉价、容量更大的存储介质保留部分计算结果,并在访问时按需恢复。但扩大缓存池容量不等于提高单次请求的最大上下文长度。前者决定可跨请求保留多少 KV 数据;后者仍由模型与推理引擎的上下文限制决定。[1]

2. HiCache:推理实例内部的分层缓存管理

HiCache 是 SGLang 在 RadixAttention 基础上构建的分层 KV Cache 管理机制。典型体系包括三个层级:

层级 典型存储位置 主要职责 特性
L1 GPU 显存 直接参与模型计算、承载热点前缀 延迟最低,容量受显存约束
L2 推理节点 CPU 内存 保存部分历史 KV,供本地恢复 容量更大,但存在 PCIe/NVLink 等搬运开销
L3 外部或分布式存储 扩大缓存范围、支持跨实例复用 容量与共享范围更大,受网络和存储性能影响
                  ┌──────────────────────────┐
                  │       SGLang 实例         │
                  │                          │
请求 Token 前缀 ──→ │  L1:GPU KV Cache       │
                  │            ↕             │
                  │  L2:CPU KV Cache       │
                  └────────────┬─────────────┘
                               ↕
                    L3:外部共享 KV 存储

L1、L2 通常属于具体推理实例的缓存空间;共享 L3 则可以向不同实例提供缓存数据。启用 HiCache 并不要求配置 L3,单机 GPU + CPU 两级缓存也是完整、有效的使用方式。[1][2]

2.1 缓存命中与数据恢复

HiCache 通过前缀树元数据查找请求与历史 KV 数据之间的匹配关系。请求到达后,通常先匹配 L1 和 L2;启用 L3 时,再尝试检索外部缓存。命中的数据需要在 GPU 中可用,未命中的后缀则继续由 Prefill 计算。计算完成后,按照写入策略保留新生成的缓存。[1]

请求进入 → 前缀匹配
             ├─ 命中 L1 → 直接复用 GPU KV
             ├─ 命中 L2 → CPU → GPU → 继续推理
             ├─ 命中 L3 → L3 → 本地缓存/GPU → 继续推理
             └─ 未命中  → 重新 Prefill

缓存匹配要求 Token 前缀一致、KV 表示兼容。模型版本、分词方式、聊天模板或 KV 布局发生变化,都可能影响可复用性。跨实例共享还涉及缓存键、并行切分和元数据的一致性,不能仅凭文本看起来相同就认定 KV 可直接互换。

2.2 写入策略与取舍

HiCache 支持不同的写入策略,常见方式包括:

写入策略 行为 主要收益 主要代价
write_through 尽早向下层备份 提高后续恢复机会 额外写入流量与下层空间占用
write_back 上层逐出时再写入 减少不必要的备份 逐出路径可能承担同步备份延迟
write_through_selective 按热度选择性备份 聚焦高价值前缀 冷前缀可能没有下层副本

不同策略影响缓存存放时间、下层占用、写入带宽与逐出行为,并不改变 KV Cache 的数学内容。实际效果取决于访问局部性和传输性能。[1]

3. Mooncake:面向集群的数据传输与共享存储

Mooncake 是面向大模型分离式推理的通信和存储基础设施。HiCache 负责缓存层级管理,Mooncake 的核心能力则是跨进程、跨节点传输数据,以及将多个节点提供的存储资源组织成共享数据池。[3]

3.1 Mooncake Transfer Engine:传输数据

Transfer Engine 是数据传输组件,可在注册的内存区域之间执行异步批量读写。典型应用是在 Prefill 与 Decode 实例之间传输 KV 块。支持的传输路径取决于部署环境及版本,包括 RDMA、TCP、共享内存和部分加速器或存储互连方式;Mooncake 不等同于单一 RDMA 协议。[3][4]

┌────────────────┐       KV 数据传输       ┌────────────────┐
│ Prefill 实例   │ ─────────────────────→ │ Decode 实例    │
│ 计算输入上下文 │    Transfer Engine     │ 继续生成 Token │
└────────────────┘                         └────────────────┘

这里的核心目标是让不同计算阶段可以独立扩展和调度。只有 Transfer Engine,并不意味着自动拥有一个可长期查询、跨实例共享的 L3 KV 存储池。

3.2 Mooncake Store:保存数据

Mooncake Store 提供分布式对象存储能力,可将多个节点贡献的内存或其他存储资源整合为共享池。典型架构区分控制面与数据面:控制面管理对象位置、分配和生命周期;实际 KV 数据由客户端借助传输层直接搬运,不经元数据服务转发。[3][5]

SGLang A:L1 / L2 ──┐
                    ├── Mooncake Store(共享 L3)
SGLang B:L1 / L2 ──┘       │
                            ├─ 元数据与对象定位
                            └─ 分布式存储资源

当 Mooncake Store 作为 HiCache 的 L3 后端时,HiCache 负责前缀匹配、缓存层级和预取决策;Mooncake Store 提供可共享的数据对象及其存取能力。多个推理实例因此有机会复用其他实例已经生成的 KV Cache。[2][6]

3.3 组件关系:并非二选一

Mooncake 的两条典型集成路径相互独立:

  • HiCache + Mooncake Store:侧重共享 L3 缓存留存与跨实例前缀复用。
  • SGLang PD 分离 + Mooncake Transfer Engine:侧重 Prefill、Decode 实例之间的 KV 迁移。

同一集群可以同时使用两条路径,也可以只启用其中一条。Mooncake Store 的底层数据传输可利用 Transfer Engine,但“Store 作为缓存后端”与“Transfer Engine 作为 PD 传输后端”是不同的上层功能入口。[6]

4. 从单机到集群:四类典型架构

4.1 单机:GPU + CPU 分层缓存

单个推理实例通过 HiCache 将部分历史 KV 从 GPU 扩展至 CPU 内存。该架构不需要共享存储集群,适用于单实例长对话、长文档重复查询和 GPU 缓存淘汰后的恢复。

主要收益是降低历史前缀重新计算的频率;主要代价是主机内存占用、GPU/CPU 数据搬运,以及缓存元数据管理。若热点前缀始终留在 GPU,L2 可能很少命中,增加 L2 容量不一定带来收益。

4.2 多机多副本:各实例独立缓存

多台推理服务器也可以各自运行独立的 L1 或 L1+L2 缓存,再由网关分流请求。多机部署本身不要求使用 Mooncake。

在这种模式下,同一前缀可能在不同副本上重复 Prefill;通过会话粘性或前缀感知路由可以降低重复计算,但无法天然获得全局共享缓存。

4.3 多机共享前缀:HiCache + Mooncake Store

当长前缀频繁跨实例访问时,共享 L3 有机会降低重复计算。实例 A 计算并写入某段 KV 后,实例 B 可以在满足兼容性和命中条件时,通过 HiCache 从 Mooncake Store 恢复该数据。

该模式的性能收益取决于共享前缀比例、L3 访问延迟、网络带宽、写入冗余及缓存感知路由。跨节点取回 KV 并非零成本;如果传输耗时超过重新计算成本,性能可能不升反降。

4.4 PD 分离:Mooncake Transfer Engine

Prefill 偏向大规模并行计算,Decode 更关注连续 Token 生成、KV 访问与延迟稳定性。PD 分离允许两个阶段分别部署和扩容,并通过 Transfer Engine 传递 KV Cache。[6]

该架构与共享 L3 的目标不同:PD 分离解决计算阶段之间的资源与数据流问题,Mooncake Store 解决跨实例 KV 数据留存及复用问题。两者可以叠加,但没有必然依赖关系。

5. HiCache 与 Mooncake 对比

维度 SGLang HiCache Mooncake Transfer Engine Mooncake Store
核心角色 分层缓存管理 高性能数据传输 分布式共享存储
主要关注点 前缀匹配、缓存驻留、淘汰与预取 端点间数据搬运 对象定位、存放与生命周期
单机 GPU/CPU KV 扩容 核心能力 非主要职责 非必要组件
跨实例 KV 共享 依赖共享后端 提供传输能力 提供共享 L3 数据池
PD 分离 可配合整个推理体系 典型使用场景 非必需
性能约束 命中率、CPU 内存、PCIe 搬运 网络带宽、拓扑、传输并发 后端容量、元数据与访问延迟

HiCache 更接近推理引擎内部的缓存控制与层级管理;Mooncake 更接近推理系统下方的分布式传输与存储基础设施。两者处于不同抽象层,不能简单地将一个归为“单机产品”、另一个归为“多机产品”。

6. 性能收益与工程成本

6.1 主要收益

降低重复 Prefill:请求共享的前缀越长、命中越稳定,避免的重复计算通常越多。扩大缓存有效工作集:CPU 和外部存储可保存部分无法长期驻留 GPU 的历史 KV。提升集群资源利用率:跨实例共享能够减少重复缓存构建;PD 分离可使 Prefill 与 Decode 分别扩容。

6.2 主要成本

数据传输并非免费:L2 命中需要从主机恢复到设备,L3 命中还引入网络或存储访问。共享一致性更复杂:模型版本、Token 前缀、缓存元数据及并行布局需要满足兼容条件。运维面扩大:分布式存储引入控制面、容量回收、网络拓扑、故障恢复和监控等新问题。

6.3 效果评估指标

  • 各层命中量与命中率:区分 L1、L2、L3,避免只观察总体缓存命中率。
  • TTFT(首 Token 延迟):衡量前缀缓存复用是否真正缩短等待。
  • ITL(Token 间延迟)与吞吐量:观察 PD 分离后 Decode 是否更平稳。
  • 缓存备份和恢复字节量:估算 PCIe 与网络流量开销。
  • 缓存逐出和丢弃量:识别写入未完成、缓存压力或复用失败。
  • 资源占用:GPU 显存、CPU 内存、共享存储容量及网络带宽。

缓存命中率提高并不必然意味着端到端延迟降低,最终效果需要结合节省的计算与搬运代价分析。

7. 常见理解误区

误区一:多机推理必须使用 Mooncake。 多机副本扩容、张量并行和流水线并行可以采用其他通信或调度方案;只有涉及特定共享存储或数据传输需求时,Mooncake 才成为可选组件。

误区二:Mooncake 就是远程 KV Cache。 Mooncake 同时包含 Transfer Engine 与 Store。前者负责数据传输,不等于具备长期可查询的共享缓存;后者才提供分布式对象存储能力。

误区三:HiCache 只能用于单机。 HiCache 的 L1/L2 通常是实例本地缓存,但可以通过 L3 后端连接分布式存储,形成跨实例复用体系。

误区四:L2 必须大于 L1。 更大的 L2 有利于保存更多历史 KV,但这不是正确性要求。下层缓存的有效容量取决于实际访问模式;只有命中并避免重复计算时才体现收益。

误区五:L2/L3 容量增加会自动提升单请求上下文上限。 分层缓存扩大的是可跨请求保存的 KV 总量,单请求最大上下文仍受模型和推理框架限制。

误区六:TP=4 的四份缓存可直接相加为四倍逻辑 Token。 在按张量并行切分 KV 的模型中,不同 rank 可能保存同一批逻辑 Token 的不同分片。日志中各 rank 报告的相同逻辑 Token 容量,不应直接再次相加;实际可缓存长度要结合分片方式与每 rank 容量判断。

8. 总结

HiCache 决定 KV Cache 如何匹配、保留和跨层恢复;Mooncake 决定 KV 数据如何在节点间高效搬运,以及如何组织成分布式共享存储。

单机容量扩展可以只使用 HiCache;多机副本扩容不必引入共享 L3;跨实例历史前缀复用可以采用 HiCache + Mooncake Store;PD 分离则可以通过 Mooncake Transfer Engine 实现 KV 迁移。随着推理服务从单实例发展为集群化架构,缓存层级管理与分布式数据基础设施的协同,成为控制 Prefill 重算成本和提升资源利用率的重要技术方向。


参考资料

[1] SGLang,HiCache System Design and Optimization:https://docs.sglang.com.cn/advanced_features/hicache_design.html

[2] Mooncake,Mooncake x SGLang HiCache System Design:https://kvcache-ai.github.io/Mooncake/design/hicache-design.html

[3] Mooncake,Mooncake Architecture:https://kvcache-ai.github.io/Mooncake/design/architecture.html

[4] Mooncake,Transfer Engine:https://kvcache-ai.github.io/Mooncake/design/transfer-engine/index.html

[5] Mooncake,Mooncake Store:https://kvcache-ai.github.io/Mooncake/design/store/mooncake-store.html

[6] Mooncake,Mooncake x SGLang Integration:https://kvcache-ai.github.io/Mooncake/deployment/integrations/sglang/

资料核对日期:2026 年 10 月 30 日。具体接口、参数及性能特征可能随软件版本变化。