惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

A
About on SuperTechFans
Y
Y Combinator Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Microsoft Security Blog
Microsoft Security Blog
aimingoo的专栏
aimingoo的专栏
I
InfoQ
C
Check Point Blog
IT之家
IT之家
MyScale Blog
MyScale Blog
Apple Machine Learning Research
Apple Machine Learning Research
Vercel News
Vercel News
Last Week in AI
Last Week in AI
GbyAI
GbyAI
P
Proofpoint News Feed
量子位
Stack Overflow Blog
Stack Overflow Blog
Microsoft Azure Blog
Microsoft Azure Blog
月光博客
月光博客
阮一峰的网络日志
阮一峰的网络日志
人人都是产品经理
人人都是产品经理
B
Blog
T
The Blog of Author Tim Ferriss
H
Help Net Security
云风的 BLOG
云风的 BLOG

博客园_首页

Plist 二进制格式 Milvus 和 PGVector,哪个更好? OpenClaw 已过时?在 VS Code 中运行 Hermes Agent! 第30篇文章:一个大三计科生的自白 Manim如何在数学公式中完美显示中文? Docker 部署 RocketMQ 5 并发编程核心概念辨析 C#事务处理最佳实践:别再让“主表存了、明细丢了”的破事发生 CLI 是什么?为什么大厂突然集体卷命令行? 【从0到1构建一个ClaudeAgent】协作-自主Agent UIImageView 设置图片不生效的原因排查 最小二乘问题详解20:无先验约束下的增量式SFM自由网平差 痞子衡嵌入式:大话双核i.MXRT1180之XIP应用里借助MU实现可靠Flash IAP的方法 AI Chat 封装, SemanticKerne.AiProvider.Unified 已发布 Windows下右键编辑js文件无法打开记事本——在注册表中使用环境变量 在后台服务中使用 Scoped 服务,为什么总是报错? H200 安装驱动并使用sglang启动模型 wireshark 抓包Trap上报告警内容 我用 AI 辅助开发了一系列小工具(2):图片压缩工具 [A Primer On MC and CC] 2.1 Memory Consistency 1 - 指令重排序和 SC 模型 Oracle数据库SCN推进技术详解与实践指南 玩转控件:封装个带图片的Label控件 Claude Code 4.7 真正该升级的不是模型,而是你的工作流 前端小白一句话,AI 帮我做了个颜值拉满的桌面媒体播放器。当代码不再是门槛,一句话编程就是现实。 5. WorkBuddy: 小龙虾的灵魂三件套,让你的小龙虾不只是工具 SQLite 分片方案实战:三种分片策略的深度对比 告别简陋 UI!一款基于 Fluent Design 和基于 WinUI 的开源免费、现代化的 Avalonia UI 控件库 关于二进制排列组合枚举的总结 AI开发-python-LangGraph框架(3-27-LangGraph从零实现大模型智能决策工作流) ElasticSearch主分片和副本分片概念详解
从 305 GB 到 7.4 GB:大模型 KVCache 架构演进全景
-银光- · 2026-05-06 · via 博客园_首页

本文已于 2026.05.06 发表于公众号知乎

五一本打算更新一年前写的开源引擎 KVCache 实现文档,但梳理下来发现,光是 KVCache 演进的理论部分就已足够撑起一篇独立文章。在 Agent 改变搜索习惯、重塑软件行业的今天,多轮交互带来的长上下文让 KVCache 持续膨胀,显存瓶颈愈发突出——过去几年以注意力机制为核心的模型架构演进,几乎都绕不开对 KVCache 的重新设计。本文尝试对这条演进脉络做一次系统梳理。

head


1 Decoder-only 模型结构

目前主流大语言模型都采用 Decoder-only 架构,其核心流程如下图所示:

image

包括以下核心组件:

组件职责
Embedding token ID → d_model 维向量
Attention token 间信息交互,建模上下文依赖
FFN / MoE 非线性变换,增加模型表达能力
RMSNorm 归一化,稳定数值
Residual 残差连接,保证梯度流通
LM Head hidden → 词表 logits

其中 Attention 是唯一需要 KVCache 的模块。近年来围绕 Attention 的每一项改进,几乎都在改变 KVCache 的形态和大小。

2 大模型推理加速的本质三要素

