LLM 推理的成本主要来自两个瓶颈:重复计算历史 token 的键值(KV-Cache 解决),以及注意力机制的二次方复杂度(Flash Attention 解决)。
KV-Cache
Transformer 的自回归生成每次都要重新计算所有历史 token 的 K 和 V。KV-Cache 把它们存起来,只计算新 token:
// 没有 KV-Cache:每次 forward 都重新计算所有历史
// O(n²) 复杂度
// 有 KV-Cache:只计算新 token 的 K/V
// O(n) 复杂度(对当前 token)
type KVCache struct {
K []Tensor // [layer, head, seq, headDim]
V []Tensor
}
func (cache *KVCache) Update(layer int, newK, newV Tensor) {
cache.K[layer] = cache.K[layer].Cat(newK, 2) // 沿 seq 维度拼接
cache.V[layer] = cache.V[layer].Cat(newV, 2)
}
Flash Attention
标准注意力的内存访问模式对 GPU 不友好:
标准 Attention:
1. 计算 S = Q @ K^T → 加载 Q, K,写出 S
2. 计算 P = softmax(S) → 加载 S,写出 P
3. 计算 O = P @ V → 加载 P, V,写出 O
Flash Attention(分块 + 在线 softmax):
1. 把 Q, K, V 分成小块
2. 每块在 SRAM 内完成 softmax + 输出
3. 不需要写出中间矩阵 S 和 P
Born 的 flashAttentionShader 实现了此算法,WGSL 代码约 200 行。
推理优化总结
| 技术 | 效果 | Born 实现 |
|---|---|---|
| KV-Cache | 避免重复计算 | KVCache 结构 |
| Flash Attention | 减少 HBM 访问 | flashAttentionShader |
| GQA | 减少 KV-Cache 内存 | NewGQA() |
| 量化 | 减少模型体积 | GGUF Q4_0 加载 |
📘 《Born》连载技术书,第 17/22 章。
登录后可参与表态
讨论回复
0 条回复还没有人回复,快来发表你的看法吧!
推荐
推荐
智谱 GLM-5 已上线
我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。
领取 2000万 Tokens
通过邀请链接注册即可获得大礼包,期待和你一起在 BigModel 上畅享卓越模型能力