← 返回 2026-11-09

基于结构感知内核的快速精确相对位置注意力 Fast and Exact Relative-Position Attention via Structure-Aware Kernels

Delyan Boychev, Ivo Petrov, Dimitar I. Dimitrov 📅 2026-10-31 👍 22 2026-11-11 18:30
FlashAttention GPU 系统优化 Triton 注意力内核优化 相对位置编码 语音识别

用结构感知的分块内核精确加速四种相对位置注意力,8K 序列反向最高提速 21 倍

前置知识

FlashAttention 与在线 softmax

精确注意力的 IO 感知实现:把 $Q/K/V$ 切成小块(tile)搬进 GPU 片上 SRAM 计算,用在线 softmax 维护每行运行最大值 $m_i$ 与分母 $\ell_i$;反向重算分数而非存储 $N\times N$ 概率矩阵 $P$,消除对 HBM 的二次方访存。

本文的全部贡献就是把加性相对位置项无损地塞进这套分块前向/反向调度里,只有理解 FlashAttention 的 tile 结构与在线 softmax 状态,才能读懂“结构感知”从何而来、每处优化省在哪里。

加性相对位置注意力(Shaw/TXL/DeBERTa/T5)

在注意力打分上加一个依赖相对距离 $\delta=i-j$ 的可学习项:Shaw 用裁剪偏移的查询-关系投影,Transformer-XL 用 identity 映射加标量偏置 $b_r$,DeBERTa 同时用内容-位置与位置-内容两路投影,T5 只用对数分桶偏置,四者可统一为一个打分方程。

这是论文要加速的对象。只有理解四种机制共享的 $r=\phi(i,j)$ 只依赖偏移的结构,才能看懂统一的 tile 级优化为什么对它们全部适用。

RoPE 与参数无关位置编码

RoPE 对每个 token 的 query/key 做与绝对位置相关的旋转,可在融合内核里作为逐 token 变换无缝实现,几乎零开销;ALiBi 按距离给注意力加线性惩罚。它们计算高效,但外推到训练长度之外的能力常常不如可学习的相对偏置(如 T5 bias、TXL)。

这是论文的动机对比项:正因为 RoPE 能干净地融进内核而相对位置项不能,业界才出现“为效率弃质量、换 RoPE 从头重训”的做法(Flashzoi、FlashSwin、ModernBERT),本文要消除这个两难。

GPU 内存层级与原子加竞争

GPU 显存(HBM)带宽远低于片上 SRAM,内核性能常由访存量决定;多个线程同时对同一地址做 atomicAdd 会串行化且求和顺序不定。相对位置注意力的反向要把许多 $(i,j)$ 的 $\tau\,dS_{ij}$ 加进同一个表梯度条目 $dZ^Q_{ir}$,逐分数原子累加因此成为主要瓶颈。

理解 HBM/SRAM 层次才能明白“饱和 tile 广播单条目、按偏移单写者累加”为何同时提速、省显存并保证确定性——这三点正是本文相对 FlexAttention 的核心优势。

可编程注意力框架(FlexAttention 等)

让用户用 score_mod 等回调自定义注意力变体并自动推导反向、编译进融合内核(FlexAttention、FlashInfer 等)。但回调是逐 $(i,j)$ 的 pointwise 函数:无法跨 tile 复用关系条目、无法协调梯度所有权,位置项仍需逐分数查表与原子加。

它是本文最重要的对照系统。论文把本文的“关系分解式”塞进这些引擎(+ our decomposition)做对比,从而分离出“分解式本身”与“结构感知调度”各自的贡献。

研究动机

可学习相对位置注意力(Shaw、Transformer-XL、DeBERTa、T5)通过在注意力打分上加一个依赖相对距离 $i-j$ 的项来建模平移不变的位置关系,在语音识别(Parakeet、Canary、SeamlessM4T、Phi-4-multimodal)、文本编码与信息抽取(DeBERTa、GLiNER)、蛋白质与基因组建模(ProtTrans、Borzoi)中广泛使用。但与 RoPE 那种逐 token 旋转、可直接融进内核的做法不同,这些机制需要对每个 $(i,j)$ 对做偏移相关的查表或投影:朴素实现直接在 HBM 里构造稠密的 $N\times N$ 偏置矩阵,付出二次方显存与带宽——这正是 FlashAttention 当年要消灭的瓶颈。即便是 FlexAttention 这类可编程注意力框架,也只能把位置项当作逐分数的 pointwise 回调,无法感知 tile 级结构:前向重复访存同一表条目,反向用逐分数原子加累加表梯度,竞争严重且结果不确定。由于缺少高效内核,实践者常常干脆换掉位置编码——Flashzoi、FlashSwin 用 RoPE 替换后从头重训,ModernBERT 干脆改用 RoPE 方案。

