预编译文档 KV 缓存、冻结模型直接复用,SemPIC 把 micro-F1 从 0.53 拉到 0.60

SemPIC: Learning Semantic Position-Independent KV Caches

Hui Xie, Peng Xiao, Yutong Deng\textsuperscript, Shuoran Dou, Jian Yang, Jinyang Guo

cs.AI

2026-07-30

北航 SemPIC 用 LoRA Writer 离线把每篇文档编译成原生 KV 缓存,供冻结的原模型跨查询复用,三模型四任务上把 micro-F1 从 KV Packet 的 0.53 提到 0.60,逼近全量重算 0.62,命中路径零重算。

这篇在解决什么

RAG 和 agent 推理经常反复查同一批文档,只是每次的指令、对话历史、文档排列顺序不同。前缀缓存(prefix cache)只在内容紧跟在一个完全相同的前缀后面时才命中,换个问法或换个顺序就失效。位置无关缓存(position-independent caching,PIC)走另一条路:把每篇文档的 KV 缓存预先独立算好,请求时拼起来用。问题在于,一篇被独立编译的文档,从没见过它在真实请求里前面的上下文。RoPE 重旋能修好位置相位,却补不回编译时根本不存在的上下文注意力。在标准因果解码器下,缝起来的缓存位置是对齐的,但上下文是残缺的,质量会塌。

直接把独立缓存拼起来(论文的 No Recompute 基线)有多差:三个模型四个任务上整体 micro-F1 只有 0.17,而完整重算是 0.62。这说明「上下文不完整」不是小毛病,是会让缓存复用彻底失效的硬伤。

现有修法分两派。在线选择性重算(CacheBlend、EPIC、Cache-Craft、CacheClip、ProphetKV、QCFuse)把一部分文档计算放回请求路径上修补;离线改造派要么只动文档边界(KV Packet 给每篇文档加 Header/Trailer 边界 token),要么给 Reader 加外挂(COMB 接一个额外编码器、改读取接口)。SemPIC 的作者先做了一步诊断:拿 KV Packet 这种「边界条件化」基线看,它把可复用块边界附近的注意力偏差压得很低(前区误差 0.016 到 0.081),可块内部的偏差仍然高(0.664 到 1.257,12 个设置里只有 8 个低于 1)。结论是只补边界远远不够,得改文档表示本身。

方法

核心是 Writer-Reader 分离。Writer 是基座模型外加一层 LoRA,逐篇独立处理文档,产出每一层原生的 Key/Value;它只在离线建缓存时存在。Reader 是冻结的基座模型,关掉 LoRA,直接消费编译好的缓存。线上 served 的就是 Reader,接口一个参数都不改。

这里有个关键的工程细节:关掉 LoRA 适配器,并不会切断 KV 张量的梯度。于是每一层的 K/V 同时扮演两个角色,既是被冻结 Reader 消费的复用表示,又是把损失回传给 Writer 的可微接口。这让「Reader 不变」和「Writer 仍可优化」能同时成立。

训练目标是行为蒸馏(behavioral distillation)。教师是基座模型看到完整上下文后产出的输出分布,学生是 Writer 编译缓存、冻结 Reader 读这些缓存后产出的分布,两者在每个位置、每个头上做 KL 散度,温度取 1。用一句话讲:让 Writer 学会产出一份缓存,使没见过真实上下文的冻结 Reader,表现得像见过一样。配置上 LoRA rank 8、scale 16、学习率 5e-4 线性衰减、5 个 epoch、bfloat16,每个模型-领域组合训一个 Writer。

命中服务那一步很朴素。编译好的 SemPIC 缓存就是普通模型缓存:命中时给它分配最终逻辑位置、按位置编码公式重旋 RoPE 键、把请求侧的 inline token 走一遍预训练解码器、在因果 mask 下把编译缓存和 inline 缓存交错,然后正常自回归解码。请求路径上既没有文档侧前向,也没有重算,这是它相对在线选择性重算派的主要卖点。

