简介:本文系统讲解跨层复用 KV Tensor(跨层 KV Cache 共享)这一大模型推理优化技术:说明它是什么、为何 KV Cache 会成为长上下文推理的显存与速度瓶颈,拆解跨层共享 Key-Value 状态的工作原理,辨析其与 GQA、MQA、KV 量化等易混概念的区别,并给出典型适用场景与工程落地注意事项,帮助技术读者快速建立完整认知框架。
跨层复用 KV Tensor(也称共享 KV Cache、跨层注意力 Cross-Layer Attention)是一种面向 Transformer 大模型推理的架构级优化技术。其核心思想是:在自回归生成过程中,让网络中靠后的层不再独立计算和维护自己的 Key/Value 状态,而是直接复用靠前层已经计算出的 Key-Value 张量,使“一次计算、多层使用”成为可能,从而成倍降低 KV Cache 的显存占用与访存开销。
可以从三个视角理解这一定义:
Transformer 采用自回归方式逐 token 生成文本。为避免每生成一个 token 就重算全部历史序列的注意力,推理框架会把每一层的 Key、Value 缓存下来,这就是 KV Cache。它在带来速度红利的同时,也构成了三重压力:
显存容量压力。KV Cache 大小可用如下通用公式估算:
KV Cache ≈ 2 × 层数 × 序列长度 × KV 头数 × 每头维度 × 批大小 × 每元素字节数
以一个 32 层、32 个 KV 头、每头维度 128、FP16 精度的典型配置为例,仅处理 32K 上下文、批大小为 1 时,KV Cache 就约为 16 GiB。上下文越长、并发越大,这一数字线性甚至倍数增长,很快就会超过模型权重本身。
显存带宽压力。解码阶段每生成一个 token 都要完整读取一遍 KV Cache,当 KV Cache 体量过大时,访存就成为解码速度的主要瓶颈——KV Cache 越大,单 token 生成延迟越高。
并发扩展压力。批处理是提升吞吐的关键手段,但每个请求都持有独立的 KV Cache,显存迅速被占满,服务只能以较小批次运行,单位 token 成本居高不下。
因此,“缩小 KV Cache”已成为当前大模型架构设计的核心主题之一。业界常见手段包括:头间共享(GQA/MQA)、跨层共享、KV 量化、滑动窗口注意力、分页式显存管理等。跨层复用的独特价值在于:它从“层”这一维度直接削减了重复的 KV 存储,且与其它手段正交、可叠加。
标准 Transformer 中,每一层都有自己的注意力投影矩阵。前向计算时,每层将输入投影为该层专属的 K/V 并写入缓存;解码时每层读取自己的 K/V 参与注意力计算。层数越多,缓存份数越多。
近期发布的某主流开源权重模型系列,就在其面向端侧与小型本地设备的小型模型中,将“共享 KV Cache”作为核心架构改动之一,使后续层复用前面层已计算的 Key-Value 状态,从而降低长上下文场景下的显存占用与计算成本。值得指出的是,这一思路并非该系列首创——学术界此前已提出 Cross-Layer Attention 等同类方案,但将该机制大规模应用于主流开源架构,仍具有重要的工程示范意义。
Grouped Query Attention(GQA,分组查询注意力)是另一个被广泛采用的 KV 缩减手段:让多个 Query 头共享同一组 KV 头,例如 32 个 Query 头共享 8 个 KV 头,KV Cache 即缩减为原来的 1/4。GQA 压缩的是“头维度”,跨层复用压缩的是“层维度”,二者正交,可以叠加使用。以一个 32 层模型为例:先经 GQA 将 KV 头数从 32 降到 8,再以每 2 层共享一份 KV,则 KV Cache 相对朴素方案可缩减约 8 倍,前述 16 GiB 的示例即可降至约 2 GiB。
# 默认:逐层独立缓存for layer in layers:k, v = project_kv(layer, x) # 每层各自计算cache.append(k, v) # 每层各存一份x = attend(layer, x, k, v)# 跨层复用:组内共享for i, layer in enumerate(layers):if i % group_size == 0:shared_k, shared_v = project_kv(layer, x) # 组首层计算else:shared_k, shared_v = reuse(shared_k, shared_v) # 组内其余层复用x = attend(layer, x, shared_k, shared_v)
| 技术 | 共享/压缩维度 | 是否减少 KV 总量 | 典型做法 |
|---|---|---|---|
| MQA / GQA | 头维度 | 是 | 多个 Query 头共享一组 KV 头 |
| 跨层复用 KV Tensor | 层维度 | 是 | 后续层复用前面层的 K/V |
| KV Cache 量化 | 数值精度 | 是(按字节) | FP16 改为 FP8/INT4 存储 |
| 滑动窗口注意力 | 时间维度 | 是 | 只缓存最近窗口内的 K/V |
| 分页式显存管理 | 管理粒度 | 否 | 按页分配、减少碎片 |
需要强调的是,这些手段彼此正交:一个现代推理系统完全可以同时采用 GQA + 跨层共享 + KV 量化 + 分页管理,获得乘法级的显存收益。其中分页式管理尤其容易混淆——它优化的是“怎么存”(减少碎片、提升利用率),而跨层复用优化的是“存多少”(从源头减少状态数量)。
跨层复用 KV Tensor 是“缩小 KV Cache”这一大模型架构核心主题下的代表性技术:它通过让后续层复用前面层已计算的 Key-Value 状态,将 KV Cache 从“逐层独享”变为“层间共享”,从源头削减长上下文推理中最沉重的显存与访存负担。它与 GQA(头间共享)、KV 量化、滑动窗口、分页管理等手段相互正交、可组合使用,共同构成现代推理优化的工具箱。其适用边界也很清晰:适合显存受限、上下文较长、并发较高的推理场景;而共享比例、训练一致性与质量评测则决定了它能否安全落地。对开发者而言,理解这一机制,不仅有助于读懂新一代开源模型的架构取舍,也为自建推理服务时的选型与调优提供了明确的技术坐标。