本文的目标是本文目标是给出一个精确(exact,不做任何低秩/核化近似)、可直接替换(drop-in,无需改权重)、跨机制的 tiled attention 算法与高性能 Triton 内核,把加性相对位置项纳入 FlashAttention 式分块计算,同时消除三大开销:(1) 计算和存储根本不会被读到的投影列(identity 映射下约一半的 $Z^Q$ 列不可达);(2) 常数偏移区域($|\delta|\ge\Delta$)里的冗余索引与重复访存;(3) 反向传播中逐分数原子加导致的竞争、额外显存与不确定性。最终让这些机制在训练和推理上都更快、更省显存,并通过严格的 FP32 参考数值校验,使相对位置模型不再需要为了效率而被替换成 RoPE。

与已有工作不同的是,以往工作要么把偏置当黑盒稠密矩阵(eager PyTorch、SDPA),要么提供逐分数回调抽象(FlexAttention/FlashInfer/Flashlight),两者都把相对位置项看作与 $(i,j)$ 一一对应的元素级量,因而天然错过块级规律。本文的切入角度是反其道而行:利用相对距离在注意力矩阵上的块级结构——关系行号 $r=\phi(i,j)$ 只依赖偏移 $\delta=i-j$,在远离对角线的 tile 内是常数。论文先把 Shaw/TXL/DeBERTa/T5 统一成一个规范打分方程(Eq. 4,含 $A^Q/A^K/b$ 三类关系表与 identity/clipped/bucketed 三类映射),再首次在内核层面做三件事:只投影每个查询组可达的行号区间 $\Omega^Q_g$、在饱和 tile 里把秩一形式的位置项广播复用、反向按偏移 $\delta$ 而非行号 $r$ 分片累加梯度实现无原子确定性归约。这种“结构感知内核”与通用可编程框架的本质区别在于:优化发生在 tile/调度层,而不是逐分数回调层。

核心方法

直觉上,相对位置项虽然形式上是 $N\times N$ 的成对项,信息量却只有 $N\times R$($R$ 为关系行数):每个位置项由“token 的投影”与“偏移映射到的行”唯一决定。技术路线分三步。第一步把打分改写为 $S_{ij}=\tau\,q_i^\top k_j+Z^Q_{i,\phi(i,j)}+Z^K_{j,\phi(i,j)}+b_{\phi(i,j)}+M_{ij}$,其中 $Z^Q_{ir}=q_i^\top a^Q_r$、$Z^K_{jr}=k_j^\top a^K_r$($Z^Q,Z^K\in\mathbb{R}^{N\times R}$)预先算好存进 HBM,每个 logit 只需最多三次标量查表而非 $d$ 维点积。第二步在前向分块循环内做两个结构优化:查询按 $G=128$ 分组,只投影组内可达的 $N+G-1$ 个连续关系行(identity 映射下投影工作量与存储近乎减半);对 $|\delta|\ge\Delta$ 的饱和 tile,每个查询/键只加载一个标量广播到整个 tile,只有对角带 $|\delta|<\Delta$ 内占比 $\to 0$ 的 pair 需要逐分数查表。第三步反向采用两遍调度(query-parallel 遍算 $dQ$ 与 $d\tilde Z^Q$,key-parallel 遍算 $dK,dV,d\tilde Z^K$),按偏移 $\delta$ 累加梯度:固定 $i$ 时 $j\mapsto\delta=i-j$ 是双射,每个梯度条目只有一个写者,彻底消除 $O(N^2)$ 次原子加并保证确定性。