为了让长文档的 Writer 训练训得动,论文提出 KV Gradient Checkpointing:在 Writer 每一层做梯度检查点,只保留隐状态和这一层的 K/V,丢掉层内中间量,反向时再重建。有个容易错的点:检查点必须还原带 LoRA 的上下文,否则反向会用关掉 LoRA 的配置重算,Writer 就训歪了。此外还试了个 Joint 变体,把 SemPIC 的文档级 LoRA 和 KV Packet 的边界 embedding 一起训,用来验证文档级适应和边界适应是不是互补。

结果

主表是三个模型(Llama-3.1-8B、Qwen3-4B、Qwen3-8B)× 四个任务(合成 Biography、HotpotQA、MuSiQue、NIAH)的 corpus micro-F1。

方法Overall 平均
Full Recompute(质量上限)0.62
No Recompute(直接拼缓存)0.17
KV Packet0.53
SemPIC0.60
Joint(SemPIC + Packet 边界)0.61

SemPIC 在 12 个设置里 10 个超过 KV Packet,Qwen3 的 8 个设置全部不低于 KV Packet。分模型看,真正拉开差距的是 Qwen3:4B 从 Packet 的 0.49 涨到 0.59(+0.10),8B 从 0.45 涨到 0.58(+0.13);Llama 上两者打平,都是 0.64。唯一明显反例是 Llama 的 MuSiQue,SemPIC 单独只有 0.28,低于 KV Packet 的 0.37,但加上边界的 Joint 能回到 0.38。

注意力诊断和分数走向一致:SemPIC 把块内部注意力偏差 Rint 从 KV Packet 的 0.664 到 1.257 降到 0.564 到 0.985,12 个设置全部下降。跨域迁移(Qwen3-8B)上,混合领域训练时 KV Packet 平均 0.51,SemPIC 和 Joint 都到 0.57;15 个训练源里 SemPIC 在 14 个上超过对应的 KV Packet 平均。显存方面,在单卡 A100 80GB 上,梯度检查点把 Qwen3-8B 峰值从 23.8 降到 18.0 GiB(batch 1)、75.8 降到 33.2 GiB(batch 8),HotpotQA、MuSiQue、NIAH 从直接 OOM 变成可训。代价是小 batch 下训练变慢(Biography 从 34 分钟增到 115 分钟),大 batch 几乎无开销。

为什么重要

对反复查同一批文档的 RAG 和 agent 服务(知识库问答、文档检索、agent 记忆),把文档 KV 缓存预编译一次、跨查询复用,能省掉每次请求重新 prefill 文档的开销,直接压首 token 延迟。现有离线 PIC 要么只补边界,要么得改 Reader 接口加外挂。SemPIC 第一个证明可以直接训练文档侧的表示本身,而推理用的模型一个参数都不用动。部署上的卖点正是 Reader 不变:线上跑的是原模型,只是缓存是预编译过的,不用换推理框架、不用改解码路径。

它和在线选择性重算是互补而不是替代。离线派把代价在建缓存时提前付掉,在线派把文档计算放回请求路径。论文也说没有一种方法在所有任务上占优,选哪个看部署允不允许在线重算。要诚实的是,它在 Llama 上和 KV Packet 打平,真正拉开差距的是 Qwen3,而且每个领域要单独训一个 Writer,不是即插即用。

局限与存疑

作者自己承认,注意力偏差的下降和 F1 的提升之间只有同向相关性,因果没被证明,「证据是描述性的」。块局部的伪影也还在:SemPIC 之后,块内第 1 个 token 的注意力密度比 T1 仍高达 132.5 到 3248.3,而偏移 2 到 8 只有 0.61 到 23.49,attention sink 依然集中在块首,没被消掉,只是和更好的任务表现并存。

单看 SemPIC 在 Llama MuSiQue 上(0.28)反而不如 KV Packet(0.37),得靠 Joint 救回。训练显存方面,梯度检查点在小 batch 下时间开销大(训练时间约 3 倍),论文明确说这是显存-时间权衡,不是吞吐量结论,而且命中服务路径不受影响。每个 model-domain 组合要单独训一个 Writer,通用单一适配器还没给出;混合训练迁移不错(0.57),但跨域仍是开放问题。论文也声明,报告的权衡曲线没覆盖未评测的重算预算,也没给端到端的 cache-miss 延迟。

术语

原文与代码

社区讨论

相关论文

全部论文解读