新文论地址:

https://arxiv.org/pdf/2502.11089v1

Image

梁文峰把自己也写上去了,他不是在北京开会吗

Image

不整虚的我们快速过一下

先说它干啥了,V3的MOE,R1也能用,这是对MLP层做了稀疏化,省内存,省资源

但是attention它没动,现在对attention层下手了

不理解transformer架构的兄弟可以参考我以前的博文,草履虫也能学懂得Transformer系列

https://mp.weixin.qq.com/s/Qi9-SqTGk5yHkF0WQ1CdYQ?token=1866303267&lang=en_US

这篇论文提出了一种名为 NSA(Native Sparse Attention)的新型稀疏注意力机制。主要讨论了如何设计一个既能在训练时端到端优化、又能在推理阶段显著提高效率的注意力机制,以应对长文本的处理挑战。ds他们设计了一种分层的稀疏策略,将注意力分为三个分支:压缩(compression)、选择(selection)和滑动窗口(sliding window),以便同时捕捉全局上下文和局部精细信息。(这些人得工程优化思路真得很对,不过也不禁让人琢磨以前那帮训练得人咋不想呢?)另外,论文还详细说了在硬件(例如GPU)的实际加速实现上所做的优化,并通过大量实验验证了 NSA 在一般基准测试、长文本任务以及复杂推理任务上的performence

我们先看它干了啥

Attention就是qkv+softmax呗

传统说模型context长度长度上不去主要是o和o^2得计算操作,包括内存操作之争么,后来诞生了各种滑动窗口,压缩窗口,乃至FA 1,2,3其实根源都是解决这些东西得,有得从解决计算复杂度入手,有的从内存操作频度入手,但是这个文章是干啥得呢?它整合到一起了,做成了一个方法论。

它将原始的键和值表示通过三条并行的注意力路径进行处理,每条路径侧重不同的上下文信息,从而兼顾全局与局部信息,同时降低计算负担。具体来说,这三条路径的详细机制如下:

压缩(Compression):

这一分支将连续的一段 token 序列按照固定块大小进行划分,并对每个块内的所有 token 进行聚合。通过一个带有位置编码的可学习 MLP,将一个块内的信息融合成一个单一的“压缩”表示。(这个MLP可以降低语义损失,尽量保留表征)这种方式捕捉了块级的全局语义信息,并大幅减少了后续注意力计算所需处理的 token 数量。

选择(Selection):

为了防止压缩过程中丢失重要的细粒度信息,选择分支在较粗略的压缩之外,专门挑选出最具信息量的 token 块。具体方法是:先将序列按连续块划分,然后为每个块计算一个重要性得分(通常基于与查询的注意力得分),接着选取得分最高的几个块,这些块内的 token 将被保留下来用于精细化的注意力计算。这种策略保证了模型在保留全局结构信息的同时,也能捕捉到局部的关键信息。这个像啥,特别像他们玩得token wised quantized

滑动窗口(Sliding Window):

除了压缩和选择外,滑动窗口分支专注于捕捉查询 token 与其相邻 token 之间的局部关系。该分支在输入序列中维护一个固定大小的窗口,对窗口内的 token 进行常规的注意力计算,确保模型能敏感地捕捉到近邻之间的细节和依赖关系,从而防止在全局稀疏化处理时局部信息被遗漏,这个就没什么特别可讲得了

所以你会发现,工程做到极致,就会做成解决方案了

来看个图把

Image

这图展示了 NSA在整体架构层面是如何将输入序列通过三个并行的注意力分支(压缩、选择和滑动窗口)来处理,并最终将它们的输出进行融合的流程。可以把它分成“左图”和“右图”两部分来理解:

左图:总体流程

输入序列的分块(Split to Continuous Blocks)

最上方用蓝色方块表示的是输入序列的所有 token(键和值)。论文里为了后续硬件加速和稀疏化处理,会先把它们按照一定的大小进行连续分块。

压缩(Compression)分支

左下角标记为“Compression”的绿色模块表示对分块之后的 token 进行“压缩”操作:将一个块内部的 token 通过某种可学习的方式(MLP + 位置信息等)聚合成一个“压缩 token”。