核心创新是把“关系项的块级结构”变成内核的调度与访存策略,而非像 FlexAttention 那样把位置项当逐分数回调。三个互相配合的点:(1) 可达范围投影:查询组 $Q_g$ 与键组 $K_g$ 只会接触 $N+G-1$ 个连续偏移,故只需对 $A^Q_{\Omega^Q_g}$ 做一次稠密矩阵乘,$N\gg G$ 时投影工作与 HBM 存储几乎减半($G=128$ 在 $N=8K$ 时列开销仅 1.6%),且保持结果精确。(2) 常数区域复用:饱和 tile 中 relation 行号恒定,整个 tile 的位置项可写成秩一形式 $\tau z^Q\mathbf{1}^\top+\mathbf{1}(z^K)^\top+b_r\mathbf{1}\mathbf{1}^\top$,读 $|I|+|J|+1$ 个标量即可,代替 $3|I||J|$ 次查表;tile 是否饱和只需用端点算 $\delta_{\min},\delta_{\max}$ 做两次比较;bucketed 映射先把 $R$ 个桶复制展开成 $2\Delta+1$ 行,用裁剪代替查表,使三类映射统一处理。(3) 按偏移分片的无原子梯度累加:结合饱和区的两个边界 running sum,每 token 梯度条目从 $2N-1$ 降到 $\min(N+G-1,2\Delta+1)$,求和顺序固定、完全确定。这三点都是 tile 级推理,逐分数回调框架在原理上无法表达。

方法步骤详情

前向(Algorithm 1):bucketed 映射先复制表行使 $R=2\Delta+1$;投影内核对每个查询组算 $Z^Q_g=Q_g(A^Q_{\Omega^Q_g})^\top$(键组同理)存入 HBM,可选反向重算以省显存;注意力内核每个查询 tile 一个线程块,片上维护在线 softmax 状态,逐键 tile 算 $S^{IJ}=\tau Q_IK_J^\top+M^{IJ}$,用 tile 端点 $\delta_{\min},\delta_{\max}$ 两次比较判断整 tile 是否饱和($\delta_{\min}\ge\Delta$ 取行 $R-1$、$\delta_{\max}\le-\Delta$ 取行 0)——饱和则每查询/键广播一个标量,否则逐分数加 $Z^Q,Z^K,b$ 三个标量;最后写 $o_i=u_i/\ell_i$ 与 $L_i$。反向(Algorithm 2):query-parallel 遍重建 $S,P,dS$,累加 $dQ_I+=\tau\,dS^{IJ}K_J$ 并按偏移累加 $\tau\,dS_{ij}$(饱和部分并入边界 running sum);key-parallel 遍同理得 $dV,dK,d\tilde Z^K$;最后折叠 bucket 重复列,矩阵乘得 $dQ+=dZ^QA^Q$、$dA^Q=(dZ^Q)^\top Q$、$db=(dZ^Q)^\top\mathbf{1}$。Triton 实现:编译期按机制/映射/掩码/精度/tile 特化,tile 大小按 GPU 查表或自动调优,支持 padding/causal 掩码、变长 packing 与 dropout。

技术新颖性

技术新颖性有四点。(1) 统一形式化:把 Shaw/TXL/DeBERTa/T5 归约为同一规范方程与三类映射(identity/clipped/bucketed),一套内核服务所有架构——此前只有模型特定的 FlashDeBERTa/GLiNER4j(后者仅推理、前者反向数值不过关)。(2) 算法-内核协同设计:利用 $\phi$ 只依赖 $\delta$ 的单调性与饱和性做 tile 级分支(两次比较代替逐分数判断),把“查表问题”转成“区间问题”,这是 pointwise 回调抽象在原理上无法表达的调度自由度。(3) 确定性反向:按偏移分片的单写者归约替代原子加,同时固定求和顺序,训练可复现——注意力内核文献很少同时保证这两点。(4) 精度设计:投影即便输入是 BF16 也以 FP16 存储(舍入误差小 8 倍、clamp 到 $\pm65504$ 防溢出),片上统计量与累加器全 FP32,在线 softmax 用以 2 为底的指数;并定义了严格的通过标准(相对独立 FP32 参考逐元素 5% 相对、0.03 绝对误差内,或相对 $\ell_2$ 误差在 8 个舍入单位内)——实测所有生产系统的 DeBERTa 反向从 4K token 起全部不过关,而本文始终通过。此外“bucket 复制展开 + 裁剪化”是让饱和检测统一适用于三类映射的干净技巧。

