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

跨模型 KV 的线性结构

三个值得划重点的细节:

(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:

KV 转换 pipeline

方法由三个组件构成,逐个拆。

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 = 。整个 64–32K 区间、七个迁移对、70 个测试格 mapper 全部更快,总范围 2.7×–25.1×。

重 prefill vs KV 转换延迟

为什么大→小省得少?因为小模型的 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 复用正是那一章的主线问题。

动手学AutoML书籍封面

Flag Counter