Appearance
- 算法架构层面的优化:改变了注意力计算的结构。
- Multi-Head Attention (MHA):原始的、经典的并行化注意力机制。
- Multi-Query Attention (MQA):MHA 的一种变体,旨在减少推理时的内存开销和带宽,但可能导致模型质量下降。
- Grouped-Query Attention (GQA):MHA 和 MQA 之间的一种折中方案,旨在减少推理时的内存开销和带宽的同时,保持模型性能。
- 系统实现层面的优化:改变了计算的执行方式和内存管理,而不是算法本身。
- Flash Attention:一种针对 GPU 硬件优化的、内存高效的精确注意力算法实现。
- Page Attention:一种针对 LLM 推理过程中 KV Cache 的高效内存管理技术。
下面我们来详细解析每一个优化,并进行对比。
1. Multi-Head Attention (MHA)
核心思想: MHA 是 Transformer 模型的基石。它没有使用单一的注意力计算,而是将 Query (Q), Key (K), Value (V) 投影(project)到多个不同的、低维度的子空间中,在每个子空间(称为头)里并行地计算注意力,最后将所有头的结果拼接起来,再进行一次线性变换。
解决的问题: 相比于单一注意力,MHA 允许模型在不同的表示子空间中同时关注来自不同位置的信息。就像一个专家小组,每个专家(头)关注输入的不同方面,综合起来能得到更丰富的表示。
工作方式:
- 输入 Q, K, V 矩阵。
- 分别通过不同的线性层,将 Q, K, V 切分为
h
个头(Head)。 - 每个头独立计算
Attention(Q_i, K_i, V_i) = softmax(Q_i * K_i^T / sqrt(d_k)) * V_i
。 - 将
h
个头的输出结果拼接起来。 - 通过一个最终的线性层进行整合。
瓶颈: 在推理阶段,模型每生成一个 token,都需要将这个新 token 的 Key 和 Value 与之前所有 token 的 Key 和 Value(统称为 KV Cache)进行计算。随着上下文窗口的增长,KV Cache 会变得非常巨大,消耗大量显存,并且加载 KV Cache 的内存带宽成为主要瓶颈。
2. Multi-Query Attention (MQA)
核心思想: MQA 是对 MHA 的一种简化,其核心思想是让所有的 Query 头共享同一组 K/V 头。也就是说,模型仍然有多个 Query 头来从不同角度“提问”,但只有一个 K/V 头来提供上下文信息。
解决的问题: MQA 旨在解决 MHA 在长序列推理时,因 KV Cache 过大而导致的显存占用和内存带宽瓶颈问题。MQA 是这个方向上最激进的优化。
工作方式:
- 模型有
N
个 Query 头。 - 但模型只有 1 个 Key 头和 1 个 Value 头。
- 所有的
N
个 Query 头都与这唯一的 K/V 头进行注意力计算。
- 模型有
优势:
- 最大程度地减少 KV Cache:相比 MHA,KV Cache 的大小直接减少为原来的
1/N
,节省了大量显存。 - 最大程度地提升推理速度:在自回归生成的每一步,从 HBM 加载 K 和 V 的数据量最小,极大地缓解了内存带宽瓶颈,因此推理速度非常快。
- 最大程度地减少 KV Cache:相比 MHA,KV Cache 的大小直接减少为原来的
劣势/权衡:
- 可能导致模型质量下降:因为所有 Query 头被迫从同一个 K/V 表示中提取信息,这限制了模型从不同子空间学习多样化特征的能力,可能会导致模型表达能力的下降和最终性能的损失。
- 训练可能不稳定:在某些情况下,MQA 的训练过程可能不如 MHA 稳定。
3. Grouped-Query Attention (GQA)
核心思想: GQA 是 MHA 和 MQA 之间的一种折中方案。在 MQA 中,所有的 Query 头共享同一组 K/V 头,极大地减少了 KV Cache,但可能导致模型质量下降。GQA 认为,完全不共享(MHA)太慢,完全共享(MQA)质量有损,那么分组共享可能是一个最佳的 sweet spot。GQA 则将 Query 头分组,组内的 Query 头共享同一组 K/V 头。
解决的问题: GQA 旨在解决 MHA 在长序列推理时,因 KV Cache 过大而导致的显存占用和内存带宽瓶颈问题。GQA 是这个方向上一种权衡的优化。
工作方式:
- MHA:有 N 个 Query 头,就有 N 个 Key 头和 N 个 Value 头。
- MQA:有 N 个 Query 头,但只有 1 个 Key 头和 1 个 Value 头。
- GQA:有 N 个 Query 头,被分为 G 组,于是有 G 个 Key 头和 G 个 Value 头。每 N/G 个 Query 头共享一对 K/V 头。
优势:
- 显著减少 KV Cache 大小:KV 头的数量从 N 减少到 G(G 通常远小于 N),KV Cache 大小也相应地成倍减小。
- 加快推理速度:加载 KV Cache 的数据量变少了,减轻了内存带宽压力,推理速度更快。
- 保持模型性能:相比 MQA,GQA 提供了更好的模型质量和训练稳定性,是一种更优的平衡。像 Qwen3 系列模型都采用了 GQA。
4. Flash Attention
核心思想: Flash Attention 是一种实现层面的优化,它不是一种新的注意力架构。它的目标是在 GPU 上更快、更省内存地计算完全相同的标准注意力(可以是 MHA 或 GQA)。它通过优化 GPU 内存(HBM)和高速缓存(SRAM)之间的数据读写来实现。
解决的问题: 标准注意力计算是一个受限于内存带宽的操作。在计算
softmax(QK^T)
时,需要生成一个巨大的中间矩阵(Attention Score Matrix),这个矩阵的大小是(序列长度 L) x (序列长度 L)
。当 L很大时,将这个矩阵在 GPU 的慢速 HBM 和快速 SRAM 之间来回读写,会成为巨大的性能瓶颈。工作方式:
- Tiling (分块):将输入的 Q, K, V 矩阵分成小块(tile)。
- Kernel Fusion (算子融合):将整个注意力计算(矩阵乘法、缩放、softmax、与 V 相乘)融合成一个单一的 CUDA kernel。
- 内存优化:在 GPU 的高速 SRAM 中,加载一小块 Q, K, V,完成这部分的注意力计算,然后直接得到最终结果的一部分,而无需将巨大的中间注意力矩阵写回 HBM。它通过一种在线 softmax 的技巧来保证数值的稳定性。
优势:
- 大幅提升训练和推理速度:减少了 HBM 的读写次数,计算速度接近 GPU 的理论浮点运算上限。
- 显著节省内存:由于不存储中间的
L x L
注意力矩阵,内存占用从 O(L²) 降低到 O(L)。 - 结果精确:它计算的是与标准注意力完全相同的结果,不是近似算法。
5. Page Attention
核心思想: Page Attention 是一种内存管理技术,主要用于 LLM 推理,由 vLLM 项目提出。它借鉴了操作系统中虚拟内存和分页的思想来管理巨大的、动态变化的 KV Cache。
解决的问题: 在传统的推理系统中,为每个请求预先分配一块连续的、足够大的显存来存储 KV Cache,会导致严重的内存浪费和碎片化。
- 内部碎片:如果一个请求的序列长度远小于预分配的最大长度,大量内存被浪费。
- 外部碎片:不同请求的生命周期不同,会导致内存中出现很多不连续的小空闲块,无法满足新请求的分配。
工作方式:
- 分页(Paging):将 KV Cache 划分为固定大小的块(Page),这些块在物理显存中可以非连续存储。
- 页表(Page Table):为每个序列维护一个页表,记录逻辑块到物理块的映射关系。
- 按需分配:当生成新 token 时,只需为其分配一个新的物理块,并更新页表即可,无需移动或重新分配整个 KV Cache。
优势:
- 接近零的内存浪费:内存利用率几乎达到 100%。
- 高效的内存共享:对于多个请求有相同前缀(例如,相同的系统提示或多轮对话的共同历史)的情况,可以让它们的页表指向相同的物理块,实现 Copy-on-Write,极大地节省了内存。
- 更高的吞吐量:由于内存效率极高,可以在同一张 GPU 卡上并行处理更多的请求,显著提升系统的吞吐量。
总结与对比
特性 | Multi-Head Attention (MHA) | Multi-Query Attention (MQA) | Grouped-Query Attention (GQA) | Flash Attention | Page Attention |
---|---|---|---|---|---|
优化层面 | 算法/架构 | 算法/架构 (MHA的变体) | 算法/架构 (MHA和MQA的折中) | 系统/实现 (底层CUDA优化) | 系统/实现 (内存管理) |
核心目的 | 提升模型表达能力,并行化计算 | 最大化减少推理时 KV Cache 大小和内存带宽 | 减少推理时 KV Cache 大小和内存带宽 | 加速计算,减少内存读写,解决HBM带宽瓶颈 | 高效管理 KV Cache,消除内存碎片,提升吞吐量 |
K/V 头数量 | N 个 Query 头, N 个 K/V 头 | N 个 Query 头, 1 个 K/V 头 | N 个 Query 头, G 个 K/V 头 (1 < G < N) | 不改变头的数量 | 不改变头的数量 |
是否改变数学结果 | - (基准) | 是,模型结构改变 | 是,模型结构改变 | 否,计算结果与标准注意力完全相同 | 否,不改变任何计算,只管理内存 |
推理性能 vs 模型质量 | 质量最高,性能最低 | 性能最高,质量可能下降 | 性能和质量的平衡 | 纯粹的性能提升,不影响质量 | 提升系统吞吐量,不影响单次计算 |
如何协同工作 | 基础架构 | 替代 MHA/GQA | 替代 MHA/MQA | 可用于实现 MHA/MQA/GQA 的计算 | 可用于管理 MHA/MQA/GQA 的 KV Cache |
一个比喻来理解它们的关系:
假设你在组织一个大型会议。
Multi-Head Attention (MHA): 结构:设立了 12 个并行的圆桌讨论。每个圆桌(Query Head)都有自己专属的一组专家(Key Head)和记录员(Value Head)。 效果:讨论质量最高,但成本(专家和记录员人数)也最高。
Multi-Query Attention (MQA): 结构:还是有 12 个圆桌,但整个会场只有一组中央专家和记录员。所有圆桌(Query Head)都得去和他们讨论。 效果:成本极低,效率极高。但所有讨论都依赖同一组信息源,可能会缺乏多样性和深度。
Grouped-Query Attention (GQA): 结构:12 个圆桌被分成 4 组,每 3 个圆桌共享一组专家和记录员。 效果:成本和效率介于 MHA 和 MQA 之间。既节省了资源,又在一定程度上保留了讨论的多样性。这是一个很好的折中方案。
Flash Attention: 执行方式:无论采用哪种会议结构(MHA/MQA/GQA),这是一种高效的会议流程。它优化了资料(数据)在会场(HBM)和个人笔记本(SRAM)之间的传递方式,避免了来回跑动,使得每次讨论本身的速度飞快。
Page Attention: 场地管理:这是一种灵活的场地分配系统。它把整个会议中心(显存)划分为标准小隔间(Page),按需分配给各个讨论组。如果两个组的讨论内容有重叠(例如基于同一份背景材料),可以让他们共享同一个资料隔间,极大地提高了场地利用率,从而能同时举办更多的会议(处理更多请求)。
总结:MHA、MQA 和 GQA 是模型架构设计上的选择,它们决定了注意力的内在结构和效率/质量的权衡。而 Flash Attention 和 Page Attention 是系统实现层面的工程优化,它们可以在不改变模型架构的前提下,极大地提升计算效率和内存管理效率。一个现代化的 LLM 推理引擎,通常会使用 GQA 架构,并通过 Flash Attention 来加速其计算,同时利用 Page Attention 优化 KV Cache 内存管理。