大模型推理的所有优化,本质上都是围绕计算、存储、通信这三个核心资源维度进行的资源置换(trade-off)。我们的目标:在保障推理效果的前提下,于有限的物理约束内,追求吞吐与延迟的最优解。

  • 存储换计算:缓存 KVCache 或公共前缀,用显存空间的增加,换取计算量的减少。
  • 计算/存储换效率:通过 FP8/FP4 量化或 GQA 结构,在微小的效果损失下,换取带宽的释放与计算吞吐的提升。
  • 通信换存储:引入多级缓存,用 PCIe/NVLink 的通信开销,换取 GPU 显存的有效承载上限。
  • 通信换算力利用率:采用 PD 分离架构,通过增加系统通信开销,换取计算集群在不同推理阶段(Prefill/Decode)更高的硬件利用率。

结合本文的主题,下面我们重点讨论 KVCache 的演进。

3 近几年和 KVCache 相关的演进

kvcache 优化方向

 过去几年,大模型 Attention 架构经历了 MHA、MQA、GQA、MLA,再到稀疏注意力、线性注意力的演进。从 KVCache 的视角审视,可以归纳为同一个目标:让模型更强的同时,让 KVCache 更小。

3.1 压缩 KV 头数 —— MHA → MQA → GQA

image

标准的 Multi-Head Attention(MHA)中,每个 Q 头都配有独立的 K 头和 V 头,KVCache 大小与注意力头数成正比。

  • MQA(Multi-Query Attention, Shazeer 2019):所有 Q 头共享一组 K/V 头,KVCache 缩小到 MHA 的 1/num_heads。效果极为显著,但单组 KV 头的表达力不足,模型质量有所下降。
  • GQA(Grouped-Query Attention, Ainslie et al. 2023):折中方案——将 Q 头分组,每组共享一对 KV 头。例如 Qwen2.5-72B 使用 64 个 Q 头 / 8 个 KV 头(8:1 分组比),KVCache 降至 MHA 的 1/8,质量几乎无损。

3.2 压缩 KV 表示 —— MLA(Latent 维度压缩)

3.1 的思路是减少 KV 头的数量,而 MLA 换了一个角度——压缩每个 KV 头的维度

image

MLA(Multi-head Latent Attention, DeepSeek V2/V3):不存储完整的 K/V 向量,而是将它们联合压缩到一个低维 latent 向量 c。推理时只需缓存 c(维度 = kv_lora_rank + qk_rope_head_dim),注意力计算时再解压还原。

以 DeepSeek V3 为例:

  • 传统 MHA 每 token 缓存 KV 维度为 hidden_size × 2 = 7168 × 2 = 14336
  • MLA 只需缓存 kv_lora_rank + qk_rope_head_dim = 512 + 64 = 576 维
  • 单层 KVCache 压缩约 96%,且模型质量不降反升(联合压缩提供了正则化效果)

3.3 稀疏注意力 —— 选择性保留,压缩序列范围

前两个思路(压缩头数、压缩维度)都是在缩小每个 token 的 KV 表示大小,而稀疏注意力换了一个角度:减少需要保留 KV 的 token 数量

其核心洞察是:在长上下文场景中,并非所有历史 token 都对当前生成同等重要。如果能识别并只保留"关键"token 的 KV,便可以大幅缩减缓存规模,同时保持模型质量。沿着这一思路,业界经历了从"固定窗口截断"到"动态稀疏选择"再到"分层混合策略"的演进:

3.3.1 SWA —— 滑动窗口,截断历史

SWA(Sliding Window Attention, Mistral 2023.10):每个 token 只关注最近 W 个 token 的 KV,窗口外的 KV 直接丢弃。KVCache 上限固定为窗口大小 W,不再随序列增长。

  • 优势:实现简单,显存可控,推理速度快
  • 局限:窗口外的信息完全丢失,长距离依赖能力受限

SWA 提出了一个关键洞察:并非所有历史 token 都同等重要,近距离 token 的价值远高于远距离 token。但它的做法过于激进——对窗口外信息"一刀切"式丢弃。

3.3.2 稀疏选择 —— 选择性保留关键信息

滑动窗口简单高效,但完全丢弃了窗口外的信息。能否不全部丢弃,而是稀疏地选择最重要的 token 保留?

NSA(Native Sparse Attention, DeepSeek 2025.02)率先验证了这一思路。它将注意力分解为三个并行分支:

  • 压缩分支:将 token 分块压缩为粗粒度表示,捕获全局上下文
  • 精选分支:通过 top-k 选择最相关的 token 块,保留关键细节
  • 滑动窗口分支:保留局部邻近信息

