arXiv'26 | Cross-Model KV Transfer:小模型算好的 KV Cache,大模型直接接着用
arXiv’26 | Cross-Model KV Transfer:小模型算好的 KV Cache,大模型直接接着用
原文:Cross-Model KV Cache Transfer in LLM Families: A Closed-Form Linear Mapping for Prefill Reuse
1. 前言:先把背景交代清楚
你有没有想过这样一个问题:同一个对话里,为什么从小模型切换到大模型,前面聊过的内容要整个重新算一遍?
先把”重新算一遍”这件事的代价说具体。LLM 推理分两个阶段:prefill 阶段把整段 prompt 并行喂进去,产出两样东西——第一个 token 的概率分布,和每个 token 位置的 K/V 向量(也就是 KV Cache);decode 阶段每生成一个 token,都要把历史 KV 从显存里读一遍。注意一个常被忽略的事实:prefill 的计算产出物本质上就是 KV Cache。也就是说,”重新 prefill”和”重新算一遍 KV Cache”是同一件事。
那为什么会有”重新 prefill”的需求?因为现在的线上系统越来越离不开模型家族这个概念。Qwen3 有 4B/8B/14B/32B 一整排,Llama 3.1 有 8B/70B,Ministral 有 3B/8B/14B。围绕家族出现了三种很自然的玩法:
- 级联调度(cascade):简单问题走小模型省钱,检测到难题再升级大模型;
- 会话中途换模型:对话前几轮用便宜模型顶着,用户开始问硬核问题了再切大模型;
- 家族内路由(routing):一个 router 在家族成员间动态选模型。
这三种玩法有一个共同的隐形税:每次切换,接收方模型都要把累积的上下文从头 prefill 一遍。 长对话切一次模型,TTFT 直接多几秒——这在产品体验上是很难接受的。
所以这个问题可以抽象得非常干净:A 模型算好的 KV Cache,能不能直接变换成 B 模型的 KV Cache? 而且注意这是双向需求的:小→大是质量升级(升级后不用重算),大→小是成本降级(长上下文阶段切回小模型省 decode 成本)。
在讲这篇论文的方法之前,先把我之前写过的两篇 KV 复用文章放这,它们和本文正好构成一条完整的线:
- 《KVCOMM》:同一个模型内部,多个 Agent 共享相同前缀的 KV——它的洞察是不同 Agent 的 system prompt / 工具描述高度重叠,把这份 KV 在 Agent 间”通起来”,TTFT 砍 7.8 倍;
- 《SemShareKV》:更进一步,用 LSH 做语义级共享——不用前缀完全相同,意思相近的段落也能共享 KV。
这两篇的共同前提都是”同一个模型“:KV Cache 是模型私有的记忆,换个模型就作废。今天这篇(arXiv 2608.03893)补的就是最后这块拼图:跨模型的 KV 空间对齐。它的结论出人意料地简单粗暴:同一家族的两个模型之间,KV Cache 近似差一个线性映射——而线性映射有闭式解,一行矩阵求逆就能算出来,完全不需要训练。
在 Qwen3 14B→32B 上,转换后的 KV 直接喂给 32B,五个 benchmark 平均保住 97.6% 的准确率;32K token 的上下文,重新 prefill 要 6975ms,KV 转换只要 277.6ms,快 25 倍。
2. 前置知识:跨模型 KV 复用,前人卡在哪
跨模型 KV 这个方向其实已经有几篇工作了,先看它们为什么不够用,才能理解这篇的定位:
| 方法 | 核心思路 | 问题 |
|---|---|---|
| C2C(Cache-to-Cache) | 给每个模型对训练一个神经 fuser,融合两个模型的 KV | 每一对模型都要梯度训练,成本高、泛化差 |
| LatentAlign | 给每个模型学一个 adapter,把各自 KV 投到共享 latent 空间 | 同样需要训练每个模型的 adapter |
| IAM | 不搬 KV 值,把小模型的 attention pattern(注意力模式)代入大模型 | 无梯度,但传的是 pattern 不是 cache,复用度有限 |
| DroidSpeak | 在架构完全相同的微调变体之间(如同 base 模型和它的 SFT 版)直接共享 KV | 无梯度,但只支持同构微调对,不支持跨规模(8B→70B 这种) |
理想形态需要同时满足四条:无梯度训练、跨规模、传输 KV 值本身、闭式解。前四篇各占一到两条,这篇是第一个全占的。为什么”无梯度”这么重要?因为跨模型的组合是 $O(n^2)$ 的——一个四模型家族就有 12 个有序对,如果每对都要训练,这个方法就只能是论文 demo;如果是闭式解,每对就是”跑一次最小二乘”的事,部署成本完全不同量级。
3. 关键观察:跨模型的 KV 有线性结构
整个方法能成立,全压在一个实证观察上:同一家族里,两个模型的 KV Cache 之间存在显著的线性关系。
怎么验证?把源模型第 $l$ 层的(处理过的)key/value 作为自变量 $X$,目标模型对应位置的 key/value 作为因变量 $Y$,做线性回归,看 $R^2$(方差解释率)。在 Qwen3 14B→32B 上:
| 源层数 k | K 的 R² | V 的 R² |
|---|---|---|
| 1 | 0.5572 | 0.3249 |
| 8 | 0.7914 | 0.6541 |
| 全部 | 0.8451 | 0.7645 |