Overview of our method. (a) Each score adds the relation terms of its row r = φ(i, j), which stays constant on tiles far from the diagonal. (b) Our method first computes each query group g only on its reachable rows Ω^Q_g. (c) Each shared entry Z^Q_{i,r} is loaded once and reused across key tiles. (d) One thread block per query tile sums gradients on chip, avoiding atomic contention.
Figure 1: Overview of our method. (a) Each score adds the relation terms of its row r = φ(i, j), which stays constant on tiles far from the diagonal. (b) Our method first computes each query group g only on its reachable rows Ω^Q_g. (c) Each shared entry Z^Q_{i,r} is loaded once and reused across key tiles. (d) One thread block per query tile sums gradients on chip, avoiding atomic contention.

实验结果

(1) 注意力层微基准(H200 FP16,128→8K):8K 时对每机制最强生产系统前向提速 1.8–6.4×、反向 2.0–21×(Shaw 6.4×/21×,TXL 1.8×/2.0×,DeBERTa 3.7×/7.1×,T5 4.6×/13×,前向最高 307 TFLOP/s);对加了本文分解式的引擎仍快 1.1–2.2×(前向)与 1.7–228×(反向);T5 反向 128/256 token 仅 0.75–0.82×。峰值显存 8K 前向省 2.9–128×、反向省 1.4–54×(如 Shaw 222 vs 14K MiB),例外是 DeBERTa 前向 GLiNER4j 用重算换更低显存但慢 3.7×。(2) 数值正确性:独立 FP32 参考下本文全过,生产系统的 DeBERTa 反向自 4K 起全不过关。(3) Parakeet 转写 TED-LIUM 3:WER 与原生持平(整场 2.89 vs 2.88),整场 RTFx 492→1103(约 2.2×)、显存 53→11 GiB。(4) Canary 长音频微调:可跑窗口提速 1.09–1.36×,15/18 分钟窗口 SDPA OOM 而本文靠反向重算投影跑通。(5) DeBERTa-v3-base 于 BIGPATENT:精度差 ≤0.3 点,2K/4K 步时提速 2.19×/2.39×,显存 15→7.1、27→7.1 GiB。(6) 消融:无原子梯度贡献反向 2.9–4.4× 提速、1.8–2.6× 省显存并保证确定性;投影预计算贡献前向 2.0–2.9×;tile 内重算换显存则减速 2–5×、显存降到 0.19–0.43×——这正是 15 分钟以上长窗口能训练的原因。