三个分支输出加权融合,以远少于全量的计算覆盖关键上下文。NSA 的设计强调硬件对齐——以连续块为粒度做稀疏选择,匹配 GPU 的块状内存访问模式。 但 NSA 的三分支并行架构也带来了较高的工程复杂度。

DSA(DeepSeek Sparse Attention, DeepSeek-V3.2 2025.09)继承 NSA 稀疏核心思路,做了轻量化的工程落地,只保留精选分支的思路:通过轻量级的 lightning indexer,每个 query head 选择最相关的 KV 进行注意力计算。

3.3.3 CSA + HCA —— 分层混合,集大成者

image

CSA + HCA(DeepSeek V4, 2026)将 SWA 的"近距离精确保留"和 NSA 的"远距离稀疏选择"思想融合并推到极致,形成分层混合注意力架构:

  • 继承 SWA 的思想:每层保留最近 128 token 的完整 KV(滑动窗口)
  • 继承 NSA 的思想:对窗口外的历史不丢弃,而是用不同粒度的压缩策略保留
  • 更进一步:不同层使用不同的压缩比(CSA 4:1,HCA 128:1),形成多尺度的信息覆盖

不同距离的 token 分配不同的压缩策略。根据 DeepSeek V4 技术报告的等效对比:在 1M token 的上下文设定下,V4-Pro 的 KVCache 仅为 V3 的约 10%。

以 V4-Pro 为例(61 层),前 2 层为 HCA,之后 CSA 与 HCA 严格交替,共 31 层 HCA + 30 层 CSA。每一层的 KVCache 由两部分组成:

(1)滑动窗口(所有层都有)—— 存储最近 128 token 的完整 KV

无论是 CSA 层还是 HCA 层,都保留最近 128 个 token 的原始 KV,不做任何压缩或丢弃。原因:

  • 最近的 token 对当前生成贡献最大(注意力权重随距离衰减)
  • 近距离信息不能容忍任何精度损失
  • HCA 的压缩需要凑满 128 个 token 才能执行,未凑满的部分必须以原始形式保留

(2)历史区域 —— CSA 层:先压缩,再稀疏选择

CSA(30 层)的 4:1 压缩比通过两个阶段实现:

阶段一:交错重叠压缩。 不是简单的每 4 个 token 无重叠划分,而是以 4 token 为步长、8 token 为窗口交错压缩——每个 compressed KV 单元覆盖 8 个连续 token(与前后各重叠 4 个),最终序列长度变为 S/4:

原始历史: [t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, ...]

c1 覆盖:  [t1, t2, t3, t4, t5, t6, t7, t8 ]                                         → 压缩为 1 个
c2 覆盖:                  [t5, t6, t7, t8, t9, t10, t11, t12]                       → 压缩为 1 个
c3 覆盖:                                  [t9, t10, t11, t12, t13, t14, t15, t16]   → 压缩为 1 个

步长 = 4,窗口 = 8 → 等效压缩比 4:1

论文将每个窗口拆为两路:Cᵃ(当前步长新进入的 4 token)和 Cᵇ(前一窗口重叠的 4 token),分别投影后联合加权融合。这样每个原始 token 被前后两个压缩单元共同覆盖,边界信息不会割裂,过渡更平滑。

阶段二:Top-k 稀疏选择。 通过 Lightning Indexer(轻量级相关性打分网络)对所有 compressed KV 单元快速评分,无需走完整注意力开销;每个 query 只选出最相关的 top-k 个(V4-Pro: k=1024)参与后续正式稠密注意力计算:

压缩后序列: [c1, c2, c3, c4, ..., c262144]   (1M/4 = 256K 个 compressed KV 单元)
Lightning Indexer 快速粗筛 → 选出 Top-1024 个最相关 → 仅这些参与正式 Attention

(3)历史区域 —— HCA 层:块级压缩 128:1,不做稀疏选择

HCA(31 层)将历史序列按 128 token 为一块,通过 token compressor 将整块融合为 1 个 compressed KV 向量(带 Softmax 的加权融合):

历史 Block (128 tokens): [t1, t2, ..., t128] → 可学习投影+位置偏置 → Softmax加权聚合 → [c1](1个压缩向量)

