1. 为什么 KV 会成为数据中心级资源
权重可在部署时复制或分片,生命周期以小时计;KV 随请求生成,生命周期从毫秒到多轮会话的小时级,且与具体 token 前缀绑定。一个热门 system prompt、工具 schema 或代码仓库快照可能被成千上万请求复用。若每个副本独立重算,浪费 prefill;若全局共享,又必须解决定位、传输和一致性。
2. 前置:KV 的尺寸与语义
对 dense MHA/GQA,单 token KV 近似由层数、KV head 数、head dimension 和精度决定。TP/CP、MLA、压缩 KV、稀疏 attention 会改变分片和常数,因此运行时应从模型配置和实际 layout 读取,不应硬编码。
同样的文本 token 若模型权重、LoRA、RoPE scaling、视觉 embedding 或 KV 精度不同,不能共享物理 KV。缓存系统必须把“内容相同”与“可安全复用”分开。
3. 从 tensor 到 KV object
数据中心系统通常把 KV 按固定 token block、layer group 或两者组合切成对象。对象描述包括 logical prefix hash、物理地址、层范围、token 范围、dtype、owner、版本、引用计数、最后访问和持久层级。block 越小,复用和淘汰越细;block 越大,元数据和 I/O 越高效。
| 粒度 | 优点 | 代价 |
|---|---|---|
| token page(如 16/32 token) | prefix 匹配细、内部碎片小 | 对象数和目录事件多 |
| layer group | 可边算边传、流水恢复 | 地址和完成状态更复杂 |
| 整请求 KV | 实现简单、大 I/O 高效 | 部分 prefix 难复用,尾部浪费大 |
4. P/D 分离的完整请求流
Prefill 偏计算密集、decode 偏权重/KV 带宽密集,把两者放进独立 worker pool 可分别选择 batch、并行度与硬件。一次标准 P/D 请求如下:
- router 解析模型、SLO、prompt hash,并查询全局 prefix 目录。
- 选择 prefill worker;已命中 prefix 的 block 可就地读取或从远端加载,只算 suffix。
- prefill worker 分配 KV block,逐 layer/chunk 计算并发布可传输的范围。
- 控制面选择 decode worker,预留其 block table 和接收 credit。
- NIXL/RDMA/共享 fabric 把 KV 直接传到目标 HBM,完成事件提交版本。
- decode worker 在 KV 完整可见后进入 continuous batching,逐 token 输出。
- 结束后根据复用价值保留、降层或回收 KV,并更新全局目录。
TTFT_PD = router + queue_P + cache_load + prefill_suffix
+ KV_transfer + queue_D + first_decode
PD 有利条件:独立池的排队/硬件收益
> KV_transfer + 额外路由/状态成本
5. 分离解决什么,又制造什么
P 与 D 分别扩容;长 prompt 不阻塞 decode;可给 P 用计算型 GPU、D 用带宽/容量型 GPU;独立设置 TP 与 batch。
必须传 KV;router 同时理解两池负载;目标 HBM 要提前预留;一个请求跨更多故障域;cache locality 更难维护。
DistServe(OSDI 2024)是重要基础,报告在其设置下可服务 7.4× 更多请求或满足 12.6× 更严格 SLO,并使超过 90% 请求满足约束。它不是 2026 论文;2026 的 Dynamo、EcoServe、Libra、load-aware deflection 等继续处理真实链路、异构硬件和动态拆分。
6. 全局路由:负载最轻不等于完成最快
目标 worker 的成本至少由三部分构成:排队、prefix overlap 和迁移。一个忙 worker 如果已持有 80K prefix,可能比空闲但无缓存的 worker 更快;反过来,过度粘性会把热门 prefix 压到少数 worker。
NVIDIA Dynamo 的 2026 官方 KV-aware routing 将 cache overlap 与 worker load 组合,并维护全局 radix registry。KV 更新可通过 NATS、JetStream、ZMQ 或近似 TTL 模式传播;精确模式提高一致性,近似模式减少事件成本但会产生误判。
7. 全局目录与 cache event
目录不一定保存 KV 数据本身,它保存“哪个 worker/层级拥有哪个 prefix block”。创建、引用、移动、删除都产生 event。事件必须带 model epoch 和 sequence number;worker 崩溃时,控制面应一次失效该 owner 的所有条目,而不是等待每个 TTL。
CACHE_ADD(prefix_block, owner, tier, model_epoch, version) CACHE_MOVE(prefix_block, old_owner, new_owner, version+1) CACHE_DROP(prefix_block, owner, version) WORKER_EPOCH_LOST(owner, epoch) router 只接受当前 model_epoch 且 version 单调的记录。
强一致目录成本高;最终一致目录允许短暂 false hit/false miss。false miss 只多算,false hit 若直接引用不存在或旧 KV 会失败甚至产生错误输出。因此数据面仍需目标端验证,不能完全信任路由目录。
8. HBM、DRAM、SSD 与远端:四级缓存
| 层级 | 用途 | 主要限制 | 典型策略 |
|---|---|---|---|
| 本地 HBM | 正在 decode、即将命中 | 容量最小,争模型 workspace | pin active、引用计数、LRU/价值淘汰 |
| peer/远端 HBM | 同 fabric 快速借用 | 占用链路,远端 GPU 也有压力 | 拓扑感知放置、donor credit |
| host DRAM | warm KV、抢占恢复 | PCIe/NVLink CPU 路径 | 异步 prefetch、pin memory |
| NVMe/对象存储 | 大容量冷 KV | 微秒到毫秒尾延迟、写放大 | 大对象、GPU direct I/O、slack-aware load |
多层缓存不是层数越多越好。每层都需要 admission、metadata、promotion/demotion 和带宽预算;如果复用概率低,保存 KV 的写成本可能高于下次重算。
9. 淘汰价值:不能只用 LRU
KV 的复用价值与长度、重算 FLOPs、未来命中概率、加载成本和当前内存压力有关。长 prefix 命中节省大,但对象也大;短热门 system prompt 小且高频,通常价值更高。
Agent 会话还有“工具即将返回”之类的外部信号。已发起 200 ms API 的 session,通常比恢复时间未知的 session 更值得保留在 HBM。缓存控制器若只看最近访问时间,就会忽略这类生命周期信息,因此需要与调度器共享状态。
10. SYMPHONY:把 memory server 变成可协作的控制面
SYMPHONY(NSDI 2026)把计算与 KV memory disaggregate,使用 advisory request/prefetch、priority-based 与 cooperative memory management 协调计算节点和内存节点。论文报告端到端延迟降低 2.4×、可处理请求数提高 4×。
远端内存容量大只是前提。计算节点还要提前报告未来访问,内存层据请求关键路径排序,并在多个消费者之间协调。若完全依赖无提示的按需 page fault,I/O 延迟会直接落到 decode 关键路径上。
11. Bidaw、Strata、Tutti:SSD KV 不只是一次读写
Bidaw(FAST 2026)在 DRAM+SSD 两层中让计算与存储双向感知:存储队列按 KV 大小排序,响应反馈指导淘汰,并选择性缓存历史 tensor;报告响应延迟最高降低 3.58×、吞吐提高 1.83×。论文也指出朴素两层加载会使延迟升至 3.8×、吞吐降至一半。
Strata(OSDI 2026)在 HBM/CPU/SSD 层级中使用 GPU-assisted 大 I/O、解耦 layout,并让 scheduler 处理 delayed hit;已进入 SGLang 生产栈,报告相对 vLLM-LMCache 最高 5×、相对 TensorRT‑LLM 最高 3.75×。
Tutti(2026 预印本)构建 GPU-centric SSD KV object store,使用 GPU io_uring、异步 direct object I/O 和 slack-aware scheduling;相对 GDS LMCache 报告 TTFT 降 78.3%、请求率 2×、成本降 27%,接近 DRAM LMCache。预印本结果仍应在目标 SSD、文件系统和模型上复验。
12. Prism 与 SwiftCache:让其他模型借出空闲 HBM
Prism(OSDI 2026)针对多模型、突发负载提出 GPU memory ballooning,让模型组动态让出和收回 HBM;其开源 kvcached 声称已部署于 10,000+ GPU。它把 KV/cache 内存从“进程私有预留”变成节点级可调资源。
SwiftCache(2026 预印本)进一步利用异构共置模型的空闲 HBM,通过 NVLink 借用,同时把 active layer 保持本地;论文报告 P99 TTFT 降 69%、最大上下文扩大 3.98×。借用必须有回收协议:donor 负载突然上升时,borrower 需要迁移、降层或背压,不能直接丢正在使用的页。
13. 稀疏与压缩 KV 改变数据中心经济性
DeepSeek‑V4 2026 SGLang 报告中的混合稀疏 attention 只保留短窗原始 KV,并使用压缩 KV 支持 C4/C128 模式;HiSparse 可把 C4 KV 扩展到 CPU,官方报告容量/吞吐最高 3×。当每 token KV 不再固定时,router 应按 layer/head 访问集合估计 transfer,而不是整段搬迁。
Tangram(2026 预印本)观察不同 attention head 的 KV 重要度不均,给每 head 确定预算并用 head-group page 与 AOT load balancing,报告吞吐最高 2.6×。UltraQuant 则在 agent 长上下文中用 4-bit KV;MiniMax‑M2.5 TP2、2×MI355X、32 session 实验报告 late-round P50 TTFT 3.47×、全轮 2.3×、输出吞吐 1.63×。量化必须同时核对质量,不可只看容量。
14. 跨数据中心 prefill:只有特殊负载才成立
Prefill-as-a-Service(2026 预印本)针对 hybrid-attention 模型更小的 KV,选择性把超长 prefill offload 到远端数据中心;在其 1T 内部混合模型实验中,吞吐相对 homogeneous PD 提高 54%,相对朴素 heterogeneous 提高 32%。
跨地域 RTT 通常远大于机内链路,因此只适用于 prefill 足够长、KV 足够压缩、远端有明显算力/成本优势且数据合规允许的请求。普通短请求跨 DC 会让 TTFT 更差;敏感 prompt/KV 还涉及数据驻留、加密和审计。
15. 2026 当前栈:Dynamo、LMCache、SGLang HiCache
NVIDIA Dynamo 提供 router、worker、全局 KV registry 和 NIXL 数据通道,支持 vLLM、SGLang、TensorRT‑LLM 等后端;官方 P/D 文档明确将 KV 从 prefill worker 直接送到 decode worker。LMCache 作为开源 KV connector/存储层,与 vLLM 等 runtime 连接。SGLang 的 HiCache/HiSparse/X‑Mem 处理 GPU、host、SSD 与稀疏 KV。
SGLang X‑Mem 2026 官方报告在 prefix-heavy 工作负载上相对 host-DRAM HiCache 将 TTFT 改善 6.7×。这是特定 workload 的系统报告,部署时仍需把命中率、对象大小、SSD/NIC 和 CPU 内存拓扑固定后复测。
16. 具体例子:80K Agent 会话如何跨三轮复用
- 第一轮含 60K repo prefix、15K tool/schema、5K 用户内容;router 无命中,P worker 计算 80K KV。
- KV 以 block 发布,D worker 接收后输出 300 token;60K+15K 共享部分进入 warm tier,会话尾部留 HBM。
- 工具等待 3 秒。控制器预测短期恢复,保留最近 block,将较老共享 prefix 只保一个引用。
- 第二轮追加 2K 工具结果,router 粘到同一 D 或从 warm tier拉回缺失页,仅增量 prefill 2K。
- 若同一 repo 有另一用户请求,目录命中 60K prefix,但 adapter/model epoch 必须相同;用户私有尾部不可跨租户暴露。
这条数据流同时涉及缓存复用、租户隔离、session affinity、分层迁移和 P/D 资源选择,不能由单一 LRU 完成。
17. 多租户安全与生命周期
KV 可泄露原始上下文的表征信息,应按租户、模型和数据分类隔离。全局 prefix cache 只有在明确允许共享的 system/tool prefix 上跨租户;私有 prompt 默认 tenant-scoped。内存释放需覆盖 HBM allocator、host pinned buffer、SSD object 和目录索引。
- 传输使用身份认证与链路加密;对象 metadata 不暴露原始 prompt。
- 每次模型/adapter 升级创建新 epoch,旧 KV 不可静默复用。
- TTL、用户删除和会话结束触发可审计的多层删除。
- cache hit 权限在路由前检查,目标 worker 再次验证 tenant scope。
18. 故障恢复与一致性边界
P worker 在发送一半 KV 时宕机,D worker必须把未提交 block 标记无效;D worker 宕机时,router 可选择另一 D 并从 P/远端 cache 重传;目录服务宕机时可降级为本地 cache + recompute,而不是信任过期 location。
状态机:ALLOCATED → TRANSFERRING → COMMITTED → REFERENCED → EVICTING → FREE 只有 COMMITTED 可进入 decode block table。 所有转移带 model_epoch + object_version,释放幂等。
19. 实现与部署清单
- 把 cache hit 报成 tokens、bytes、节省 prefill ms 三种指标。
- 分别限制 HBM 水位、host pinned memory、SSD IOPS/带宽、每目标 RDMA credit。
- 用模型 epoch、adapter epoch、position semantics 构造强 cache namespace。
- 为每种层级测 load/store P99,并让 scheduler 只在有 deadline slack 时预取。
- 将“保留 KV”与“保留请求执行槽”分离,工具等待不应占 active batch。
- 为目录 event 丢失、乱序、worker 重启做 fault injection。
20. 局限与常见失败
所有论文倍数均绑定模型、GPU、缓存命中和请求 trace。本页不把最高数字横向相乘,也不把预印本结果当生产承诺。
21. 最小复现实验
用三种 trace:无共享随机 prompt、80% 共享 32K prefix、Agent 80K 多轮。比较共置、PD、PD+HBM cache、PD+DRAM、PD+SSD;分别扫描 0–100% hit rate 和 NIC/SSD 限速。
记录: TTFT = queue_P + compute_P + transfer + queue_D + first_decode cache hit tokens/bytes, transfer bytes, recompute tokens tier load/store P99, directory false hit/miss HBM/DRAM/SSD watermarks, eviction reason, fault recovery 报告 goodput,而非只报平均 throughput。
22. 一手来源与年份边界
| 来源 | 本页用途 |
|---|---|
| DistServe, OSDI 2024 | PD 基础与原始 SLO 结果;明确不是 2026 论文。 |
| Dynamo KV-aware routing 官方文档 | 全局 radix、cache/load 路由、事件模式。 |
| Dynamo P/D 官方设计 | NIXL 与 worker 数据流。 |
| SYMPHONY, NSDI 2026 | 计算/内存分离与协同预取。 |
| Bidaw, FAST 2026 | DRAM+SSD 双向感知。 |
| Strata, OSDI 2026 | HBM/CPU/SSD 分层与 delayed hit 调度。 |
| Prism, OSDI 2026 | GPU memory ballooning 与 kvcached 部署。 |
| Tutti, 2026 | GPU-centric SSD object store;预印本。 |
| Prefill-as-a-Service, 2026 | 跨数据中心 selective prefill;预印本。 |
| LMCache 官方仓库 | 2026 当前开源 KV connector/storage 栈。 |