The systems we compare against and their support for each relative-position mechanism. “F” means forward, “B” backward, “†” the backward pass fails our FP32 check from 4K tokens, “–” unsupported.
Table 1: The systems we compare against and their support for each relative-position mechanism. “F” means forward, “B” backward, “†” the backward pass fails our FP32 check from 4K tokens, “–” unsupported.
Improvements of our method at 8K tokens. Top: against implementations with our decomposition (H200). Bottom: speedup (×) over the fastest production system, per GPU.
Table 2: Improvements of our method at 8K tokens. Top: against implementations with our decomposition (H200). Bottom: speedup (×) over the fastest production system, per GPU.
Peak memory (MiB) on the H200 (FP16) at 128 and 8K.
Table 3: Peak memory (MiB) on the H200 (FP16) at 128 and 8K.
Parakeet-TDT-0.6B-v3 transcription of TED-LIUM 3’s test set in NeMo, H200, BF16, as segments and as whole talks.
Table 4: Parakeet-TDT-0.6B-v3 transcription of TED-LIUM 3’s test set in NeMo, H200, BF16, as segments and as whole talks.
Fine-tuning Canary-1B-v2 on windows of up to W. oom denotes when training ran out of memory.
Table 5: Fine-tuning Canary-1B-v2 on windows of up to W. oom denotes when training ran out of memory.
Fine-tuning DeBERTa-v3-base with content truncated to L tokens. HF denotes Transformers’ performance.
Table 6: Fine-tuning DeBERTa-v3-base with content truncated to L tokens. HF denotes Transformers’ performance.
Ablations on an H200 (FP16): latency and peak memory without each method, relative to our method, as the range over the mechanisms it applies to.
Table 7: Ablations on an H200 (FP16): latency and peak memory without each method, relative to our method, as the range over the mechanisms it applies to.
Kernels of our method in launch order, parallelized over heads.
Table 9: Kernels of our method in launch order, parallelized over heads.
Ablations without each method, relative to our method: (a) latency and peak memory on an H200 (FP16) … and (b) HBM traffic (bytes read and written) on an H100 at 4K tokens.
Table 10: Ablations without each method, relative to our method: (a) latency and peak memory on an H200 (FP16) … and (b) HBM traffic (bytes read and written) on an H100 at 4K tokens.
Throughput of every system on the H200 (FP16) at every length.
Table 11: Throughput of every system on the H200 (FP16) at every length.
Peak memory of every system on the H200 (FP16) at every length.
Table 12: Peak memory of every system on the H200 (FP16) at every length.
Throughput of every system on the RTX PRO 6000 Blackwell (FP16) at every length.
Table 13: Throughput of every system on the RTX PRO 6000 Blackwell (FP16) at every length.
Attention throughput on an H200 (FP16). PyTorch, general, and decomposition bars show the fastest system of their kind; labels give the speedup of our method over the fastest system without our decomposition.
Figure 2: Attention throughput on an H200 (FP16). PyTorch, general, and decomposition bars show the fastest system of their kind; labels give the speedup of our method over the fastest system without our decomposition.
查看结构化数据
任务指标本文基线提升
注意力层前向吞吐(Shaw 映射,H200 FP16,8K token) TFLOP/s 279 最快生产系统 PyTorch compile 44 6.4×
注意力层反向吞吐(Shaw,H200 FP16,8K) TFLOP/s 166 最快生产系统 PyTorch eager 8.0 21×
注意力层前向吞吐(T5,H200 FP16,8K) TFLOP/s 307 最快生产系统 PyTorch compile 67 4.6×
注意力层反向吞吐(DeBERTa,H200 FP16,8K) TFLOP/s 101(通过 FP32 校验) 最快生产系统 FlexAttention 14(自 4K 起未通过校验) 7.1×
前向峰值显存(T5,H200 FP16,8K) MiB 24 最省生产系统 3.0K 约 128×
反向峰值显存(Shaw,H200 FP16,8K) MiB 229 最省生产系统 11K 约 48×(论文报告范围 1.4–54×)
整场语音转写(Parakeet-TDT-0.6B-v3,TED-LIUM 3,最长约 25 分钟) RTFx / 显存 / WER 1103 / 11 GiB / 2.89 NeMo 原生 492 / 53 GiB / 2.88 约 2.2× 提速、4.8× 省显存,WER 持平
长音频微调(Canary-1B-v2,18 分钟窗口) 步时 ms / 峰值 GiB / WER 1082 / 129 / 6.40 NeMo SDPA OOM 唯一能训练的配置;两边均可跑时提速 1.09–1.36×
长文档分类微调(DeBERTa-v3-base,BIGPATENT,4K token) 步时 ms / 峰值 GiB / 准确率 % 915 / 7.1 / 67.6 HF Transformers 2185 / 27 / 67.7 2.39× 提速、约 3.8× 省显存,精度差距 ≤0.3 点

局限与改进

作者承认的局限(第 6 节):identity 映射(Transformer-XL)给每个偏移独立的关系行,投影工作量与空间仍随 $N$ 二次增长;改为 tile 内现算可把空间降为线性,但前向慢 2.0–2.9×。若映射的关系行不覆盖连续偏移区间(例如让 $\delta$ 与 $-\delta$ 共用一行,或依赖偏移以外的信息),只能回退到 FP32 原子累加——更慢且不确定(所评四种机制都不触发)。方法为跨机制/映射/GPU 的通用性牺牲了硬件特化:没有用 warp specialization、异步 bulk transfer 等原语,留作未来工作。我自己的观察:(1) 短序列开销明显,T5 反向在 128/256 token 只有 0.75–0.82×,$G=128$ 的分组与编译特化在小 $N$ 下得不偿失;(2) 端到端收益受注意力占比上限约束——Canary 因自回归解码器在 token 生成阶段几乎无收益,微调时 transducer loss 主导步时,加速有限;(3) bucketed/非偏移映射的回退路径意味着更奇异的位置方案(旋转+偏置混合、非单调桶)不在覆盖范围;(4) 长窗口 WER 差异(9 分钟以上 4.34 vs 3.73)虽归因于一两条长录音的重复循环,但长上下文行为的统计功效不足;(5) 投影以 FP16 存储并 clamp 到 $\pm65504$,极端离群值场景的数值边界需要使用者自行留意。