与 CSA 的关键区别:

  • 压缩方法相同,压缩比不同:CSA 是轻量级压缩(4 token → 1),保留更多细节;HCA 是大块压缩(128 token → 1),压缩更激进,丢失更多局部信息。
  • 后续处理不同:CSA 压缩后还需 Lightning Indexer 做 top-k 稀疏选择;HCA 压缩后不做 top-k,直接对所有 compressed KV 做 dense attention——因为 128:1 的压缩率已经足够激进(1M token → 约 8K 个 compressed KV),全量计算开销也很小。

(4)注意力计算:两部分结果可学习融合

推理时,每一层为当前 token 计算注意力输出,同时使用滑动窗口和历史区域的 KV

CSA 层:Q × [最近128 token 的 KV(精确)] + Q × [Top-k compressed KV(压缩+稀疏选择)] → 可学习融合 → 输出
HCA 层:Q × [最近128 token 的 KV(精确)] + Q × [全部 compressed KV(压缩+dense attention)] → 可学习融合 → 输出

两部分的注意力输出经过可学习的融合(而非简单相加)后得到最终输出。滑动窗口保证了近距离的精确性,历史区域则以不同粒度覆盖远距离信息。

(5)整体压缩比

以 CSA 为例,在 1M 上下文下:

  • 滑动窗口:128 个完整 KV(固定开销)
  • 历史区域:100 万 token 压缩为 S/4 = 25 万个 compressed KV(存储层面 4:1 压缩)
  • 注意力计算时进一步稀疏:每个 query 仅选 top-1024 个 compressed KV 参与计算

存储上,CSA 层的 KVCache 大小趋近原始的 1/4。HCA 层(128:1 聚合)趋近 1/128。

3.4 线性注意力 —— 固定隐状态,解除序列长度瓶颈

无论是 GQA/MLA 压缩表示大小,还是稀疏注意力减少保留数量,KVCache 的规模终究还是与序列长度挂钩——只是从 O(n) 变成了更小系数的 O(n)。有没有办法彻底打破这层绑定?

线性注意力给出了一个激进的答案:参考 RNN 的思路,用固定大小的隐状态替代逐 token 增长的 KVCache,将"缓存"大小从 O(n) 降为 O(1),从根本上解除显存与序列长度的线性关系。

SSM : 线性注意力 : 混合架构

这一思路的演进经历了三个阶段:纯 SSM 架构验证"固定隐状态"的可行性(Mamba),线性注意力在保持 O(1) 缓存的同时改善表达力(DeltaNet),最终混合架构在工程落地中找到纯注意力与线性机制的最佳配比(Qwen3.5)。

3.4.1 Mamba / SSM —— 固定大小隐状态

Mamba/SSM(Gu & Dao, 2023)是这条路线的开创者——用一个固定大小的隐状态向量替代逐 token 增长的 KVCache,无论序列多长,推理时的"缓存"大小恒定。

(1)核心思想:用递推代替检索

传统 Attention 的做法是"把所有历史 KV 存起来,每次生成时回头查";而 SSM 的做法更像"边读边压缩成一个摘要,每次生成时只看摘要":

传统 Attention: 存所有历史 → KVCache 随序列线性增长,O(n) 显存
SSM:           压缩为隐状态 → hₜ = Ā·hₜ₋₁ + B̄·xₜ,O(1) 显存
输出:                         yₜ = C·hₜ + D·xₜ

(2)Selective SSM —— "选择性"记忆与遗忘

早期 SSM 的参数是固定的,对所有 token 一视同仁。Mamba 的关键创新是让 Ā 和 B̄ 依赖于当前输入——模型能"选择性"地决定:这个 token 重要吗?要不要写入记忆?

注:Ā 和 B̄ 由连续参数 A、B 经离散化(涉及一个输入相关的步长 Δ 和矩阵指数运算)得到,这里省略数学细节,只关注其直觉效果。

直觉上,模型为每个 token 动态计算一个"开关" Δ:

  • 遇到重要 token → Δ 增大:Ā 快速衰减(为新信息腾空间),B̄ 放大(大量写入新信息)
  • 遇到无关 token → Δ 缩小:Ā≈1(旧状态几乎不变),B̄ 缩小(新输入几乎不写入)

一句话总结:Δ 大 = "关注当前",Δ 小 = "忽略当前"

(3)完整 Mamba Block 数据流

                    ┌─────────────────────────────────────────────────────────────────┐
  x → Linear 投影 →├─ x 路: Conv1d(k=4) + SiLU → 投影出 Δ,B,C(离散化)→ Selective SSM ─→ ⊙ → Linear↓ → y
                    └─ z 路: ────────────────────────────────────→ SiLU(z) ───────→↗

