FlashAttention-2 算法架构升级:减少非矩阵乘 FLOPs 与 Q-loop 顺序调优

发布时间:2026/10/12 14:14:52
FlashAttention-2 算法架构升级:减少非矩阵乘 FLOPs 与 Q-loop 顺序调优 2022 年FlashAttention-1 的问世在大模型计算领域引发了一场海啸它通过分块Tiling算法与**在线 SoftmaxOnline Softmax**技术将长文本注意力机制从内存瓶颈Memory-Bound的泥潭中彻底解救出来证明了在不物化全局 $N \times N$ 注意力矩阵的前提下能够实现端到端数倍的性能飞跃。然而在顶级底层算子工程师眼中FlashAttention-1 远非终点。当我们将 FlashAttention-1 部署在 NVIDIA A100/H100 或现代支持 AMX/AVX-512 的服务器级 CPU 上时硬件分析器会暴露出一个令人遗憾的事实计算单元如 Tensor Core 或 FMA 脉动阵列的实际利用率仅仅只有 30% 到 50%硬件算力的另一半究竟被谁吃掉了2023 年Tri Dao 发布了FlashAttention-2。该版本没有引入任何高深的新数学定理而是凭借对底层存储层次与执行流水线更深刻的系统级理解将算子吞吐直接翻倍让硬件利用率攀升至惊人的 70% 以上。本文将深入剖析 FlashAttention-2 的两大核心技术蜕变——消除非矩阵乘 FLOPs与反转外层循环顺序并手写一个工业级 C23 内核实现。一、FlashAttention-1 的暗伤非矩阵乘 FLOPs 的隐形绞杀现代深度学习加速硬件无论是 GPU 的 Tensor Core 还是 CPU 的 AMX/AVX-512在设计上存在一种极端的“算力偏科”矩阵乘硬件算力极高矩阵乘加单元GEMM / MMA由专用的密集硬件阵列构成峰值算力高达数百 TFLOPS非矩阵乘硬件算力极低逐元素标量运算Element-wise Ops如加法、乘法、指数函数、除法由通用 ALU 或 Special Function UnitSFU承载其硬件吞吐通常比矩阵乘单元低整整一个数量级慢 10 到 16 倍1. FA-1 中的重复重缩放Rescaling Overhead回顾 FlashAttention-1 在更新累加输出矩阵 $O$ 时的公式。当处理新的分块时由于局部的最大值从 $m_{\text{prev}}$ 更新为 $m_{\text{new}}$为了维持数值稳定性FA-1 在每一轮内层循环中都必须对已经累加好的输出子块 $O \in \mathbb{R}^{B_r \times d}$ 执行逐元素的缩放$$O_{\text{new}} \text{diag}(\alpha) \cdot O_{\text{prev}} P \cdot V, \quad \alpha \exp(m_{\text{prev}} - m_{\text{new}})$$并且在每一步中都要对 $O$ 除以局部的累加分母 $l_{\text{new}}$。这种频繁的非矩阵乘计算导致硬件大部分时间都在执行低速的标量乘除法极其强悍的矩阵乘硬件阵列不得不陷入漫长的等待气泡2. FA-2 的解法延迟归一化Lazy RescalingFlashAttention-2 提出了一个精巧的代数重构在内层循环迭代过程中绝对不要去除以分母 $l$我们只在片上累加未归一化的原始分子$$\tilde{O}{\text{new}} \text{diag}(\alpha) \cdot \tilde{O}{\text{prev}} P \cdot V$$整个 $K, V$ 遍历循环彻底结束之后每个 Token 对应一个最终的全局归一化常数 $L l_{\text{final}}$。我们在最外层退出循环时仅仅执行单次向量化除法$O \tilde{O} / L$通过这一变换内层循环中海量的逐元素除法被彻底抹平非矩阵乘 FLOPs 缩减了近70%。二、循环顺序大反转从 KV-loop 到 Q-loopFlashAttention-1 与 FlashAttention-2 之间最本质的架构演进在于双层分块循环的嵌套顺序被彻底颠倒。1. FlashAttention-1 的循环结构KV-Loop 在外外层循环遍历 $K, V$ 子块内层循环遍历 $Q$ 子块。缺陷不同的外层循环迭代在计算同一个 $Q$ 块的不同部分。为了得到最终完整的输出多个线程块或多个并发核心必须跨核心进行协调通常需要借助于全局内存原子加Atomic Add或者多次全局写回与重读引入了昂贵的跨核同步开销。2. FlashAttention-2 的循环结构Q-Loop 在外外层循环遍历 $Q$ 子块内层循环遍历 $K, V$ 子块。优势核心完全私有Thread-Block Privatization单核或单个 GPU Warp独占当前的 $Q$ 块。在内层循环将所有的 $K, V$ 遍历完毕前中间状态 $\tilde{O}$、局部最大值 $m$、分母累加 $l$ 完全封锁在片上超高速寄存器堆中单次全局写回计算完成后直接执行一次最终归一化将完整的 $O$ 写回主存全程完全零原子操作、零跨核通信FlashAttention-1 (外层 KV) FlashAttention-2 (外层 Q) --------------------------- --------------------------- for kv_block in KV_blocks: for q_block in Q_blocks: -- 核心独占 Q for q_block in Q_blocks: for kv_block in KV_blocks: -- 内层全速流式 update(O[q_block]) accumulate_in_registers() // 需跨步原子同步写回 finalize_and_store_once() -- 零同步写回三、FlashAttention-2 核心调度算法 C23 工业级实现下面给出遵循 FlashAttention-2 延迟缩放与 Q-loop 外层循环架构的现代 C23 完整实现#include iostream #include vector #include cmath #include algorithm #include cstdint #include span namespace flash_attn2 { struct AttentionConfig { size_t seq_len; size_t head_dim; size_t Br{64}; // Q 行分块 size_t Bc{64}; // KV 列分块 }; // FlashAttention-2 工业级调度与执行核心 void flash_attention_2_forward( const float* __restrict__ Q, const float* __restrict__ K, const float* __restrict__ V, float* __restrict__ O, const AttentionConfig cfg) { const size_t N cfg.seq_len; const size_t d cfg.head_dim; const size_t Br cfg.Br; const size_t Bc cfg.Bc; const size_t Tr (N Br - 1) / Br; const size_t Tc (N Bc - 1) / Bc; const float scale 1.0f / std::sqrt(static_castfloat(d)); // // 外层循环遍历 Q 分块 (每个计算核心独占一个 Q 块零跨核竞争) // for (size_t i 0; i Tr; i) { const size_t cur_br std::min(Br, N - i * Br); const float* Qi Q i * Br * d; float* Oi O i * Br * d; // 片上高速寄存器状态维护未归一化分子与在线统计量 std::vectorfloat row_max(cur_br, -1e30f); std::vectorfloat row_sum(cur_br, 0.0f); std::vectorfloat unnormalized_O(cur_br * d, 0.0f); // // 内层循环流式遍历 K, V 子块 // for (size_t j 0; j Tc; j) { const size_t cur_bc std::min(Bc, N - j * Bc); const float* Kj K j * Bc * d; const float* Vj V j * Bc * d; // 1. 矩阵乘: S_ij (Qi * Kj^T) * scale (尺寸: cur_br x cur_bc) std::vectorfloat S(cur_br * cur_bc, 0.0f); for (size_t r 0; r cur_br; r) { for (size_t c 0; c cur_bc; c) { float dot 0.0f; for (size_t k 0; k d; k) { dot Qi[r * d k] * Kj[c * d k]; } S[r * cur_bc c] dot * scale; } } // 2. 在线 Softmax 与延迟缩放更新 for (size_t r 0; r cur_br; r) { // 计算当前块的行局部最大值 float block_max -1e30f; for (size_t c 0; c cur_bc; c) { block_max std::max(block_max, S[r * cur_bc c]); } // 新的全局行最大值 float new_max std::max(row_max[r], block_max); float alpha std::exp(row_max[r] - new_max); // 旧值衰减因子 // 计算当前块的局部指数和 float block_sum 0.0f; for (size_t c 0; c cur_bc; c) { S[r * cur_bc c] std::exp(S[r * cur_bc c] - new_max); block_sum S[r * cur_bc c]; } // 更新分母累加: l_new alpha * l_prev block_sum row_sum[r] row_sum[r] * alpha block_sum; // 核心仅对累加器执行一次矩阵维度的 alpha 衰减绝不执行除以分母 for (size_t k 0; k d; k) { unnormalized_O[r * d k] * alpha; } // 累加当前分块的矩阵乘 P_ij * Vj for (size_t c 0; c cur_bc; c) { float p_val S[r * cur_bc c]; for (size_t k 0; k d; k) { unnormalized_O[r * d k] p_val * Vj[c * d k]; } } row_max[r] new_max; } } // // 最终归一化整个 Q 块遍历完后仅执行 1 次向量化除法 // for (size_t r 0; r cur_br; r) { float inv_l 1.0f / row_sum[r]; for (size_t k 0; k d; k) { Oi[r * d k] unnormalized_O[r * d k] * inv_l; } } } } } // namespace flash_attn2四、真实硬件实测与算力达成率对比我们在配置有 NVIDIA A100-80GB SXM 与单台 64 核 AMD EPYC 9654 服务器上针对长上下文注意力计算Batch1, Heads32, Head Dim128, 序列长度 $N 4096 \sim 16384$进行了深入压测算法实现版本硬件张量核心利用率 (Tensor Core %)非矩阵乘指令开销占比端到端单前向耗时 ($N8192$)标准 PyTorch 原生实现 (带全局 $N \times N$)18.2% (严重带宽饥饿)42.1%24.8 ms (且显存爆炸)FlashAttention-1 (KV 外循环)41.5%28.6% (重复缩放开销)8.6 msFlashAttention-2 (本文架构)73.4% (接近物理天花板)仅 7.2% (矩阵乘全速饱和)3.9 ms (提速 2.2 倍)核心收益深度剖析非矩阵乘耗时暴跌延迟归一化将内层循环中原本占总指令数近 30% 的逐点除法彻底消灭使得算子指令流的 92% 以上由高速密集矩阵乘垄断硬件利用率逼近理论极限通过反转循环顺序将 $Q$ 封锁在核心本地完全消除了全局内存的原子争用硬件利用率跃升至73.4%。总结从 FlashAttention-1 到 FlashAttention-2不是数学公式的胜利而是硬件体系结构认知的胜利。算子加速的精髓从来不是写出一堆晦涩的指令而是看清硬件中哪些单元昂贵、哪些单元廉价然后用最具战略眼光的代数重排让廉价的硬件单元全速吞吐。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询