范围:复用已经算过的 KV / 状态——前缀缓存与 radix/trie 索引、准入与淘汰策略、 跨轮次 / 跨请求 / 跨模型 / 跨上下文复用、以最大化命中率为目标的路由与调度、 不可回滚状态下的复用、复用状态的出处与保真度语义、以及真实负载的复用画像。 存储层级本身(CPU/SSD 带宽与介质)只在它改变复用经济性时出现。
这个方向不是被一篇论文催生的,而是被四条陆续到期的债务逼出来的,而且它们分别落在
不同的 category 上。
第一条是 framework 侧的机制债。 前缀复用在 2023 年就已经被做成了默认能力:把已完成请求的
KV 留在一棵 radix 树里、按最长共享前缀排序调度,并且能证明这个贪心顺序等价于离线最优的 DFS
遍历 [2312.07104]。该机制被上游吸收后成了事实标准
[2312.07104],可它留下的是"机制"
而不是"策略":淘汰谁、准入谁、以什么效用函数排序,全部退化成 LRU
第二条是 agent 侧的负载债,而它把 LRU 从"次优"变成了"反向"。 当请求从"一次问答"变成
"一条几十次调用的工作流",重复前缀的比例从边际优化变成主导项——同模板批量工作流里重复
prompt、重叠上下文、并发重复工作同时存在 [2509.02121],
多智能体通信让每次转发都要把整段上下文重新 prefill,开销从单 agent 的线性上升到近似二次
[2510.12872]。更关键的是符号问题:在循环型工作流里"刚执行完"
强相关于"马上要再执行",于是 LRU 会系统性地驱逐下一步立刻要用的那份 KV
[2507.07400];在图上逐步推理的
多 agent 负载里同样如此——最新生成的一次性代码片段最不值得留,而 LRU 恰好优先保留它
[2511.01633]。这不是"策略不够好",是时间信号与语义信号方向相反
第三条是数据债,而且它推翻了前两条隐含的乐观。 来自生产集群一周真实 trace 的画像显示:
无限容量下的理想命中率只有 62% / 54%,远低于合成负载常报的 80% 以上;10% 的块贡献 77% 的
复用;KV 块寿命极短,to-B 负载 90% 的块 0.3 秒内不再被复用
[2506.02634]。同一份数据还给出一个反直觉结论:在纯
API 负载里贡献 97% 命中的是单轮请求(客户端把相同 system prompt 硬编码进去 + 高 QPS),
而不是多轮会话 [2506.02634]。
在结构化 agent 负载上这条债的形态又不同:默认前缀缓存的命中率只有 61%,原因不是策略差,而是
复用单元选错了——每步 prompt 的稳定前缀段太短、碎片事实的排序还不稳定
第四条是出处债,而它是被最新条目逼出来的,且此前整个主题都没有对应字段。 在 2026 年之前,
本主题每一个成员的隐含公理都是"产生 KV 的参数集与消费 KV 的参数集是同一个"。两篇训练时保证
路线先撬动了这条公理,但保留了精确性:冻结产 KV 的那一半参数,使不同模型产出同一份 KV
[2602.12029][2603.13281]。而闭式跨模型映射同时放弃了两者——
参数集不同、且复用是近似的、还不需要任何训练:对 target 每个 (layer, head) 做一次 ridge,
接收方直接从发送方的 KV 解码 [2608.03893]。它落地时要写进的那棵树,键是
token id 序列 [sgl-project-sglang],节点上只有
管驱逐安全的引用计数、没有任何"这份 KV 由谁产生、保真度如何"的字段
因此这个主题的真正内容不是"怎么做前缀缓存",而是四个问题的叠加:**在复用变成主导项、真实命中率
又低于预期、状态代数本身可能不允许切片、而且一份缓存的出处与保真度不再唯一的情况下,谁来决定
复用什么、以什么效用排序、在哪一层决定、以及凭什么相信命中的那份 KV 是可以被命中的。**
在第三条之上还叠了一个模型架构层面的意外,它是第一次真正的公理作废:Attention+SSM 混合模型的
SSM 状态是原地更新的,不能回滚成自己的任意前缀,于是"命中"要求整段前缀精确匹配,块级
25.0% 的 KV 复用率对应的 SSM 状态复用率只有 0.4%,相差 65.3 倍
[2411.19379]。这条把"KV 沿序列维可切片"这个 2023–2024 年所有
缓存系统的公理直接作废 [2411.19379]。
| category | 数量 | 代表 |
|---|---|---|
| framework | 16 | RadixAttention 的 radix 树 + 最优性证明 [2312.07104];混合模型下的准入/淘汰重设计 [2411.19379];引擎无关的外置缓存层 [2510.09665];生产 trace 画像与 workload-aware 淘汰 [2506.02634];工作流拓扑驱动的淘汰与预取 [2507.07400];agent 边界即缓存优先级边界 [2511.01633];前缀路由与 true-FLOPs 计价 [2605.02960];单树同管 KV 页与 SSM 状态的引擎 [tokenspeed] |
| agent | 4 | 批量工作流的合并查询计划 + 复用折扣代价模型 [2509.02121];跨上下文 KV 偏移近似 [2510.12872];模板化 radix 树的编译期缓存调度 [2603.16104];与前缀复用兼容的跨轮剪枝 [2606.09916] |
| code | 3 | RadixAttention 与分层缓存的生产实现 [sgl-project-sglang];前缀缓存感知的调度/路由器 [ZhaiFeiyue-mori-scheduler];Rust 并发 radix 树 cache-affinity 路由 [vllm-project-router] |
| algorithm | 2 | 把 prefix overlap 折算成毫秒、与网络 RTT 同量纲相加的跨区路由代价模型 [2602.11688];跨参数集的闭式 per-head 线性映射 [2608.03893] |
四个 category 的分工不是偶然的:framework 提供机制与策略,agent 提供"未来会复用什么"的结构
信号,code 把这些决策外移到路由层,algorithm 负责把互不同量纲的信号折算成同一个目标函数、
并且现在还负责把不同参数集之间的表示差异也折算掉。这条分工线本身就是下面 §5 的主线。
值得单独记一句的是 algorithm 这一格的性质变化。它原先只有一个成员,做的是计价(把 overlap
换成毫秒)[2602.11688];新成员做的是换算(把一组参数下的 KV 换成另一组参数
下的 KV)[2608.03893]。计价改变的是"该不该
复用",换算改变的是"什么算同一份缓存"——后者动的是本主题的对象定义,不是它的目标函数。
单位数 Gbps 云链路取回,延迟可与直接重算 prefill 相当甚至更久
调度,并给出这个贪心等价离线最优 DFS 的定理 [2312.07104]。这是本主题的
机制基线,也是后续所有工作的比较原点。
队列**当作未来访问的预言机来驱动预取与淘汰,把 99.6% 以上的命中挪进 DRAM,而 LRU/FIFO
只有约 0.5% [2403.19708]。
"未来信号优于历史信号"这条主线从此确立。
使前缀共享可以在运行时动态生成的上下文上发生,而不只是静态系统提示
[2405.19888]。这是"复用决策上移到应用/集群层"的第一次系统化表述。
(每序列最多 2 个 SSM 状态),并把淘汰效用从 recency 换成 FLOP-per-byte
[2411.19379]。这是本主题的第一个真正的范式转折点。
max+1 / min+1两种聚合把 DAG、环、条件分支统一成 steps-to-execution,再把这个未来距离下沉到 radix 节点、
共享节点取最小值 [2507.07400]。它同时给出一条与"加 CPU 层总是有用"
相反的实测:反应式回载在高并发下会把系统压到基线的 0.57 倍
的 vertex chunk,单这一项就把命中率抬 17.7%、吞吐抬 41.6%
[2511.01633];并提出 agent 语义边界就是缓存优先级边界,用四级
优先级取代单队列 LRU [2511.01633]。
智慧相反的结论:显式删掉 GDFS/LFU 的 Frequency 项反而更好,因为短命高频块会污染缓存
复用被写进代价模型里的折扣系数 [2509.02121],或者被写进一棵同时编码前缀
层级与算子依赖的模板化 radix 树 [2603.16104]。
可管理的外置数据结构 [2510.09665],另一条放弃精确性,用 RoPE 对齐
+ anchor 池近似跨前缀的 KV 偏移 [2510.12872]。
推到跨区域路由(此时 cache overlap 必须和网络 RTT 折算成同一单位比较
[2602.11688]),向内推到模型参数(冻结共享 prefill 模块 + cache-conditioned
微调,让不同模型产生同一份 KV [2602.12029],或冻结整个逻辑编码器
前缀路由 + 用 true-FLOPs(N 个同前缀请求记 1 次前缀 + N 次后缀)计量负载,负载均衡作为饱和
的结构副产品自动涌现 [2605.02960];
同期一个引擎侧的实现把 KV 页与 Mamba 状态收进同一棵 radix 树、并用 13 态 FSM 把缓存资源安全
提到编译期 [tokenspeed][tokenspeed]。
工作:为复用状态与在飞状态的冲突定义合约与可观测语义 [2605.24259];让 KV
剪枝与前缀复用互相兼容而不是二选一 [2606.09916];以及承认前缀亲和不是路由
层唯一的局部性目标 [2607.00466]。
保住 target 自身 73–98% 精度、比重新 prefill 快 2.7–25 倍,另两对崩到 42–44%
[2608.03893]。它同时给本主题留下两笔新账:
近似缓存写回 token 键索引会污染后续的精确复用
以及复用资产第一次按有序模型对索引而不是按前缀索引
谱系里有五个真正的分叉点和三个汇合点:
"更远的存储"走(分层、外置层、SSD),两支对"瓶颈在哪"给出了不同答案
[2506.02634]。这条
分叉现在两侧都有独立实现:统计侧是按"类型×轮数"拟合的复用概率
[2506.02634],结构侧是从 DAG 直接算出的 steps-to-execution
一支主张前缀匹配本身就是错的抽象、应该按检索/语义单元整块复用
[2603.13281],还是闭式换算接受跨模型近似
[2608.03893]。这一分叉之前不存在,因为参数层此前只有恒等这一支。
选了 token id、原始字符、引擎专属 block hash 三种键
[ZhaiFeiyue-mori-scheduler],第四种键是把前缀命中
折成 FLOPs 记账 [2605.02960]。
的那一半,从而在推理期得到系统级恒等保证 [2603.13281]。
一个引擎实现用**单棵 radix 树同时管理 KV 页与 Mamba 状态、并用多个 PagedCacheGroup 区分
滑窗层与全历史层**的方式偿付了机制侧的那一半
[tokenspeed]。注意这只解决了"要不要两套 cache 管理",
没有解决"定长状态能不能切片"——后者仍然是 §7 的第一条。
模型架构改变,framework 的策略层必须重写,而机制层可以被工程收敛。 混合 SSM 的三条性质
(定长、原地更新、比单 token KV 大 10–100 倍)联合导致"全有或全无"的复用语义,任何一层复用
不足都会成为瓶颈 [2411.19379]。这不是调参问题:定长状态使
"大小 ∝ 省下的算力"这条所有 size-aware 缓存共享的代理关系失效,必须换成 FLOP-per-byte 这类
显式解耦的效用 [2411.19379]。反过来说,Transformer 时代之所以可以忽略这件事,
正是因为 attention 项的 FLOP-per-byte 近似常数 [2411.19379]。策略必须改,但
机制可以统一:把 KV 页与 Mamba 状态放进同一棵树、按 cache group 分别管理页生命周期,就不必维护
两套缓存实现 [tokenspeed],代价是这条路径目前只在一个
preview 阶段的引擎里存在、且相关 PR 尚未合入 [tokenspeed]。
agent 的工作流结构给了 framework 一个它自己拿不到的预言机,而这个预言机有三种精度。 最粗的
一种是把整批同模板工作流合并成一个计划,此时 KV 复用不再是运行时的偶然命中,而是代价模型里可以
被优化器主动制造的折扣项 [2509.02121];更细的一种是把前缀层级和算子依赖编码进
同一棵树,在编译期排出一个让复用最大化的顺序,实测命中率比在线最长前缀匹配高出 32.9 个百分点
[2603.16104];居中的一种不要求整批已知,只要求当前时刻的拓扑可见,于是可以
在线运行:按 steps-to-execution 给每个 radix 节点排优先级、共享节点取最小值,再据此主动预取
[2507.07400]。三者共享同一个失效条件——运行时动态生成分支:编译期方案
的静态剪枝直接失效 [2603.16104],在线方案的 STE 退化成启发式且论文未做该场景
实验 [2507.07400]。
"复用单元"是 agent 侧独立发现的第三个杠杆,它与前缀匹配正交。 在图上逐步推理的负载里,默认
前缀缓存只有 61% 命中,原因是碎片事实太小、排序不稳,两个内容相近的查询也难以命中同一前缀
[2511.01633]。把复用单元抬成"节点 + top-k 邻居"的 chunk 之后,命中率 +17.7%、
吞吐 +41.6%,而这不需要改任何前缀匹配算法 [2511.01633]。
代价是收益变成内容相关的:它假设图访问有幂律性,在长尾图上 chunk 复用率会显著下降
[2511.01633],而 top-k 邻居裁剪本身就有信息
损失风险 [2511.01633]。
算法层的约束反过来解开了系统层的死结,然后又把这个死结换成了一个新的。 "KV 与参数强耦合"
长期被当成物理事实,跨模型复用因此不可能。冻结产 KV 的那一半参数、只用 cache-conditioned 目标
训练消费 KV 的那一半,把这条事实变成了一个训练时可选的约束:内存主导项从
$N(L_{shared}+L_{unique})$ 降到 $L_{shared}+N L_{unique}$,当共享上下文远长于专属段时对模型数
近似不敏感 [2602.12029]。同一想法的另一种实现直接消除了逐层敏感性选择,把
复杂度从 $O(L\times N)$ 降到 $O(1)$ [2603.13281]。但这条线把
serving 优化变成了训练依赖:每换一个专用模型都要重训一次,纯系统方案不需要付这笔钱
[2602.12029]。免训练的闭式换算试图绕开这笔钱,代价是把成本科目从"训练一次"
换成"每个有序模型对一份 1.01–3.36 B 参数、落盘 4–12 GB 的资产"
[2608.03893]——五模型车队约 131 GB,且冷启动换页 80–480 ms 的量级横跨一个生产
路由器实测的整个中位 TTFT
两条路线的规模律因此相反:消费者侧适配按 $O(P)$ 增长,翻译器侧资产按 $O(P^2)$ 增长
路由层是复用与其他局部性目标唯一的公共竞技场,而这些目标互相冲突,且现在有四种计价单位。
前缀亲和路由的经典失效模式是热点:只按亲和路由会把负载堆到少数 worker 上,所以生产路由器都做
两段式——负载差超阈值就退回最短队列,否则才走亲和
跨区域时冲突更硬:单 token prefill 时间实测 0.0938 ms,意味着 1000 token 的命中只值 94 ms,
常常抵不过一次跨区 RTT,纯 cache-overlap 路由反而恶化 TTFT [2602.11688]。
第三种计价把命中直接记成算力:N 个同前缀请求的真实成本是 1 次前缀 + N 次后缀,据此更新负载后,
均衡不再是显式优化目标而是饱和的副产品
[2605.02960];而且这种计价的
边际价值随并行度上升(2 卡约 8%,8 卡 +16–18%),因为卡越多随机派发把前缀打散得越厉害
[2605.02960]。而在 MoE 上还多出第四个局部性维度:decode 延迟由一个 batch
激活的不同专家的并集决定,而不是请求数——16→128 个活跃专家带来 4.7 倍的 MoE 层延迟摆动
[2607.00466]。此时前缀亲和与专家亲和是两个需要同时满足的约束,其中一个的
签名还必须做成与 KV block 同索引才能在前缀命中时保持精确
存储层级改变的是复用的经济性,而不是复用的语义——但它也能把经济性改成负的。 传输时体积
可以用类视频编码压 3.5–4.3 倍
[2310.07240];块级搬运替代页级搬运
可以把 CPU 侧加载带宽从 88 Gbps 提到 400 Gbps [2510.09665];把 CPU 完全
移出 GPU↔SSD 的数据与控制路径,可以把"I/O 气泡超过计算"的交叉点推到 98.3% 命中率
[2605.03375]。这些都不改变"复用什么",但它们一起把"该不该复用"的
损益点移动了一到两个数量级——同一个复用决策在 32 Gbps 链路上是亏的(低于 256K token 时
直接输给重算 [2510.09665]),在 GPU 直驱 SSD 上是赚的。**反向的证据同样
存在且更尖锐**:在 1024 固定前缀 × 64 并发下,反应式回载的分层缓存把系统压到纯 GPU 基线的
0.57 倍,因为频繁 miss 触发的回载与引擎原有的逐层流水互相打架
而这条链路的带宽上界又被引擎里 KV 的碎片化布局压住,主动预取只是更好地重叠了那段"打不满的
带宽",没有解决根因 [2507.07400]。极端的另一头是把复用整个关掉:对前缀稀疏
负载直接停用 KV 存储、把 HBM 全部让给更大 batch
[2605.02960]——这是本主题里
唯一把"复用量"这个旋钮显式拧到零的设计,也说明复用在某些 regime 下是净负债。
五条独立证据线指向同一结论:调度器队列驱动的淘汰把命中率从 LRU 的 58% 提到 86%,并把命中从
慢层挪到 DRAM [2403.19708];
定长 SSM 状态下 LRU 会系统性错排条目 [2411.19379];生产数据显示高频块可能
早已死亡,Frequency 项必须删掉 [2506.02634];循环工作流里"最久未用"恰好
等于"下一步要用"[2507.07400];
而按任务语义分级比单队列 LRU 吞吐高 14.3%、miss 低 15.1%
[2511.01633]。同时它们都保留了 recency 作为兜底分量或级内排序
靠准入策略就带来 4.5×/7.3×/34.4× 的命中率提升,淘汰策略再叠加 45.6%/19.0%/219.7%
[2411.19379]。这条与"复用不能只看写入侧"在合约工作里被独立
重述:写入不准入(write no-admit)成功阻止了体量型复用,但常驻条目照样被在飞请求挤死,
因为二者是两个独立的资源操作 [2605.24259]。
[2510.09665];路由器把前缀索引复制到引擎之外
[ZhaiFeiyue-mori-scheduler];应用层把 DAG 结构交给服务端
[2405.19888],也可以把工作流元数据直接注入 HTTP 请求
[2507.07400];调度前端甚至可以按 true-FLOPs 主动制造前缀聚集而不是等它
发生 [2605.02960]。四条路线都承认单个引擎看不全复用机会。
bit-exact 输出 [2603.16104];跨模型恒等由冻结参数保证而不是
近似 [2603.13281];近似方案自己也内置了失败即回退稠密 prefill 的路径
[2510.12872]。最新的跨参数集近似是这条共识的唯一例外,而且是缺口
而非反例:它既是近似的、又没有任何请求级门控,是本簇里唯一的这种组合
分歧 1 — 未来复用应该从统计里猜还是从结构里读。 生产画像证明按"类型×轮数"拟合的复用时间
分布跨相似时段、跨天稳定,可离线预测 [2506.02634];
工作流侧的路线则明确拒绝一切基于历史的信号,理由是在 agent 负载里过去访问是随机的、未来顺序
由 DAG 给出 [2507.07400],而这条判断被独立复述为
矛盾根源不是谁对谁错,而是负载可观测性不同:应用把 DAG 暴露给后端时未来是"已知的",
云 API/chatbot 场景后端看不到应用逻辑只能从统计规律里猜。两者在各自负载下都自洽,且失效
模式互补——统计路线在类别信息稀薄时退化回 LRU,结构路线在运行时动态生成分支时退化为启发式
分歧 2 — 到底需要多大缓存容量,以及加一层 CPU 缓存是否总是有益。 分层存储路线的立论是容量
是硬约束:仅 HBM 命中率约 0%,加 DRAM 也只有 1.7–19.1%,加 SSD 才跳到 71–90%
[2403.19708];SSD 直驱路线更进一步把 100 TB 级容量当作前提
[2605.03375]。生产画像给出部分反例:GQA 模型在纯 API 负载下所需缓存甚至
小于预留 HBM,纯 GPU 缓存即够,可以省掉 CPU-RDMA-SSD 层级 [2506.02634]。
根源是模型架构 × 负载 × 卡型三重差异:反例被严格限定在 GQA + to-B + 大显存实例,画像作者
自己承认 MHA 模型仍需巨量缓存
[2506.02634]。新增的第三个立场把这条分歧
推得更远:CPU 二级缓存不只是"可能不需要",在特定 regime 下它是负收益的——反应式回载在高
并发下把吞吐压到无 CPU 层基线的 0.57 倍
而且这套方案自己假设 CPU 侧永远装得下所有被驱逐的 KV、没有给 CPU 层的淘汰策略
[2507.07400]。实际后果是:"要不要建分层缓存"在 2026 年仍然是
一个必须按负载单独回答的问题,而且答错的方向可能是倒退而不只是浪费。
分歧 3 — 命中率是不是目标函数。 把命中率当目标是本主题的默认假设,radix 调度的最优性
定理直接以命中率为目标 [2312.07104]。跨区路由给出了直接反例:某区有 15%
命中但 TTFT 378 ms,另一区 0% 命中但 281 ms——追逐 overlap 反而更慢
[2602.11688]。合约工作从另一侧给出反例:只报命中率会掩盖形状问题,某策略
保留了最多的 raw token(1104 个)但阈值化后的可用价值为 0,因为碎片没有构成前导连续前缀
[2605.24259]。第三个反例来自跨参数集复用:
它的复用率不低(困惑度证明信息确实转移了),但差值换算到正确基线后收益为负
[2608.03893]。三条合起来说明命中率是一个
代理指标,且在跨区、高压、跨参数集三种情形下都会与真实目标脱钩。
分歧 4 — 复用与压缩/剪枝是叠加还是互斥。 传输压缩明确声称与 token 丢弃类方法正交可叠加,
并实测在其之上再降 3.3–4.2 倍 [2310.07240];跨轮剪枝则揭示这条叠加性
在布局层是不成立的:标准压实会搬移存活的 KV 行,破坏 radix 缓存赖以匹配的前缀身份,
所以此前的剪枝方案不得不关掉前缀缓存,命中率塌到 0–3%
[2606.09916]。解法是把"保留什么"和"怎么摆放"分开,用槽位重定向到死槽位
代替压实,从而把前缀命中率恢复到 20.7% [2606.09916]。结论是:叠加性成立,
但只在有人显式设计了别名安全的释放条件之后才成立
分歧 5 — 前缀索引应该用什么键,索引该有多精确,以及键里要不要编码出处。 引擎内用 token id
序列做 radix 键 [sgl-project-sglang];一个生产
路由器刻意用原始字符而不是 token id,为的是把分词延迟移出路由热路径,代价是近似
另一个路由器走相反方向,为 4 种引擎复制 5 种 block hash 算法以做到逐位精确匹配,并明确指出
跨引擎的 hash 命名空间必须隔离以避免静默的错误命中
[ZhaiFeiyue-mori-scheduler]。跨区路由则第三次给出不同答案:
它的前缀 trie 是刻意的轻量近似,只用于快速路由决策而不是精确命中计算
[2602.11688]。跨参数集复用把这条分歧升级成了正确性问题:
映射得到的缓存与 target 自己算出的缓存 token 相同、数值不同,一旦写入 token 键索引,后续本来
享有精确复用的同前缀请求会静默命中一份近似缓存,而三方(引擎、路由器、映射方法)都没有
"这份 KV 由谁产生、保真度如何"的字段
现有语料里最接近的机制是按引擎隔离 hash 命名空间
[ZhaiFeiyue-mori-scheduler] 与解码后验证再提交
[2510.12872],前者按引擎而非按产出模型或保真度隔离,后者只
守自己的 anchor 池、不守别人的前缀树。
分歧 6 — 跨模型复用的正确抽象层。 两篇训练时保证路线的工作在推理路径上直接对立:一篇让
冻结编码器与解码器在 decode 阶段并行运行、通过 query 拼接共享一次 GQA 读取,付出 2× decode
算力换取"ground-truth KV" [2603.13281];另一篇声称 decode
阶段无需编码器并行 [2602.12029]。两者报告的精度相当,这**暗示编码器并行
可能是过度设计** [2603.13281]。这条分歧至今没有 head-to-head
实验裁决,而且前者的 2× decode 开销从未被单独量化
[2603.13281]。第三个立场现在出现了,
它连"要不要动模型"都否定:只要能对两侧做只读白盒访问,闭式换算就不改任何权重
[2608.03893]。三者的可行域由访问权限而不是精度划分:能改 decode 模块时选训练
路线,只能读时选换算路线。
分歧 7 — 跨模型复用该拿谁做分母。这是最新出现、也是后果最严重的一条。 恒等路线的分母是
"如果你拒绝共享,你会部署的那个东西"(全量微调)[2602.12029];换算路线的分母
是 target 自己独立运行的成绩 [2608.03893]。
问题在于 cascading / routing 场景下真实的对照是"不切换,继续用手上的小模型",而按这个分母算,
四对最好的组合五项均值全部为负($-0.43$ 到 $-11.92$ pp),退化集中在 5-shot MMLU 与 8-shot CoT
GSM8K,且随对子变远而放大 [2608.03893]。
换成路由文献的度量,收益落在"本来不该升级"的子群上,而在"必须升级"的子群上是负的
矛盾根源是"为什么切换"没有被区分:如果切换由质量驱动(cascading),双端点分母是唯一正确的;
如果切换是被迫的(容量故障转移、配额、模型下线、灰度),"继续用小模型"不是选项,target
standalone 就是正确分母,而这个场景没有任何一篇路由工作覆盖
[2608.03893]。这条分歧可以廉价地关闭:原始数据已经在附录里,只差一次相减
分歧 8 — 复用单元应该多粗,以及优先级应该离散还是连续。 机制原点及其全部路由派生都把
token 级最长共享前缀当作复用单元 [2312.07104];图推理负载上的结论相反——
前缀匹配本身是错的抽象,把单元抬到检索单元(节点 + top-k 邻居)才是解法
[2511.01633]。同一工作把优先级做成四个离散级 + 级内 LRU,而批评意见指出
"重要性"实际是连续谱,两个不同查询的中间结果复用概率不同却被归到同一级,高并发下误驱逐仍会
发生 [2511.01633]。这条与分歧 1 交叉:结构信号
给出的是序(下一步距离),统计信号给出的是概率,语义分级给出的是类别,三者都在
逼近同一个连续效用,但没有一个把它写出来——见 §7 挑战 3。
挑战 1 — 不可回滚状态下的部分复用,可能根本不存在;工程债已部分偿付,代数限制没有。 这不是
"没人做",而是状态代数本身的限制:原地更新的定长状态无法表示自己的任意前缀,只能在精确匹配点上
命中 [2411.19379]。当前唯一的应对是选点检查——只在分支点和最后
解码 token 处物化状态 [2411.19379]——本质是用"猜哪些前缀将来会被用"
换取"任意前缀都能用"。过去一年发生的变化只在机制侧:已经有引擎用一棵树同时管 KV 页与 Mamba
状态、用多个 cache group 分别管理页生命周期 [tokenspeed],
所以"要不要两套缓存实现"这个工程问题不再是障碍。但"定长状态能否被切成自己的前缀"没有任何进展。
要真正解决需要模型侧提供可回滚或可组合的状态表示,即 model 与 framework 的联合改动。难度视野:
与混合架构是否成为长上下文默认选择绑定,2–5 年内不会有纯系统侧解法。
挑战 2 — 复用状态没有"出处"与"保真度"这两个字段,而现在已经存在会污染它们的写入方。 本主题
每一个索引都只按内容寻址:token id 序列
[sgl-project-sglang]、原始字符
专属 block hash [ZhaiFeiyue-mori-scheduler]、轻量 hash
trie [2602.11688]。这在"生产者 = 消费者且复用精确"的年代是完备的,
现在不是了:跨参数集映射产出的缓存与真值 token 相同、数值不同,写进树里之后无法与精确条目区分
为什么这难而不只是"没人做":三个必要条件分别落在三方且互不知情——引擎需要在节点 schema 上加
产出方与保真度、并让淘汰优先丢近似块(现有节点上只有管驱逐安全的引用计数
[2312.07104]);近似方法需要提供一个能在请求级判定的门控,而
它唯一的筛选标量要求 target 的真值 attention 权重,也就是转移本来要省掉的那次前向,原理上做不到
路由器需要在只读、轻量的路由平面上多知道一个维度,而整条文献都在刻意让路由状态保持便宜
[2602.11688]。现有部分尝试都不够:按引擎隔离命名空间只防跨引擎
错撞、不防跨模型 [ZhaiFeiyue-mori-scheduler];解码后验证再提交只
保护近似方法自己的 anchor 池 [2510.12872];把缓存资源安全提到编译期
的 13 态 FSM 证明了"正确性可以做成类型问题",但它守的是别名与重复释放,不是数值保真度
定义了常驻块丢失的语义,但没有定义"命中了一份不该命中的块"这种结果
[2605.24259]。难度视野:schema 与淘汰侧的改动 6–12 个月可做(已有把节点
schema 扩成"状态 + KV"并换掉打分函数的先例 [2411.19379]),请求级保真度门控
没有已知路线。
挑战 3 — 缓存条目的价值没有公共货币,而候选货币数量还在增加。 现有六种效用度量互不可换算:
FLOP-per-byte [2411.19379]、按类别拟合的复用概率 [2506.02634]、
折算成毫秒的 overlap [2602.11688]、阈值化后的可物化价值
[2605.24259]、工作流拓扑给出的
steps-to-execution [2507.07400]、以及扣掉前缀共享折扣的 true-FLOPs
[2605.02960]。它们各自在自己的
瓶颈假设下正确,但没有一个能同时表达"省下多少算力""省下多少毫秒""占了多少稀缺容量""在这个拓扑里
搬过来要多久""命中它会不会降质量"。缺乏公共货币的直接后果是:跨层的联合决策(该压缩、该下沉、
该淘汰、该路由到别处、还是该重算)现在只能靠人工调权重,甚至只能靠离散分级
[2511.01633]。难度视野:需要一个把计算、带宽、容量、
拓扑、质量统一到同一目标的性能模型,这类模型在本主题里全部缺席——外置缓存层的三个关键
trade-off 都是实证断言而无闭式解
[2510.09665],混合模型的效用权重靠网格搜索
[2411.19379],而闭式换算方法自己
承认最缺的正是"给定重构侧标量,下游指标最多退化多少"这个界 [2608.03893]。
质量项的缺席是新的:到目前为止每一个路由代价模型都隐含假设复用是质量中性的,这在精确时代为真、
在近似时代为假 [2608.03893]。
挑战 4 — 常驻复用状态与在飞状态的冲突是物理不可行性,不是可优化项。 当被保护的常驻 KV
加上在飞 KV 超过物理池容量时,系统在物理上无法同时满足二者,只能做显式取舍
[2605.24259]。现有运行时暴露的都是保留策略(优先级、TTL、卸载、
radix 缓存),没有一个定义了"被接受的常驻声明被破坏时必须做什么"的合约,于是常驻前缀被
当成普通缓存受害者静默驱逐,外部观察者无法区分正常淘汰与违约
[2605.24259]。硬保护只是把失败模式从静默的常驻损失换成显式的在飞拒绝,
并不能让 130 个块装进 80 块的池子 [2605.24259]。语义分级
路线证明了"用级别代替单队列"确实能把最该留的那类留住
[2511.01633],但级别是分类不是合约,级内
仍会误驱逐 [2511.01633]。需要 framework 定义合约、
agent 侧声明真实的复用意图、部署侧监控违约三方协同。
挑战 5 — 跨模型复用把 serving 优化变成了训练承诺或按有序对增长的资产,两条都不便宜。 让不同
模型产出同一份 KV 的两条路线都要求所有任务模型从同一个冻结底座开始训练,无法复用已有的全量微调
模型,也无法混合不同底座 [2603.13281]。这在快速迭代的 agent 流水线里是
真实的总拥有成本问题:每次换解码器都要重训,而底座更新时是否要全量重训至今没有工作讨论
[2602.12029]。免训练路线换掉了这笔钱,但换成了 $P(P-1)$ 个有序对资产,每个
1.01–3.36 B 参数、4–12 GB [2608.03893],且真正的隐藏变量是驻留概率——它随车队
规模单调恶化,没有任何工作测过
一旦承认梯度反正要付,规模律就给出了答案而不是精度:消费者侧适配 $O(P)$ 支配翻译器侧资产
$O(P^2)$ [2608.03893]。这不是工程债,而是"跨参数集复用的成本必须记在某个不随
前缀长度缩放的科目上"这一结构事实;除非有人找到既免训练又不按对索引的对齐方式,这条线的适用面
就被锁死在模型阵容稳定或切换非质量驱动的部署里 [2608.03893]。
挑战 6 — 真实复用规律的可观测性掌握在极少数人手里。 唯一同时具备时间戳、请求类型、用户
ID、多轮父链的生产 trace 只有大云厂商拥有,缺了它策略里的复用概率无从标定,公式退化回 LRU
[2506.02634]。更麻烦的是这份数据本身的外部效度有限:单厂商
一周快照,reasoning 类新负载未覆盖,而 agent 负载的复用结构与之完全不同
[2506.02634]。工作流侧的替代方案也没有解决这件事,它用的是合成负载,headline
数字出现在 8192 固定前缀这种极端配置上,未用真实 agent trace 验证
[2507.07400]。于是整个主题的
"真实命中率是多少"这个最基础的问题,答案既不可复现也可能已经过期。难度视野:这是社区治理问题
而非技术问题,短期内无解。
挑战 7 — 共享前缀缓存的公平性与隔离尚无设计。 画像工作自己指出恶意客户端可以用长相同
前缀垄断前缀缓存,并把公平性划为正交问题 [2506.02634];跨轮剪枝方案不得不
专门设计会话键的解析优先级来避免多租户之间的意图互相污染
[2606.09916];生产路由器的令牌桶是每路由器而非每用户的,多租户
公平必须靠外部网关 [vllm-project-router];而工作流感知的淘汰只用 client_id
避免 agent 名字冲突、跨工作流共享节点一律取最保守的优先级,这保证了不误删但也意味着一个租户可以
用高优先级声明拖住共享节点 [2507.07400]。四处独立证据
说明"共享"这件事的安全与公平后果被系统性地推给了别人。
核心机制:生产就绪。 radix 前缀缓存已在 40 万块以上 GPU 的生产环境部署,且是若干强化学习
后训练栈的默认推理后端 [sgl-project-sglang]。引擎无关的外置缓存层在连接器
API 上游化后约半年内被嵌入五套主流部署栈,支持 8 种以上存储后端与 4 类处理器
[2510.09665]。缓存亲和路由也已
产品化:一个生产路由器提供 6 种策略并以 radix 树亲和为头牌
[vllm-project-router],另一个在 2P+2D 实测把吞吐从
23.7 req/s 提到 91.6 req/s [ZhaiFeiyue-mori-scheduler]。
混合架构的机制侧也已经有引擎实现把 KV 页与 SSM 状态收进同一棵树
[tokenspeed],但那个引擎自身是 preview 状态、多个核心 PR
未合并 [tokenspeed]。
策略层:迁移中,而且迁移速度取决于负载类型而非技术成熟度。 从 LRU 到 workload-aware 的迁移
已有明确证据链,且落地成本极低——单实例替换淘汰函数、每次 79 微秒、占调度开销 1.2%
[2506.02634]。但在云 API 负载上净收益很薄:相对最优基线仅 +1.5–3.9% 命中,
真正有效的区间只有"多类型 + 容量受限" [2506.02634]。在 agent 负载上同一迁移的
收益完全不同量级:工作流感知的淘汰 + 预取相对分层缓存基线 1.83–2.19 倍
语义分级 + 单元上抬把吞吐从 0.6–2.2 QPS 抬到 6.8–9.1 QPS [2511.01633]。
但这两条 agent 侧证据的采纳成熟度都远低于其数字:一个未合入上游主线也未公开代码
[2507.07400],另一个是未开源的 vLLM 分支、核心 patch 未公开
[2511.01633]。所以策略层的正确读法是:**技术上已被证明、在 agent 负载上
收益很大、但可复现的落地物几乎不存在**。
路由层:从"命中率优先"迁向"多目标",且已有上游实现。 把前缀命中折成 true-FLOPs 记账、让
负载均衡成为饱和副产品的方案已经落在一个主流引擎版本上、声称单 flag 启用
[2605.02960],这是本主题里少见的"策略层直接进上游"的例子;
它的可移植性仍未验证 [2605.02960]。与此同时路由层开始承认前缀亲和不是
唯一目标,需要与专家局部性、负载、网络延迟共同求解 [2607.00466]。
跨模型与跨上下文复用:研究前沿,采用证据薄弱,且新成员把这一支的验收标准问题暴露得更清楚。
训练时保证范式的两篇代表都未公开代码,其中一篇是零外部引用的预印本
[2602.12029],另一篇缺少与其宣称的直接前驱的正面对比
[2603.13281]。近似跨上下文复用同样未公开实现
[2510.12872]。编译期工作流优化的源码只有 demo 级,且配套版本号
与现实不符,可复现性存疑 [2603.16104]。跨参数集换算也未公开实现
[2608.03893],而它最站得住的贡献不是方法而是量具——一套子空间
感知的诊断,以及"重构指标不预测可转移性"这条负面结论;后者在邻居那里被独立撞见过一次,因此
可信度高于单篇 [2608.03893]。整支闭源这件事本身是一条结论:一个每篇结论都依赖
"近似到什么程度还能用"的子领域,恰好整体不可复现 [2608.03893]。
混合模型前缀缓存:押注型前沿,但工程侧已被抢先落地。 策略侧的开源实现带完整制品附录,
可复现性强于同簇多数工作 [2411.19379],
而它的价值与混合架构是否成为长上下文默认选择绑定——收益随 SSM 层比例和状态维度单调增长
[2411.19379]。这条押注在 2026 年得到了一个间接确认:已经有引擎为
attention+Mamba 混合模型内建了统一的前缀缓存与多 cache group
[tokenspeed],也就是说架构趋势正在把机制侧的投入变成必需品,即使策略
侧的最优解还没定。
趋势方向:加速,重心继续上移,并且开始长出"正确性"这一维。 四个信号指向同一判断。第一,
引擎内的低垂果实已被采摘完,新工作全部在引擎之上(路由、工作流、合约)或之下(存储路径)
[2603.16104]。第二,出现了"元层"工作——为复用定义合约与一致性测试而不是
再提一个策略 [2605.24259],这通常是一个方向开始收敛的标志。
第三,路由层开始承认前缀亲和不是唯一目标 [2607.00466],甚至开始出现把
复用量显式设为零的配置 [2605.02960]。第四,也是新出现的:缓存的正确性
第一次成为独立议题——一侧是把资源安全提到编译期的类型系统尝试
[tokenspeed],另一侧是近似写入方带来的、尚无任何机制
应对的保真度污染
一个方向开始讨论"命中的东西对不对"而不只是"命中率多高",通常意味着它已经度过了性能红利期。
但它们改变的是本主题的损益点:加载与重算的交叉点在 32 Gbps 下要 256K token 才翻转
[2510.09665],而 GPU 直驱路径把交叉点推到 98.3% 命中率
[2605.03375]。建议的划界:介质与带宽机制归那边,"要不要为了复用
而下沉、下沉哪一块"归这边。CacheGen 与 Tutti 两篇天然骑墙——前者的传输压缩服务于复用
[2310.07240],后者的淘汰/复用策略直接沿用引擎的前缀缓存
[2605.03375]。新增的骑墙案例把这条界线画得更清楚:主动预取本身是搬运
优化,但它的触发信号来自工作流拓扑,也就是本主题的结构信号
当 cache overlap 只是代价模型里的一项、与 RTT 和排队并列时
[2602.11688],重心已经移到部署那边。同理,把前缀路由与 MoE 专家权重流式化
绑成一个饱和条件的设计,主体是 MoE 并行策略、前缀复用只是它的记账口径
[2605.02960],因此它在本主题里是边缘成员而非核心成员。
agent 侧的主题上 [2606.09916]。边界判据:
决定"上下文里保留什么内容"是那边,决定"已算出的状态怎么被再次使用"是这边;两者在槽位
布局这一层真实纠缠 [2606.09916]。这条界线现在多了一个更硬的骑墙者:把
agent 拆分方式与缓存优先级边界设计成同一件事的工作,其精度收益(R-L +38%)属于那边、其缓存
收益(命中率 +17.7%)属于这边,两者是同一次设计选择的两个投影
[2511.01633]。建议:凡是"改 agent 结构以改善复用"的工作在两边
都登记,但效用主张必须分开陈述。
"何时切换模型"这个决策直接接壤。跨参数集复用的动机完全来自那边(cascading 与会话中途切换)
[2608.03893],而它的正确验收标准也只能由那边
提供(双端点分母)
建议的划界:"该不该切换"归那边,"切换之后已算的状态还能不能用"归这边;但本主题在报告
跨模型复用收益时必须采用那边的度量,否则会系统性地把收益记在错误的子群上。
KV,验证步不必重算 [2603.13281];以及小 batch、长前缀的投机解码 decode
形态本身就是前缀复用最受益的 regime [tokenspeed]。这条线仍然
太细,不建议合并。
前者绕过的是整次调用,后者绕过的是 prefill。二者在批量工作流里会同时出现——按确定性算子
做整算子级缓存与按前缀做 KV 复用是同一系统里的两层
[2603.16104]——但语义等价性判定与 KV 位级恒等是完全不同的
正确性论证,应保持分离。检索结果的映射缓存是同一类东西的第三个例子
独立成题"。现在这条线有三个成员,但不应该按原设想拆分,因为第三个成员打破了它的同质性:
前两个用训练时约束换恒等,因此准入条件是"能否重训"[2603.13281];
第三个免训练但只给近似,因此准入条件是"能否只读白盒访问 + 这对模型是否通过对级筛选"
[2608.03893]。修正建议:不按"跨模型"拆,按保真度拆——把"精确复用(含
训练时恒等)"与"近似复用(含跨上下文与跨参数集)"分成两条,因为这两条的验收标准(命中率与
容量 vs 质量门控与出处)几乎不共享任何东西
在真的拆分之前,本文档应把"保真度"当作与命中率、容量并列的第三根轴来组织。
| Entity | Categories | Role in topic | Key contribution |
|---|---|---|---|
| [2312.07104] · [2312.07104] | framework | 机制基线 | radix 树 + LRU + 最长共享前缀优先调度,并证明该贪心等价离线最优 DFS;引擎内复用的原点 |
| [2411.19379] · [2411.19379] | framework | 范式转折 | 不可回滚状态下的"全有或全无"复用;把重心从淘汰移到准入,效用从 recency 换成 FLOP-per-byte |
| [2506.02634] · [2506.02634] | framework | 经验基准 | 生产 trace 画像:理想命中率 62%/54%、单轮支配、寿命极短;据此删掉 Frequency 项 |
| [2403.19708] · [2403.19708] | framework | 未来信号先驱 | 用调度器队列当预言机驱动预取/淘汰;把 99.6% 以上命中挪进 DRAM;解耦位置编码使截断后仍可复用 |
| [2507.07400] · [2507.07400] | framework | 结构性未来落地 | 工作流拓扑 → steps-to-execution,下沉到 radix 节点、共享节点取最小值;主动预取 + 四态状态感知调度;并实测反应式回载可反向劣化到基线 0.57 倍 |
| [2511.01633] · [2511.01633] | framework | 复用单元与语义分级 | 把复用单元从碎片事实抬到 vertex chunk(+17.7% 命中);agent 边界即缓存优先级边界,四级优先级取代单队列 LRU |
| [2510.09665] · [2510.09665] | framework | 外置化 | 引擎无关的 KV 层 + 上游化连接器 API + 管理面;块级替代页级搬运把带宽从 88 提到 400 Gbps |
| [2310.07240] · [2310.07240] | framework | 传输侧代价 | 放弃张量形状约束,把 KV 当视频编码,体积降 3.5–4.3×;带宽不足时降级回文本重算 |
| [2605.24259] · [2605.24259] | framework | 元层合约 | 常驻/在飞/未来准入三资源分解与可行性不等式;把静默的常驻损失变成可归因的显式拒绝 |
| [2605.03375] · [2605.03375] | framework | 复用经济性 | 把 CPU 移出 GPU↔SSD 的数据与控制路径,把 I/O 气泡超过计算的交叉点推到 98.3% 命中率 |
| [2602.12029] · [2602.12029] | framework | 跨模型恒等 | 冻结共享 prefill 模块 + cache-conditioned 微调;内存主导项对模型数近似不敏感;分母取"拒绝共享时会部署的东西" |
| [2603.13281] · [2603.13281] | framework | 跨模型恒等 | 冻结逻辑编码器保证 KV 跨模型逐位恒等;消除逐层敏感性选择 |
| [2405.19888] · [2405.19888] | framework | 结构信号先驱 | Semantic Variable 把 prompt 结构与请求 DAG 暴露给服务端,使运行时生成的上下文也能共享 |
| [2607.00466] · [2607.00466] | framework | 竞争性局部性 | 证明前缀亲和不是路由层唯一目标;专家签名做成与 KV block 同索引以在前缀命中时保持精确 |
| [2605.02960] · [2605.02960] | framework | 复用作为调度决策 | 前缀感知路由 + true-FLOPs 计价(1 次前缀 + N 次后缀),均衡成为饱和副产品;并提供本主题唯一把复用量显式设为零的配置 |
| [tokenspeed] · [tokenspeed] | framework | 机制统一与编译期安全 | 单棵 radix 树同时管 KV 页与 Mamba 状态、多 cache group 区分滑窗/全历史层;13 态 FSM + RAII 把缓存资源安全提到编译期;retraction 取代重新 prefill |
| [2509.02121] · [2509.02121] | agent | 计划级复用 | 把整批同模板工作流合并成一个计划,复用写成代价模型里的折扣系数并求解放置 |
| [2603.16104] · [2603.16104] | agent | 编译期精确复用 | 模板化 radix 树同时编码前缀层级与算子依赖;命中率比在线最长前缀匹配高 32.9 个百分点 |
| [2510.12872] · [2510.12872] | agent | 近似跨上下文复用 | RoPE 对齐 + anchor 池估计跨前缀 KV 偏移,免训练;失败即回退稠密 prefill;解码后验证再提交以防污染 anchor 池 |
| [2606.09916] · [2606.09916] | agent | 复用×剪枝兼容 | 用死槽位重定向替代压实,保住前缀身份;把剪枝下的前缀命中率从 0–3% 恢复到 20.7% |
| [2602.11688] · [2602.11688] | algorithm | 目标函数重估 | 把 overlap 折算成毫秒与 RTT 相加;给出"高命中反而更慢"的直接反例;路由平面刻意只保留轻量近似 trie |
| [2608.03893] · [2608.03893] | algorithm | 跨参数集近似复用 | 闭式 per-head ridge 让接收方直接从发送方 KV 解码,免训练;四对保住 73–98%、两对崩到 42–44%;三部件里只有跨层选源有实测正贡献;引入按有序模型对索引的资产与保真度污染两笔新账 |
| [sgl-project-sglang] | code | 生产实现 | radix 缓存按子树粒度淘汰 + 分层卸载;节点上只有管驱逐安全的引用计数、无出处字段;40 万块以上 GPU 的部署证据 |
| [vllm-project-router] | code | 路由实现 | 字符级并发 radix 树 + 两段式亲和/负载切换,避开路由热路径上的分词延迟 |
| [ZhaiFeiyue-mori-scheduler] | code | 路由实现 | 复制 4 种引擎的 5 种 block hash 算法做逐位精确匹配 + 跨节点 KV 索引 + 分离的 prefill/decode 策略链;用命名空间隔离防止跨引擎静默错命中 |