各组件的作用:

  • Linear↑(输入投影):将 d_model 扩展到 2×d_inner(d_inner = expand × d_model,默认 expand=2),一分为二——x 路进入 SSM 主计算,z 路旁路保留用于门控
  • Conv1d(k=4)(一维因果卷积,窗口大小 4):SSM 递推是逐 token 操作,对相邻 token 的局部模式(如 n-gram)感知不足。Conv1d 先在相邻 4 个 token 上做卷积,提取短程局部特征作为补偿
  • 投影 + 离散化:从当前输入中产生 Δ、B、C,再结合固定参数 A 得到 Ā 和 B̄(即前文所述的输入依赖衰减/写入系数)
  • Selective SSM:核心递推——hₜ = Ā·hₜ₋₁ + B̄·xₜ(更新隐状态),yₜ = C·hₜ + D·xₜ(读取输出)
  • ⊙ 门控合并y_ssm ⊙ SiLU(z)——z 路为每个维度提供缩放因子(≈0 抑制,≈1 保留),同时提供更直接的梯度回传路径
  • Linear↓(输出投影):映回 d_model

(4)优劣势

  • 优势:推理显存 O(1),生成速度恒定,不随上下文变长而减速
  • 劣势:固定隐状态本质是有损压缩——在需要精确回溯长距离细节的任务上(如"第 3 段第 2 句说了什么"),表现弱于全注意力

3.4.2 Gated DeltaNet —— 门控线性注意力

Gated DeltaNet(MIT 2024; Qwen3.5 采用):一种门控线性注意力机制,用 delta 更新规则维护固定大小的隐状态矩阵。

(1)核心更新公式

固定隐状态: Sₜ = αₜ · Sₜ₋₁ + βₜ · (vₜ - αₜ · Sₜ₋₁ · kₜ) · kₜᵀ
输出:      oₜ = Sₜ · qₜ

其中:
  αₜ = exp(-softplus(a_proj(xₜ) + dt_bias) · exp(A_log))  // 衰减因子∈(0,1):α→0 快速遗忘,α→1 完全保留
  βₜ = sigmoid(b_proj(xₜ))                               // 写入强度∈(0,1):控制沿 k 方向的精确纠错更新强度

直觉理解:固定隐状态 S 是一个 d×d 的"关联记忆矩阵"——你可以把它想象成一个 key→value 的联想存储器,给定任意 key 向量,矩阵能"回忆"出对应的 value。每个新 token 到来时,更新分两步(遗忘 + delta 纠错写入):

  • αₜ · Sₜ₋₁:全局遗忘——对整个记忆矩阵做统一衰减(类似"清空黑板")
  • + βₜ · (vₜ - αₜ·Sₜ₋₁·kₜ) · kₜᵀ:Delta Rule 更新:先计算"预测误差" vₜ - αₜ·Sₜ₋₁·kₜ(当前真实值减去衰减后记忆矩阵对 kₜ 的预测),再将纠错信号沿 kₜ 方向写入矩阵
    • 展开:- βₜ · αₜ· (Sₜ₋₁·kₜ) · kₜᵀ(擦除旧关联)+ βₜ · vₜ · kₜᵀ(写入新关联)
  • 输出时 Sₜ · qₜ 相当于用 query 向量对矩阵中累积的所有历史信息做加权提取(类似 Attention 的 softmax(QKᵀ)V,但这里是线性版本,无 softmax)

α 和 β 互补:α 负责"粗粒度全局遗忘"(一次性衰减整个矩阵),β 负责"细粒度精确更新"(只修改特定 key 对应的记忆)。两者结合解决了纯 DeltaNet 无法快速清除过时信息、纯门控无法精确更新特定关联的问题。

(2)Conv1d + 门控 —— 局部预混合与信息过滤

与 Mamba 类似,Gated DeltaNet 在线性注意力之前也使用 Conv1d(通常 kernel_size=4),并在输出时使用门控:

Gated DeltaNet Block 数据流:
                        ┌─ α 路: exp-decay; β 路: Sigmoid ───────────────────┐
                        │                                                     ↓
  x → 多路 Linear →├─ q,k,v 路: q,k,v 各自 Conv1d(k=4)+SiLU → L2 Norm(q,k) → Gated Delta Rule → RMSNorm ─→ ⊙ → Linear↓ → y
                        │                                            (k,v 更新 S; q 读取 o)       ↑
                        └─ g 路: ──────────────────────────────────────────→ SiLU(g) ─────────────→↗
  • 多路 Linear:各自独立的线性投影,分别生成 q, k, v, g, α, β(图中简写为"多路")
    • q, k, v:注意力核心——q 用于从记忆矩阵读取输出 (oₜ = Sₜ · qₜ),k 和 v 用于更新记忆矩阵
    • g(Output Gate):输出门控信号,经 SiLU 激活后对输出逐元素缩放
    • α(Alpha / 衰减因子):通过 exp(-softplus(·)) 映射到 (0,1),控制对整个记忆矩阵的全局衰减程度
    • β(Beta / 写入强度):经 Sigmoid 激活映射到 (0,1),控制沿当前 key 方向的精确纠错更新强度
  • Conv1d(k=4)(一维因果卷积,窗口大小 4):局部混合,弥补逐 token 递推的局部感知不足(与 Mamba 一致的设计模式)
  • L2 Norm:对 q, k 归一化,稳定线性注意力的数值
  • Gated Delta Rule:核心递推——Sₜ = αₜ·Sₜ₋₁ + βₜ·(vₜ - Sₜ₋₁·kₜ)·kₜᵀ(状态更新),oₜ = Sₜ · qₜ(输出读取)。α 控制全局遗忘,β 控制沿 key 方向的精确 delta 更新
  • RMSNorm(输出) ⊙ SiLU(g):门控操作——g 路提供逐元素缩放因子,控制哪些维度的信息最终输出,同时 g 路提供更直接的梯度回传路径
  • Linear↓(输出投影):映回 d_model

(3)与 Mamba/SSM 的核心区别

维度Mamba/SSMGated DeltaNet
隐状态形态 一维向量 h∈ℝᵈ 二维矩阵 S∈ℝᵈˣᵈ,信息容量更大
更新规则 递推加法 h = A·h + B·x Delta rule(先擦除旧关联,再写入新关联)
门控粒度 参数 A/B 隐式控制 双门控 α/β 显式独立控制遗忘和精确更新
语义 状态空间压缩 更接近 Attention 的 KV 关联存储
局部预处理 Conv1d(k=4) Conv1d(k=4)

(4)效果

在多数长文本任务上效果接近全注意力,同时保持 O(1) 的推理显存和恒定生成速度。由于固定隐状态是 d×d 矩阵,信息容量远大于 SSM 的一维向量,因此在复杂推理任务上表现更好。

3.4.3 混合架构 —— 线性注意力 + 全注意力分层

混合架构(Jamba 2024, Qwen3.5 2025):综合两者优势——大部分层用线性注意力/SSM(无需 KVCache),每隔几层插入一个全注意力层(需要 KVCache)。

(1)层配置

以 Qwen3.5-397B 为例:共 60 层,采用 3:1 的混合比例(45 层 Gated DeltaNet + 15 层 Gated Attention),总计 KVCache 缩减至纯 dense attention 的约 1/4

Qwen3.5-397B 层配置(示意,共 15 个重复块 × 4 层 = 60 层):
Layer 0: Gated DeltaNet  → 无 KVCache,固定隐状态(内含 Conv1d)
Layer 1: Gated DeltaNet  → 无 KVCache,固定隐状态(内含 Conv1d)
Layer 2: Gated DeltaNet  → 无 KVCache,固定隐状态(内含 Conv1d)
Layer 3: Gated Attention  → 需要完整 KVCache(GQA: 2 KV Heads, head_dim=256)
Layer 4: Gated DeltaNet  → 无 KVCache
...
每 4 层只有 1 层需要 KVCache → 仅 15 层有 KV 开销,总 KVCache ≈ 25%

(2)与 CSA+HCA 的对比

DeepSeek V4 的稀疏注意力(CSA+HCA)和 Qwen3.5 的线性注意力混合是当前业界降低 KVCache 开销的两大主流方向,它们的设计哲学有相似之处,但实现路径截然不同:

维度CSA+HCA(DeepSeek V4)混合架构(Qwen3.5)
核心理念 不同层用不同压缩粒度 不同层用不同注意力机制
高效层(大部分) HCA 128:1 压缩 + dense 线性注意力层(Gated DeltaNet),O(1) 隐状态,无需 KVCache
精确层(少部分) CSA 4:1 + top-k 稀疏 全注意力层,完整 KVCache,长短距离都能精确检索
局部特征 每层 128 token 滑动窗口 线性注意力层内 Conv1d 提取局部特征

