Skip to content
  • 算法架构层面的优化:改变了注意力计算的结构。
    • 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 允许模型在不同的表示子空间中同时关注来自不同位置的信息。就像一个专家小组,每个专家(头)关注输入的不同方面,综合起来能得到更丰富的表示。

  • 工作方式

    1. 输入 Q, K, V 矩阵。
    2. 分别通过不同的线性层,将 Q, K, V 切分为 h 个头(Head)。
    3. 每个头独立计算 Attention(Q_i, K_i, V_i) = softmax(Q_i * K_i^T / sqrt(d_k)) * V_i
    4. h 个头的输出结果拼接起来。
    5. 通过一个最终的线性层进行整合。
  • 瓶颈: 在推理阶段,模型每生成一个 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 的数据量最小,极大地缓解了内存带宽瓶颈,因此推理速度非常快。
  • 劣势/权衡

    • 可能导致模型质量下降:因为所有 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 之间来回读写,会成为巨大的性能瓶颈。

  • 工作方式

    1. Tiling (分块):将输入的 Q, K, V 矩阵分成小块(tile)。
    2. Kernel Fusion (算子融合):将整个注意力计算(矩阵乘法、缩放、softmax、与 V 相乘)融合成一个单一的 CUDA kernel。
    3. 内存优化:在 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,会导致严重的内存浪费和碎片化。

    1. 内部碎片:如果一个请求的序列长度远小于预分配的最大长度,大量内存被浪费。
    2. 外部碎片:不同请求的生命周期不同,会导致内存中出现很多不连续的小空闲块,无法满足新请求的分配。
  • 工作方式

    1. 分页(Paging):将 KV Cache 划分为固定大小的块(Page),这些块在物理显存中可以非连续存储
    2. 页表(Page Table):为每个序列维护一个页表,记录逻辑块到物理块的映射关系。
    3. 按需分配:当生成新 token 时,只需为其分配一个新的物理块,并更新页表即可,无需移动或重新分配整个 KV Cache。
  • 优势

    • 接近零的内存浪费:内存利用率几乎达到 100%。
    • 高效的内存共享:对于多个请求有相同前缀(例如,相同的系统提示或多轮对话的共同历史)的情况,可以让它们的页表指向相同的物理块,实现 Copy-on-Write,极大地节省了内存。
    • 更高的吞吐量:由于内存效率极高,可以在同一张 GPU 卡上并行处理更多的请求,显著提升系统的吞吐量。

总结与对比

特性Multi-Head Attention (MHA)Multi-Query Attention (MQA)Grouped-Query Attention (GQA)Flash AttentionPage 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 内存管理。