三个值得划重点的细节:
(1)单层就能解释 56% 的 key 方差。这说明两个模型的中间表征不是”语义上有点像”那种模糊的相似,而是近似线性可达的——这个数字给了线性映射合法性。
(2)key 比 value 好预测约 0.2 个 R²。为什么?key 承载的主要是”检索信息”(这个 token 该被谁注意到),在同族模型里检索结构高度保守;value 承载的是”内容信息”,模型规模变大后内容表征会重新组织,漂移更大。这个不对称后面选 MLP 补救时还会用到。
(3)RoPE 会污染拟合。key 在存进 cache 前被 RoPE 旋转过——位置信息乘在内容上,导致”第 5 个 token 的 key”和”第 5000 个 token 的 key”即使内容一样,数值也完全不同。直接拿带 RoPE 的 key 拟合,$R^2$ 会显著掉,而且”哪层源最相关”的结构变得模糊;把 RoPE 剥掉再拟合,层与层之间的对角结构立刻清晰。这个观察直接催生了方法的第三个组件。
为什么同族模型的 KV 会有线性结构?我的理解是:家族模型本来就是同一份数据、相近的 tokenizer、相近的配方练出来的,中间层学到的特征空间高度同构——尤其 key 这种低频检索结构,几乎是”家族指纹”级别的保守量。论文没有从理论上证明这一点(也不需要),但把它量化到”一个 per-head 线性映射能搬 97% 的信息”,本身就是很有价值的实证贡献。
4. 方法:每头一个闭式 Ridge,三个组件拼起来
整条 pipeline 长这样:源模型正常 prefill 出 KV Cache → per-head 线性映射把它变换成目标模型的 KV 格式 → 目标模型跳过 prefill 直接 decode:

