一次讲清注意力的两笔账(计算量与显存),以及四代 KV Cache 瘦身与三代算子加速
Transformer 之所以能撑起整个大模型时代,核心就一个算子:注意力(Attention)。但注意力也是大模型推理里最贵的一环——它的复杂度随序列长度平方增长,它的 KV Cache 能把显存吃光,它的访存模式决定了 GPU 到底在算还是在等数据。
本文从注意力的原理出发,讲清「两笔账」,再沿着两条主线展开:KV Cache 怎么瘦身(MHA → MQA → GQA → MLA)、注意力算子怎么加速(FlashAttention → 稀疏注意力 → 线性注意力)。
自注意力的全部内容就是这个公式:
Attention(Q, K, V) = softmax(QK^T / √d_k) · V
拆开看三步:
多头注意力(MHA):把 Q/K/V 切成 h 个头,各自独立做一次注意力,再拼接、投影。多个头相当于在不同子空间并行捕捉不同关系(语法、指代、位置……)。
复杂度:O(n² · d)——序列长度翻倍,计算量翻 4 倍。这就是长上下文的第一道坎(百万 token 的全注意力需要 EB 级内存,远超单机)。
训练时必须保存中间注意力矩阵(前向的 S、softmax 结果,反向要用),显存占用 O(n²) 量级。序列 32K、batch 一大,光注意力矩阵就能撑爆 80GB。
推理时为了避免每个新 token 重算历史,引擎会把历史 token 的 K 和 V 缓存下来(这就是 KV Cache)。单请求每 token 的 KV Cache 大小:
KV Cache = 2 × n_kv_heads × d_head × n_layers × dtype_bytes
注意 n_kv_heads——KV 头数,正是四代注意力架构演进的主战场。
| 阶段 | 干什么 | 瓶颈 | 注意力形态 |
|---|---|---|---|
| Prefill | 一次性处理全部输入 prompt | 计算密集(大矩阵乘满算力) | 大 Q × 大 K,算力受限 |
| Decode | 逐个生成 token | 访存密集(每步都要读全部 KV Cache) | 单 Q × 长 K,带宽受限 |
这解释了一个关键现象:推理越到后面越慢——Decode 每生成一个 token 都要把整个 KV Cache 从 HBM(显存)读一遍,GPU 算力利用率极低,全在等内存。所以KV Cache 的大小和访存效率,直接决定推理成本。
每个注意力头都有独立的 Q、K、V。表达力最强,但 KV Cache 也最大:n_kv_heads = n_heads。
所有头共享一组 K、V,只保留多组 Q。KV Cache 直接缩到 1/n_heads(如 32 头模型缩到 1/32)。
把 Q 头分组,每组共享一组 K、V。既不像 MHA 那么占显存,也不像 MQA 那么伤质量。
DeepSeek 提出的方案:不直接缓存 K、V,而是把输入压缩成一个低维潜向量(latent vector),推理时再解压回 K、V。
| 架构 | KV 头数 | KV Cache 相对大小 | 表达能力 | 代表模型 |
|---|---|---|---|---|
| MHA | = Q 头数 | 100% | 最强 | 原始 Transformer、Llama 1 |
| MQA | 1 | ~1/n_heads(最小) | 有损失 | PaLM、Falcon |
| GQA | 分组(如 1/4) | 中等 | 接近 MHA | Llama 2/3、Qwen、Mistral |
| MLA | 潜向量压缩 | 4%~14% | 不降反升 | DeepSeek-V2/V3/R1 |
从 MHA 到 MLA 这场演进,把 KV Cache 从「305 GB 级」一路压到「7.4 GB 级」——同一个模型、同一段上下文,显存开销差了两个数量级,这就是架构创新的价值。
选型建议:自己训模型优先 GQA(生态最成熟、质量可控);追极致成本与长上下文可评估 MLA;MQA 只在极端显存受限场景考虑。
标准实现的流程是:S = QKᵀ → 写回 HBM → 读出来做 softmax → 写回 → 读出来乘 V。问题在于 n×n 的 S 矩阵必须落显存,而 HBM(显存)又大又慢,真正快的 SRAM(片上缓存)却只有几十 MB。
结果就是:算力没被 FLOPs 卡住,反而被数据搬运卡住。
FlashAttention 是 IO 感知(IO-aware)的精确注意力——数学结果与标准注意力完全一致,但中间结果不落显存:
一句话:FlashAttention 已经是现代大模型的标配算子,Llama、Falcon、MPT 等全部默认使用。
全注意力每个 token 都要看所有 token,而实际语言里大部分 token 对当前 token 并不重要。稀疏注意力就是「只算该算的那些」。
| 模式 | 结构 | 特点 |
|---|---|---|
| 滑动窗口(Sliding Window) | 每个 token 只看前后 W 个位置 | 单层感受野小,但 L 层堆叠后有效感受野 = W × L(Mistral 7B 用 W=4096,32 层堆叠理论超 128K) |
| Longformer | 局部窗口 + 少量全局 token(如 [CLS]) | 全局 token 充当信息枢纽 |
| BigBird | 局部窗口 + 全局 token + 随机连接 | 随机连接保证远距离可达 |
DeepSeek 的 NSA(Native Sparse Attention,原生稀疏注意力)代表最新一代思路,不再是「打补丁式稀疏」,而是把稀疏性写进架构:
核心挑战是减少访存而非单纯减少计算量——与 GPU 的 Tensor Core、内存层级深度耦合,需要算子级协同优化。
vLLM 的 PageAttention 借鉴操作系统虚拟内存分页思想,把 KV Cache 切成固定大小的 block,按需分配、非连续存储:
如果稀疏注意力是「少算一些」,线性注意力则是换一种算法。
用核函数(kernel trick)重写注意力公式,把 softmax 换成可分解的核函数,从而改变计算顺序:
(QK^T)V → Q(K^TV) # 先算 K^T V(d×d 小矩阵),复杂度降到 O(n)
Mamba 基于选择性状态空间模型(Selective SSM / S6):用一个随输入动态更新的隐状态来传递信息,兼具 RNN 的线性复杂度与 Transformer 的建模能力。
现实答案多半是混合:
注意力机制二十年没被替换,是因为它足够简单又足够强;而大模型这几年的架构创新,几乎都围绕降低注意力的两笔账展开:
看懂这两条主线,再看新出的架构(MLA、NSA、Mamba 混合),就能一眼判断它到底在解决哪个瓶颈。
注意力算子调优、KV Cache 管理、长上下文部署,都是持续的基础设施工程。向量云(南京)科技有限公司依托字节跳动火山方舟官方授权,专注大模型应用落地:
| 向量云能力 | 说明 |
|---|---|
| 官方授权接入 | 火山方舟官方 API 与官方 Key 直连 |
| 低折扣 Token | 专属折扣价,用量越大越划算 |
| 独享接入点 | 独立接入点,缓存与配额不被公共池挤占 |
| 缓存隔离降本 | 上下文缓存红利稳定落袋 |
| 计费灵活 | 按量计费、即用即扣、注册充值 10 元起 |
| 协议兼容 | OpenAI 兼容协议,业务代码几乎零改动 |
接入方式:注册后获取官方 API Key,把 base_url 指向向量云接入点即可直接调用火山方舟官方模型。
获取 API Key:https://ark.tokenrize.cn/ · 火山方舟官方 API 与 Key 直连,注册即用
一句话总结:注意力的两笔账——计算量与显存;两条主线——KV Cache 瘦身(MHA→MQA→GQA→MLA)与算子加速(FlashAttention→稀疏→线性)。看懂它们,就看懂了大模型架构演进的全部密码。
面向大模型应用落地的技术服务型企业,依托字节跳动火山方舟能力,为合作方提供低折扣模型 Token、可独立部署的运营支撑平台及全链路运营支持。
火山方舟官方 API 与官方 Key 直连 · 向量云 · 大模型注意力机制
A. 核心公式是 Attention(Q,K,V) = softmax(QKᵀ/√d_k)·V。第一步 QKᵀ 得到一个 n×n 的相似度矩阵(n 为序列长度),所以计算与显存都随序列长度平方增长,这就是 O(n²)。序列翻倍,开销翻四倍,长上下文因此成为大模型的核心难题。
A. 四者都是对 KV Cache 的不同权衡:MHA 每个头独立 KV,表达力最强但显存最大;MQA 所有头共享一组 KV,压缩最狠(1/n_heads)但质量有损;GQA 分组共享 KV,是质量与显存的最优折中,也是当今开源大模型默认选择;MLA 用低秩潜向量压缩 KV,KV Cache 仅为 MHA 的 4%~14% 且质量不降,代表是 DeepSeek-V2/V3/R1。
A. 它是 IO 感知的精确注意力(结果与标准注意力完全一致):① Tiling 分块,逐块加载进 SRAM;② 在线 Softmax 用滑动统计量边算边归一化,无需保存 n×n 矩阵;③ 反向重算代替存储中间结果。因此中间显存从 O(n²) 降到 O(n),速度提升 2~4 倍、内存省 5~20 倍。
A. 三类经典模式:滑窗注意力(每个 token 只看前后 W 个位置,L 层堆叠后有效感受野 W×L,Mistral 采用)、Longformer(局部窗口 + 全局 token)、BigBird(局部 + 全局 + 随机连接)。最新一代是 DeepSeek 的 NSA(原生稀疏注意力),通过「压缩 + 选择 + 滑动窗口 + 可学习门控」把稀疏从优化手段升级为结构原则。
A. 线性注意力用核函数重写公式,把复杂度降到 O(n);Mamba 基于选择性状态空间模型,线性复杂度且推理显存恒定(无需 KV Cache)。二者在长序列上效率极高,但在需要精确检索的任务上召回精度仍不如全注意力。现实答案多是混合架构(如 Jamba、Kimi Linear):多数层用线性/稀疏,少数层保留全注意力。
A. Prefill 一次性处理全部 prompt,是大矩阵乘,计算密集、算力利用率高;Decode 每生成一个 token 都要把整个 KV Cache 从显存读一遍,属于访存密集,GPU 算力大量空转在等内存带宽。所以 Decode 的瓶颈是显存带宽,KV Cache 越大越慢——这也是 MLA、GQA 等架构压缩 KV 的根本动机。
A. 四件事优先级最高:① 开启 FlashAttention(确认版本与精度匹配);② 架构层面确认使用 GQA/MLA 等 KV 压缩方案;③ KV Cache 量化(FP16→FP8/INT8);④ 用 PageAttention 分页管理 KV Cache 并叠加前缀缓存。前两项定架构,后两项提吞吐,收益通常最立竿见影。