独立分析的弱点

独立分析的弱点:(1) identity 映射的二次性没有算法级解——TXL 类模型在超长序列(基因组、全卷音频)下 $Z^Q\in\mathbb{R}^{N\times(2N-1)}$ 的 HBM 占用与带宽仍是瓶颈;改进方向是利用 identity 映射的 Toeplitz/带状结构做分块投影,或把 $Z^Q$ 换成按需计算 + L2 友好调度。(2) 短序列退化:可为小 $N$ 提供融合的单内核路径,或与 SDPA 做运行时自动选择,避免 128–256 token 时的负收益。(3) 硬件未压榨:没有 TMA/warp specialization,H200 上 Shaw 前向 279 TFLOP/s 距 FA4 在标准注意力上的峰值仍有差距,可像 FA4 那样做算法-流水线协同设计。(4) 覆盖面限于“加性偏移”机制:FiLM 式位置调制、学习式非单调分桶、旋转+偏置混合方案都需扩展规范方程与回退路径。(5) 数值评估以逐 tensor 校验为主:FP16 投影在超长训练或 BF16 大动态范围下的累计影响缺少端到端长训收敛性对比;论文只测了 3 epochs 的微调任务。

未来方向

作者提出的:用架构特定原语(warp specialization、异步 bulk transfers,如 FA3/FA4 的做法)进一步提速。基于本文成果可延伸的方向:(1) 把关系分解作为标准前处理回馈 FlexAttention/FlashInfer 等框架——论文已证明“引擎+分解”仍比完整方法慢 1.1–2.2×(反向最多 228×),说明深度融合空间很大;(2) 为 identity 映射设计近线性的投影算法(Toeplitz 矩阵乘/分块卷积视角);(3) 扩展到交叉注意力与自回归解码的 KV 缓存场景,当前收益集中在编码器/prefill;(4) 与长上下文语音、基因模型结合,探索更大 $\Delta$、可学习 bucket 边界与混合映射;(5) 把“按偏移分片的无原子确定性归约”推广为通用原语,用于任何多对一梯度结构(可学习 ALiBi、稀疏掩码偏置、低秩偏置 FlashBias);(6) 在 Flashzoi/FlashSwin 这类被迫换 RoPE 重训的模型上直接验证“不换位置编码也能高效训练”的质量收益。

复现评估

论文承诺开源(附录 H):方法代码、基准与端到端脚本、全部结果文件(记录软件版本、tile 大小、GPU 遥测),脚本可从结果文件复现论文每张图表;代码内置 FP32 参考测试,覆盖 padding/packing/causal/dropout/各输入精度。评测全部基于公开模型与数据:Parakeet-TDT-0.6B-v3、Canary-1B-v2(NeMo 3.0.0 + PyTorch 2.9.1 + CUDA 12.8)、DeBERTa-v3-base(HF Transformers)、TED-LIUM 3、BIGPATENT。硬件门槛友好:主要结果单卡 H200,并给出 RTX PRO 6000(Blackwell)与 RTX A6000(Ampere)的完整结果;内核侧软件栈为 CUDA 13.0 + PyTorch 2.14.1 + Triton 3.8.0 + FA4 4.0.0b33 + FlashInfer 0.7.2 + FlashDeBERTa 0.0.7。编译+自动调优每模型一次性开销小于 3 分钟并缓存。复现难度评估:注意力层微基准中等偏低(协议写得极细:do_bench、每次测量清 L2、50ms 预热、≥10 次取中位数);端到端训练需 100 小时 TED-LIUM 3 微调 Canary(3 epochs)与 BIGPATENT 25K 文档 3 epochs,单卡 H200 可行但需数天。注意论文为 preprint under review,代码仓库尚未在文中给出链接,需关注作者后续发布。

相似论文推荐