方法由三个组件构成,逐个拆。
4.1 Per-head Ridge 回归:一行闭式解
对目标模型的每个 (layer $l$, head $h$),K 和 V 各学一个独立的线性映射。设计矩阵 $X$ 是源模型 top-k 个源层的 KV 拼接($N \times (k \cdot n_{kv} \cdot d_h)$ 维),$Y$ 是目标模型该 head 的 K 或 V($N \times d_h^t$ 维)。解就是标准 ridge:
\[W^* = (X^\top X + \lambda I)^{-1} X^\top Y, \quad \lambda = 0.01\]几个工程细节值得说:
- 为什么是 ridge 不是 OLS:top-k 源层是按”最相关”挑出来的,它们彼此特征高度相关,$X^\top X$ 接近奇异,裸 OLS 数值上会炸。加 $\lambda I$ 正则后稳定,且 $\lambda$ 在四个数量级上扫描结果都很平(只有 $\lambda=1$ 这种离谱值才崩,HellaSwag 掉 15.79pp)——说明这个超参很钝,不挑;
- bias 的处理:$X$、$Y$ 先中心化再求解,$W^$ 只估斜率,事后按 $\ b = \bar{Y} - \bar{X}W^$ 把偏置补回来;
- 计算量的去向:拟合的大头是 $X^\top X$($O(N d_s^2)$),每个目标层只算一次、层内所有 head 共享——这就是”47 分钟拟合一整对模型”的来源;
- head 之间零共享:每个 (l, h) 一个独立的 $W_K^{l,h}$ 和 $W_V^{l,h}$,不跨 head、不跨 K/V 共享参数。线性映射本来就便宜,没必要共享。
翻译成代码,核心就是这几行(拟合阶段):
def fit_head_mapper(X: torch.Tensor, Y: torch.Tensor, lam: float = 0.01):
# X: [N, d_src] 源模型 top-k 层拼接的 K(或 V),已剥 RoPE、已中心化
# Y: [N, d_tgt] 目标模型同位置的 K(或 V),已剥 RoPE、已中心化
d_src = X.shape[1]
XtX = X.T @ X # 每层一次,层内所有 head 共享
XtY = X.T @ Y
W = torch.linalg.solve(XtX + lam * torch.eye(d_src), XtY) # 闭式解,无梯度
return W # 推理时: Y_hat = X_centered @ W + b
4.2 跨层源选择:不是同层对同层
第二个反直觉的组件:目标层的 KV 不是只从源模型的同层映射,而是从”最有预测力”的 k 个源层拼起来映射。
注意这和我们训练模型时的直觉相反——第 20 层的表征不一定最像另一个模型的第 20 层(两模型深度、宽度都不同),真正该问的是”目标第 20 层的 K 能被源模型的哪几层线性表出”。论文用贪心前向选择(greedy forward selection)回答这个问题:
def greedy_forward_selection(X_layers, Y, max_k):
# X_layers: {源层id: 该层所有 token 的 K} Y: 目标层所有 token 的 K
selected = [best_single_layer_by_R2(X_layers, Y)] # 1. 从单层 R² 最高的源层起步
while len(selected) < max_k:
# 2. 每轮加入能让"联合 R²"提升最大的那个源层
gains = {j: joint_r2(X_layers[selected + [j]], Y) for j in all_layers - set(selected)}
selected.append(argmax(gains))
return selected # 3. 产出 k=1..all 的整条曲线
结论:收益集中在 k=1→4,k=6 就到全层 R² 的 92.3%(key)/ 87.7%(value),之后再堆源层是边际递减。生产上不用逐对跑贪心(那是分析工具),直接按”单源 head 平均 R² 排序取 top-k”固定下来,同层所有 head 共享一套源层选择。
消融里这个组件是贡献最大的单项:k 从 8 砍到 1,ARC-C 从 61.60 崩到 27.65,PPL 从 7.33 崩到 22.73——单层信息量远不够,跨层拼接才是主力。
4.3 RoPE 因式分解:让映射与位置解耦
第三个组件解决”位置编码污染”。源 key 存的是 $K_s R_{\Theta_s}$(内容乘上源模型的 RoPE),直接映射会把”位置分布”也学进权重里——校准用 1024 token 的短序列,权重就绑死在这个位置分布上,换上下文长度就失效。
做法是把位置”剥掉-映射-再穿上”:
\[\hat{K}_t = \big(K_s\, R_{\Theta_s}^{-1}\, W_K + b_K\big)\, R_{\Theta_t}\]- $R_{\Theta_s}^{-1}$:源模型 RoPE 的逆旋转——RoPE 是正交旋转,求逆是精确且免费的(转置即可),剥完得到无位置的 content key;
- $W_K$:在无位置空间里做线性映射(校准时目标侧同样剥 RoPE,权重完全 position-free);
- $R_{\Theta_t}$:套上目标模型自己的 RoPE——两模型 RoPE 配置不同也无所谓,反正位置是在最后一步才穿上的。
value 不编码位置,直接 $ \hat{V}_t = V_s W_V + b_V$。
这一步的必要性有硬数据:推理时不做重旋转,MMLU 从 78.09 崩到 25.79(随机水平)、GSM8K 崩到 4.17;而 HellaSwag 只掉 5pp——因为 HellaSwag 这种局部语言建模任务对位置不敏感,MMLU/GSM8K 这种需要全局结构的任务会立刻暴露位置的错位。这个对比也侧面说明:评测集选不对,坏掉的组件根本测不出来。
4.4 校准与部署开销
- 数据:FineWeb-Edu 500 条 × 1024 token,stride-4 子采样后每个目标 head 约 128K 个 token 级观测。稳健性:200 条之后饱和,50 条也只差 1.6pp;校准域比数据量重要(CodeAlpaca 校准比 FineWeb-Edu 掉 5.24pp,Wikipedia 只掉 1.05pp);
- 拟合算力:单节点 8×H100,每对模型 47–87 分钟(Qwen3 14B→32B 约 52 分钟),全程无反向传播;精度上前向 bf16、协方差 fp32;
- mapper 体积:每对 1.01–3.36B 参数(4–12GB)——不小,但不需要常驻 GPU,可以从 CPU/磁盘按需 page in(80–480ms,每次切换付一次),因为切换模型本来就是低频事件;
- 适用边界:同家族、KV head 数与 head dim 匹配、dense full attention。GQA 结构不匹配的不行,MLA 这种 latent 压缩的更不行;每个方向各需一个 mapper(14B→32B 和 32B→14B 是两个不同的映射)。
5. 实验:保真度、延迟、漂移三本账
5.1 保真度:能保住多少?(Table 1)
先定义指标。Retention = 转换后准确率 ÷ 目标模型独立 prefill 的准确率 × 100%。还有个更严苛的 floor-normalized 版本:把随机_chance 定为 0%、目标独立运行定为 100%,专治”低分对看起来还有 40%”的错觉。
| 迁移方向 | k | 平均 retention | 关键项 |
|---|---|---|---|
| Qwen3 14B→32B | 8 | 97.6% | HellaSwag 101.0%(超过独立运行),GSM8K 95.6% |
| Qwen3 8B→32B | 12 | 87.5% | GSM8K 掉到 68.8% |
| Llama 3.1 8B→70B | 20 | 72.8% | HellaSwag 94.4%,但 GSM8K 只有 18.2% |
| Ministral 3 3B→8B | all | 76.2% | |
| Ministral 3 3B→14B | 20 | 44.2% | floor-normalized 只剩 14.7%,基本不可用 |
| Ministral 3 8B→14B | 12 | 41.6% | floor-normalized 11.1%,不可用 |