本质差异:CSA+HCA 是每一层都有 KVCache(通过压缩/稀疏减少大小);混合架构是大部分层完全没有 KVCache(少数全注意力层保留完整 KV)。两者的共同设计哲学:用不同机制处理不同层次的信息,而非一刀切。

3.5 模型结构之外的优化 —— 量化与压缩

前面的思路都在改变模型结构(头数、维度、注意力机制),而这条思路不动模型结构本身,直接对存储的 KV 数据做"后处理"压缩——降低每个 KV 元素的位宽或维度。

(1)标量量化:FP8 / FP4

最直接的方式——减少每个数值的存储位数:

  • FP8 量化:将 KVCache 从 BF16(16 bit)量化到 FP8(8 bit)存储,显存直接减半。计算 Attention 时,在 Kernel 内通过缩放因子(scale)将 FP8 数据反量化回高精度参与运算。质量影响极小,已被 vLLM/SGLang 等主流推理框架广泛支持,是目前生产环境中最成熟的 KVCache 压缩手段
  • FP4 (NVFP4) 量化:NVIDIA Blackwell 架构推出的 4 bit 格式,相比 FP8 再减半,相比 FP16 减少 75%。采用两级缩放机制(全局 FP32 scale + 每块 FP8 scale),质量损失 < 1%。

(2)向量压缩

标量量化到 4 bit 已接近极限——再低精度损失会急剧上升。另一类思路是不逐标量量化,而是对整个 KV 向量做向量级压缩。例如 Google Research 的 TurboQuant,通过极坐标变换 + 在线向量量化将 KVCache 压缩到平均每个维度仅需约 3.5 bits(对比 BF16 的 16 bits),实现 5-6 倍压缩,且质量几乎无损。

3.6 跨层共享 —— CLA(Cross-Layer Attention)

核心观察:相邻层的 K/V 存在高度相似性。CLA 让某些层直接复用其他层的 KVCache,不再独立计算和存储。

传统: Layer 0 有自己的 KV, Layer 1 有自己的 KV, Layer 2 有自己的 KV ...
CLA2: Layer 0 有自己的 KV, Layer 1 复用 Layer 0 的 KV, Layer 2 有自己的 KV ...
      → KVCache 减少 50%

CLA 可以与 GQA/MLA 正交组合,进一步压缩 KVCache。目前主要在学术研究阶段,尚未被主流模型大规模采用。相关工作可参考:Reducing Transformer Key-Value Cache Size with Cross-Layer Attention(MIT-IBM, 2024,CLA 的原始提出)、xKV: Cross-Layer SVD for KV-Cache Compression(2025,基于 SVD 的后训练跨层压缩,兼容 MLA)。

3.7 其他模块的间接影响

除 Attention 外,模型其他模块的演进也间接影响着 KVCache 的地位:Pre-Norm + RMSNorm 使模型可以稳定堆叠到 80-128 层,层数越多 KVCache 总量越大;Dense FFN → MoE 大幅降低了 FFN 的激活显存占用,使得 KVCache 在推理总显存中的占比进一步上升(可达 60-80%)。换句话说,MoE 越流行,KVCache 优化越重要


4 各架构 KVCache 显存占用对比

4.1 计算公式

将第 3 章介绍的各架构落到具体的显存计算公式:

(1)MHA / GQA(如 Qwen2.5-72B)

KVCache 显存 = 2 × num_layers × num_kv_heads × head_dim × seq_len × batch_size × dtype_size
               ↑                                                                    ↑
           K 和 V 各一份                                                      每个元素字节数(FP16=2, FP8=1)

(2)MLA(如 DeepSeek V3)

KVCache 显存 = num_layers × (kv_lora_rank + qk_rope_head_dim) × seq_len × batch_size × dtype_size

MLA 将 K 和 V 联合压缩为低维 latent 向量(详见 3.2),因此没有 "×2"。

(3)混合架构(如 Qwen3.5,Gated DeltaNet + Gated Attention)

KVCache 显存 = 2 × num_full_attn_layers × num_kv_heads × head_dim × seq_len × batch_size × dtype_size

仅全注意力层需要 KVCache(详见 3.4.3),线性注意力层的隐状态大小固定,与序列长度无关。

(4)CSA + HCA(如 DeepSeek V4)

V4 使用 Shared-KV MQA(K=V 共享存储,只需缓存一份 512 维向量,无需 ×2)+ 分层序列压缩(详见 3.3.3):