这种聚合后的“压缩 token”能大幅减少需要进行注意力计算的条目数量,同时捕捉到块级的全局或高阶语义信息。

选择(Selection)分支

图中间的“Selection”绿色部分表示如何根据查询(Query)来对分块进行选择:

首先对每个分块计算一个“重要性得分”(图中黄色的“Top-n Selection”)。

然后只保留最重要的几个块(如图中绿色块),并对这些块内的 token 进行注意力计算。

这样可以在“压缩”获取全局信息的同时,保留对局部细粒度重要 token 的注意力。

滑动窗口(Sliding)分支

右侧“Sliding”绿色模块表示会在输入序列中保留一个固定大小的滑动窗口(如最近 512 个 token),专门做局部注意力。

这样可以保证模型对邻近 token 之间的依赖关系有足够的分辨率,不会因为全局稀疏化而丢失短距离信息。

门控融合(Gated Output)

最底部的“Gated Output”表明,这三个分支(压缩、选择、滑动窗口)各自产生的注意力输出,会被一个可学习的门控机制(MLP + Sigmoid 等)进行加权融合,形成最终的注意力输出。

右图:七十就是注意力模式可视化

右图用“Attention Score Activated Token”与“Ignored Token”等标注,展示了这三个分支在二维“Query–Key”坐标上的稀疏分布:

Compressed Attention Mask:代表压缩分支只需要计算的块级注意力,因聚合操作而只需在较少的 token/块上计算。

Selected Attention Mask:代表选择分支只在选中的“Top-n”重要块上进行注意力计算,其他位置被忽略(白色区域)。

Sliding Attention Mask:代表滑动窗口分支只在某个局部窗口(通常是 query 紧邻的一段 token)里计算注意力,远处的 token 被忽略。

图中的绿色区域表示“真正进行注意力计算的部分”,白色区域表示被跳过的部分。这样就能直观地看到,传统的全注意力(Full Attention)是所有位置都计算,而在 NSA 中,不同分支“各司其职”,以达到稀疏化、高效化的效果。

这样就能在预训练里面又能做到压缩显存,节省算力,又能做到长context得信息attention关联性尽量得保留

那和硬件有什么关系呢?

那关系太大了

我给你来副图

Image

正常你看H100都是989,约等于1P吗,对吧

但是有时候你看到官方宣传那就是2P,后面有一排小字,tensorcore support,比如下面

Image

为啥呢?

就是因为tensor core处理稀疏矩阵,比如搜广推和LLM得算力,理论上压缩就给你能抬升1倍

它这就给你干得就这事

NSA 的设计能发挥硬件(如 GPU)的特性,从而在算法设计和实现上都做了硬件对齐优化。具体来说:

硬件高效内存访问:

NSA 采用了块状压缩和选择策略,这种方法能将连续的 token 组织成固定大小的块,从而使内存访问更为连续和高效。现代 GPU 对连续内存访问(即共线性访问)的性能优化非常明显,这可以大幅减少内存访问瓶颈,提高整体计算效率。

高效利用硬件加速器:

文中给你讲了如何针对 Tensor Cores 进行优化,通过设计适合块状数据处理的核函数(kernel),确保每个内核调用中计算密集度与内存带宽之间达到了更好的平衡。这样的设计能充分利用 GPU 的并行计算能力,在训练和推理过程中都能获得显著的加速效果。

降低随机内存访问:

在传统的注意力机制中,随机的内存访问会造成较大的延迟,而 NSA 的选择分支通过对连续块的选择,有效避免了这种问题,确保了硬件的高速缓存(cache)和带宽能得到最优利用,从而进一步提高计算速度(这部用细讲了,windows app都知道要降低random 读写,能提升速度)

好,我们来个总结,NSA 不仅在算法上实现了稀疏注意力的高效建模,还通过硬件对齐的设计,优化了内存访问和计算调度,使得模型在处理长文本时能够大幅减少计算延迟和资源消耗。

不过。。

最近GenAI太卷了,最近,业界能不能歇两天,再好再新得技术也架不住天天都折腾。。。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