资讯动态

FlashDecoding面经-vivj啥关系 vi就是原来的O呗 用LSE是为了防止溢出吗

发布时间:2026/8/13 0:03:04 来源:尧图企业网站定制
你的这两个直觉全部通透了完全点到了核心一、ViV_iVi​和VjV_jVj​啥关系这里的iii和jjj代表了完全不同的两个层级jjj代表 Token 层级VjV_jVj​或vjv_jvj​是当前分块内部第jjj个 Token 的原始 Value 向量例如一个 128 维的词向量。iii代表 GPU 核心 / KV 分块层级ViV_iVi​是第iii个 GPU 核心负责的整个分块的分子加权总和向量。关系ViV_iVi​是由这个分块内所有 Token 的VjV_jVj​累加出来的Vi∑j∈分块 iesj⋅VjV_i \sum_{j \in \text{分块 } i} e^{s_j} \cdot V_jVi​j∈分块i∑​esj​⋅Vj​二、ViV_iVi​就是原来的OOO呗是的完全正确ViV_iVi​就是之前 FlashAttention 伪代码里的未归一化分子累加器acc或者公式里的OOO。它就是“未除以分母的加权半成品”。当它在核心内部除以局部分母lil_ili​后就变成了写回 HBM 显存的局部归一化成品O~iViDiaccili\tilde{O}_i \frac{V_i}{D_i} \frac{\text{acc}_i}{l_i}O~i​Di​Vi​​li​acci​​。三、 用 LSE 是为了防止溢出吗是的防溢出Overflow是它最关键的数学动机同时也顺便解决了显存传输开销。如果你不使用 LSE而是直接让各个 GPU 核心把真实的局部总分母Di∑esjD_i \sum e^{s_j}Di​∑esj​传出来做归并会有两个致命问题1. 数值溢出Overflow在计算 Attention 时得分sjs_jsj​可能很大比如sj120s_j 120sj​120。e120e^{120}e120的数值巨大约为1.3×10521.3 \times 10^{52}1.3×1052远超 FP16/BF16 能表示的最大数值范围FP16 最大只能存到 65504会直接变成Inf溢出导致模型崩溃。LSE 的巧妙之处通过LSEimilog⁡(li)\text{LSE}_i m_i \log(l_i)LSEi​mi​log(li​)把这个天文数字压缩回到了对数域Log Domain。比如e120e^{120}e120取完对数后只是120120120用一个平平无奇的浮点数就能安全存下。2. 归并时的绝对数值安全在最后的归并计算中计算权重用的是wiexp⁡(LSEi−LSEglobal)w_i \exp(\text{LSE}_i - \text{LSE}_{\text{global}})wi​exp(LSEi​−LSEglobal​)因为LSEglobalmax⁡i(LSEi)\text{LSE}_{\text{global}} \max_i(\text{LSE}_i)LSEglobal​maxi​(LSEi​)所以指数项LSEi−LSEglobal≤0\text{LSE}_i - \text{LSE}_{\text{global}} \le 0LSEi​−LSEglobal​≤0永远是小于等于 0 的负数。exp⁡(负数)\exp(\text{负数})exp(负数)的结果在(0,1](0, 1](0,1]之间彻底从数学原理上杜绝了数值向上溢出的任何可能。3. 显存通信开销减半除了数值稳定性显存带宽也是核心优化点如果传(mi,li)(m_i, l_i)(mi​,li​)两个变量归并核心需要从显存里读写 2 个标量。打包成LSEi\text{LSE}_iLSEi​后只需向显存写回 1 个标量直接把跨核通信的带宽开销砍掉了一半。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价