KVCache 显存 ≈ 压缩段 + 滑窗段

压缩段 = (30 × kv_dim / 4 + 31 × kv_dim / 128) × seq_len × dtype_size
         ↑ CSA 30层 4:1压缩    ↑ HCA 31层 128:1压缩
         (kv_dim=512,K=V 共享,只存一份) 滑窗段 = 61 × kv_dim × window_size × dtype_size (固定开销,FP16 下约 7.6 MB)

整体 KVCache 仅为 DeepSeek V3 的 10% 左右。

4.2 数值对比

image

模型架构层数每层每 Token KV 元素数单 Token KV 大小(FP16)1M 上下文总量
Qwen2.5-72B GQA 80 8×128×2 = 2048 320 KB 305 GB
DeepSeek-V3 MLA 61 576 68.6 KB 65 GB
Qwen3.5-397B 混合(15/60 全注意力) 15(有效) 2×256×2 = 1024 30 KB 28.6 GB
DeepSeek-V4 CSA+HCA 61(混合压缩) CSA: 512/4=128, HCA: 512/128=4 7.7 KB 7.4 GB

注:1M = 1,000,000 tokens。"单 Token KV 大小"= 每层元素数 × 层数 × 2 字节(FP16)。V3 有效 KV 维度为 576(kv_lora_rank + qk_rope_head_dim),V4 采用 Shared-KV(K=V 共享,只缓存一份 512 维向量,无需 ×2)。V4 另有每层 128 token 滑窗固定开销(约 7.6 MB),长序列下占比可忽略。

同样是 1M 上下文、单个请求,Qwen2.5-72B(GQA)需要 305 GB KVCache,而 DeepSeek-V4 仅需 7.4 GB——相差约 41 倍。这意味着同一块 GPU 上,V4 架构能同时服务的并发请求数远超传统 GQA 架构。

这就是 KVCache 优化的核心动机:每省一点 KVCache,就能多服务一个用户,或者支持更长的上下文


5 畅想未来趋势

回顾以上各方向,我们从工程落地的角度做一个横向对比:

演进思路核心技术代表显存瓶颈突破带来的工程复杂度
头数压缩(3.1) GQA 带宽缓解
维度压缩(3.2) MLA 显存容量大幅释放 中(需支持矩阵吸收或 Kernel 支持解压
稀疏注意力(3.3) CSA/HCA/NSA 序列级显存释放 高(需动态调度和稀疏 Kernel)
线性注意力(3.4) Gated DeltaNet/Mamba 彻底解除线性增长 高(需重构计算范式)
精度压缩(3.5) FP8/FP4 + 向量压缩 显存容量直接减半 低(生产环境标配)

站在多轮交互 Agent 越来越流行的今天,长上下文的诉求变得更加迫切。我们可以清晰地看到,当前业界正沿着两条核心路径做演进:

  • 稀疏注意力(Sparse Attention):以 DeepSeek V4 的 CSA/HCA、GLM-5 的 MLA+DSA 为代表,通过分层稀疏机制仅让高相关的 Token 参与计算,在保持全局建模精度的同时,将 KVCache 冗余度压至极限。
  • 线性注意力(Linear Attention):以 Qwen3.5 的 Gated DeltaNet + Gated Attention 混合架构、Kimi 的 KDA(Kimi Delta Attention)+ MLA 混合架构、MiniMax-M1 的 Lightning Attention + Softmax Attention 混合架构为代表,用固定大小的隐状态替代随序列增长的 KVCache,将显存复杂度从 O(n) 降至 O(1),从根本上解除显存与序列长度的线性绑定。

未来哪条路径胜出?也许答案是融合——线性注意力负责超长距离的全局编码,稀疏注意力负责中近距离的精确检索,滑动窗口负责局部的高保真注意力。也许是某个尚未出现的创造性突破。值得期待。


6 参考资料

在学习和总结过程中除了借助 AI 工具,以下文章也提供了较大帮助:

  1. Qwen3-Next:迈向更极致的训练推理性价比
  2. DeepSeek-V4: Towards Highly Efficient Million-Token Context Intelligence
  3. MQA/GQA/YOCO/CLA/MLKV笔记: 层内和层间KV Cache共享
  4. 【DeepSeek 注意力】MHA、MLA、DSA、CSA/HCA——从 V1 到 V4

本文所在:https://www.cnblogs.com/cswuyg/p/19981922