规律很清楚:同代、尺寸相近的家族对是甜点(14B→32B 几乎无损),跨得越远崩得越狠;推理类任务(GSM8K)比语言建模类任务(HellaSwag)敏感得多。这个边界本身就有工程价值——级联系统可以据此决定哪几档之间值得开 KV 转移、哪几档老实重新 prefill。
5.2 延迟:省多少?(Table 5)
Qwen3 14B↔32B、32K token:重新 prefill 6975ms vs mapper 277.6ms = 25×(小→大);大→小是 2952.7ms vs 427.1ms = 7×。整个 64–32K 区间、七个迁移对、70 个测试格 mapper 全部更快,总范围 2.7×–25.1×。

为什么大→小省得少?因为小模型的 prefill 本来就便宜,能省的基数小。这也符合业务直觉:升级方向的收益(用户等不起大模型 7 秒 prefill)恰恰是最大的。
5.3 多轮会话会不会漂?
CoQA 十轮多轮 handoff(14B↔32B 交替使用对方的 KV):小→大的差距从第 1 轮到第 10 轮只扩大 1.7pp;大→小每轮线性漂移 0.33pp。十轮之内不会级联崩坏——误差没有复利效应,这是”会话中途换模型”能上线的安全垫。
5.4 闭式解不够的地方:MLP 补位,以及一个有趣的归因
Ridge 在它擅长的对上和 MLP 打平(97.6% vs 97.3%),但在崩掉的对上 MLP 能救回来很多:Ministral 3B→14B 从 68.0% 拉到 92.3%(+24.3pp)、8B→14B 从 58.7% 到 95.5%(+36.8pp)。
更有意思的是论文对”为什么 MLP 能救”的归因分析:决定保真度的不是误差的大小,而是误差落在哪个子空间。MLP 的增益恰好对应把残差从 attention 敏感的方向挪开(失败对上 K-concentration Δ≈−2.5、cosine Δ≈+0.45)。两个佐证:
- attention 输出的 cosine 相似度与最终 retention 的相关性 r=+0.57;
- 校准时的 R² 与 retention 的相关性 r=−0.20——基本不相关!
“拟合得好”和”用得好”是两件事:R² 衡量的是全空间平均误差,而 attention 只对某些子空间敏感。这个结论对以后所有做 KV 压缩/量化的工作都适用:评测拟合质量请直接测下游,别只看 R²。顺带地,attention-output cosine 可以当一个便宜的”这个模型对能不能转移”的事前预测器。
6. 我的 Take
一,KV 复用这条线的版图补全了。 从”同模型同前缀”(prefix caching,vLLM/SGLang 标配)→”同模型语义共享”(SemShareKV)→”多 Agent 共享”(KVCOMM)→”跨模型搬运”(本文),每一层的适用范围和代价都清晰了。工程组合拳也顺理成章:同族切换用 KV Transfer,跨族切换乖乖 prefill。
二,”闭式解”这个形态选对了。 它把跨模型 KV 复用从”研究问题”压成了”部署时的一次性成本”(一对模型 52 分钟 + 一次磁盘存放),这是能进推理框架的形态。哪天 vLLM 里出现 --kv-transfer-adapter 这种启动参数,我不会意外。
三,边界要诚实。 只支持 dense attention 同构 KV 家族对,GQA 不匹配、MLA 压缩都无解;Ministral 那两个失败对说明”家族”的假设并不总成立。它买到的是家族内的廉价切换,不是万能 KV 翻译器——但就这个受限场景(而它恰好是 cascade/routing 的主流场景),97.6% retention + 25× prefill 节省,这笔账很划算。
如果这篇文章涉及的 KV Cache、LLM 推理优化你想系统深入,可以看看我之前出版的《动手学AutoML:从 NAS 到大语言模型优化实战》,书里有专门一章讲 LLM 推理效率与 KV Cache 优化,本文的 prefill 复用正是那一章的主线问题。
