无需重新预填充:实现 LLM 间 KV 缓存迁移,推理速度提升 25 倍
- 作者

- 姓名
- Nino
- 职业
- Senior Tech Editor
在大语言模型(LLM)的生产化部署中,效率始终是核心竞争力。随着开发者从单一模型架构转向复杂的多模型流水线,一个新的技术瓶颈逐渐浮现:模型切换时的预填充(Prefill)开销。无论是在实施模型级联(Model Cascading)、动态路由,还是在对话过程中根据复杂度将任务从小型模型升级到大型模型,接收模型通常都必须从头开始重新运行整个预填充过程。
n1n.ai 等领先的 LLM API 聚合平台为开发者提供了极其便捷的模型切换能力。然而,在底层技术层面,如何在不同规模的模型之间复用键值缓存(KV Cache)一直是一个难题。近期,Heo 等人(2026)发表的一项研究为这一问题提供了突破性方案:通过在同系列模型之间使用闭式线性映射器(Closed-form Linear Mapper)迁移 KV 缓存,可实现比重新预填充快 2.7 到 25 倍的速度,且能保持 73% 到 98% 的准确率。这一技术对于追求极致响应速度的企业级应用具有重大意义。
为什么模型切换会产生巨大的延迟?
在现代 LLM 部署中,为了平衡成本与性能,通常会采用以下三种模式:
- 模型级联:将简单查询路由到小模型(如 Qwen-14B),将复杂问题交给大模型(如 Qwen-72B)。
- 对话中途切换:在对话初期使用响应极快的模型,随着上下文增长或逻辑复杂度提升,无缝切换到更强大的模型。
- 动态路由:根据分类器的信号,为每个请求实时选择最合适的模型。
在这些场景下,每当发生模型切换,目标模型就必须重新处理所有输入 Token,以构建自己的 KV 缓存。对于包含数千个 Token 的 RAG(检索增强生成)管道或长文本应用,这一过程在高性能 GPU 上也需要数百毫秒。对于用户而言,这意味着明显的卡顿。通过 n1n.ai 调用 API 虽然简化了接入流程,但底层的推理效率优化仍需依赖像 KV 缓存迁移这样的前沿技术。
KV 缓存复用的技术障碍
过去,人们普遍认为在不同模型间复用 KV 缓存是不可能的,主要原因在于架构的差异。即便是在同一个模型系列中,14B 模型和 32B 模型在以下方面也存在显著不同:
- 层数(Layer Counts):参数量大的模型通常拥有更多的 Transformer 块。
- 隐藏层维度(Hidden Dimensions):向量空间的宽度不同。
- 注意力头(Attention Heads):头的数量以及每个头的维度往往不一致。
由于内部表征空间不同,源模型生成的 KV 缓存对目标模型来说就像是“乱码”。然而,研究人员发现,同系列模型的 KV 缓存内部存在强大的线性结构。以 Qwen3 14B 到 32B 的迁移为例,单个源模型层可以解释目标模型键(Keys)中 56% 的方差;如果结合多个源模型层,这一比例可提升至 79%(Keys)和 65%(Values)。这意味着,通过简单的线性映射,我们就能跨越模型鸿沟。
核心技术方案:三步走实现线性映射
该研究提出的管道包含三个关键步骤,旨在以最小的计算代价实现最大的迁移精度:
第一步:层选择(Layer Selection)
并非所有的源模型层对目标模型层都有同样的预测能力。研究者利用 R²(决定系数)为每个目标层筛选出前 k 个最具预测能力的源模型层。这确保了映射过程只利用最相关的特征信息。
第二步:RoPE 剥离(RoPE Stripping)
现代 LLM 普遍采用旋转位置嵌入(RoPE)。RoPE 会将位置信息直接耦合进 Key 向量中,导致映射器难以在不同位置通用。研究者的创新之处在于,在映射前先“剥离”Key 中的 RoPE 编码,使其回归到位置无关的状态,映射完成后再重新应用 RoPE。这使得线性映射器可以跨越任何上下文长度复用。
第三步:岭回归拟合(Ridge Fit)
映射器本质上是一个线性权重矩阵。研究者只需使用 500 条校准序列(如 FineWeb-Edu 数据集),通过闭式岭回归公式即可求出最优解:
其中 是源 KV 缓存, 是目标 KV 缓存。这是一个一次性的离线成本,而在推理阶段,仅需进行一次矩阵乘法,计算开销极低。
Python 代码实现参考
以下是基于 PyTorch 的核心逻辑实现,展示了如何拟合映射器并进行缓存迁移:
import torch
from typing import List
def rotate_half(x: torch.Tensor) -> torch.Tensor:
x1 = x[..., : x.shape[-1] // 2]
x2 = x[..., x.shape[-1] // 2 :]
return torch.cat([-x2, x1], dim=-1)
def strip_rope(keys: torch.Tensor, cos: torch.Tensor, sin: torch.Tensor) -> torch.Tensor:
"""剥离 RoPE 编码以获得位置无关的 Key"""
# 基于旋转矩阵的逆运算
return keys * cos - rotate_half(keys) * sin
def fit_ridge_mapper(
source_kvs: List[torch.Tensor], # 前 k 个源模型层的张量列表
target_kv: torch.Tensor, # 目标层张量
lambda_reg: float = 1e-4
) -> torch.Tensor:
"""拟合闭式岭回归映射器"""
X = torch.cat(source_kvs, dim=-1) # 拼接特征
XtX = X.T @ X
XtY = X.T @ target_kv
reg = lambda_reg * torch.eye(X.shape[1], device=X.device, dtype=X.dtype)
W = torch.linalg.solve(XtX + reg, XtY) # 求解线性方程组
return W
def transfer_kv(
source_kvs: List[torch.Tensor],
W: torch.Tensor,
cos: torch.Tensor = None,
sin: torch.Tensor = None,
is_key: bool = True
) -> torch.Tensor:
"""在推理阶段将 KV 缓存迁移至目标模型空间"""
if is_key and cos is not None:
kvs = [strip_rope(kv, cos, sin) for kv in source_kvs]
else:
kvs = source_kvs
return torch.cat(kvs, dim=-1) @ W
实验数据与性能表现
在针对 Qwen 和 Llama 系列模型的测试中,该方法表现卓越。尤其是在使用 n1n.ai 平台上常见的 Qwen 模型时,效果最为显著:
- Qwen3 14B → 32B:准确率保留率高达 98%,推理速度提升 25 倍。
- Qwen3 32B → 72B:准确率保留率约 91%,推理速度提升 18 倍。
- Llama 系列:大部分配对可实现 73-89% 的准确率保留,加速比在 2.7 倍以上。
值得注意的是,Value(值)的迁移比 Key(键)更难。单层 R² 值在 Key 上能达到 56%,但在 Value 上仅为 32%。如果对精度有更高要求,研究建议使用非线性的 MLP 替代线性映射器,这虽然会略微增加推理开销,但能显著提升在复杂推理任务(如 HellaSwag)中的表现。
开发者实战建议
- 与 vLLM 集成:如果你正在运行 vLLM 或其他基于 PagedAttention 的系统,可以将此映射器作为预处理步骤。在目标模型开始预填充之前,将迁移后的 KV 缓存插入分页内存池,从而跳过重复的计算。
- 同系列限制:目前该方法仅适用于同系列模型,且要求 KV 头数和每头维度匹配。跨系列(如从 Qwen 迁移到 Llama)暂不支持。对于需要混合使用不同系列模型的需求,建议继续通过 n1n.ai 进行统一的 API 管理和调度。
- 校准数据选择:虽然 500 条序列即可完成拟合,但建议选择与你实际业务场景(如代码、法律文档或医疗对话)贴近的数据进行校准,以获得最佳的映射精度。
总结
KV 缓存的跨模型迁移技术为 LLM 推理架构带来了全新的可能性。它不仅降低了模型切换的延迟成本,还为构建更复杂、更智能的多模型协作系统铺平了道路。随着模型规模的不断扩大,这种“空间换时间”的优化思路将变得愈发重要。
立即在 n1n.ai 获取免费 API 密钥,开启你的高效模型开发之旅。