注意力优化
O(n²) 注意力是推理成本的核心。面试主线:KV cache 解决什么、GQA 怎么省显存、RoPE 怎么外推、Flash Attention 怎么加速。
KV cache:推理的关键优化
生成是自回归的:每个新 token 都要重新算注意力。KV cache 缓存历史 token 的 K/V,新 token 只算自己的 Q 和新的 K/V:
无 cache: 每个新 token 重算全部历史的 QKV → 第 t 步 O(t²), 全程 O(n³)
有 cache: 只算新 token 的 Q/K/V, 历史 KV 复用 → 第 t 步 O(t), 全程 O(n²)- 推理速度提升一个量级
- 代价:显存。KV cache 随序列线性增长,长上下文 + 高并发 = 显存大头
- 面试点:长上下文贵在 KV cache 显存,不是计算。这也解释了为什么上下文越长单请求成本越高
MQA 与 GQA
多头注意力的 K/V 也是多头(h 份)。优化:共享 K/V 头。
| 方案 | K/V 头数 | 效果 |
|---|---|---|
| MHA(原始) | h 个 | 质量最高,KV cache 最大 |
| MQA | 1 个 | KV cache 最小,质量略降 |
| GQA | g 个(如 8) | 折中,质量接近 MHA,KV cache 大幅缩小 |
**GQA(分组查询注意力)**是现代大模型标准(Llama 2/3、Qwen 都用):查询保持多头,键值分组共享。收益在推理:KV cache 显存降 4-8 倍,吞吐翻倍。
RoPE:旋转位置编码
- 把位置信息编码成旋转矩阵,作用在 Q/K 上
- 特性:相对位置(两个 token 的注意力只依赖它们的距离)
- 外推性:训练 4K 长度,可以推广到更长(配合长度外推技术,见上下文窗口篇)
- 现代大模型标配(GPT-NeoX、Llama、Qwen)
Flash Attention:IO 优化
注意力慢的瓶颈不在计算,在显存读写(QK^T 中间矩阵要写回显存再读):
- 分块计算:不落中间矩阵,按块在 SRAM 算完
- 在线 softmax:分块安全地算 softmax
- 效果:训练/推理加速 2-4 倍,显存占用从 O(n²) 降到 O(n)
面试话术:Flash Attention 是 IO 优化(少读写),不是算法优化。
稀疏注意力
- 长序列下让每个 token 只看部分上下文:局部窗口 + 全局 token + 随机采样
- 代表:Longformer、BigBird、滑动窗口(Mistral)
- 效果:复杂度从 O(n²) 降到 O(n),质量有取舍
面试追问
- KV cache 是什么? 缓存历史 token 的 K/V,新 token 只算自己的。推理从 O(n²) 变 O(n)
- GQA 为什么流行? K/V 头分组共享,KV cache 显存降 4-8 倍,质量损失小。推理吞吐关键
- RoPE 的特性? 旋转编码相对位置,外推性好。现代大模型标配
- Flash Attention 优化了什么? IO:分块计算避免中间矩阵落显存。不是算法变快,是少搬数据
- 长上下文贵在哪? KV cache 显存随序列线性增长,不是计算。长上下文 = 高显存成本