尊龙游戏人生就是博

jk裙子露白色内内 最近更新|更新列表|字母检索|下载排行|苹果专区|分类导航

目今位置:首页专题合集 → w3u7903ejky2ywls

尊龙凯时 - 人生就是搏!

无需CUDA代码给H100加速33%-50% ,Flash Attention作者新作火了

无需CUDA代码给H100加速33%-50% ,Flash Attention作者新作火了

西风 发自 凹非寺量子位 | 公众号 QbitAI

无需CUDA代码 ,给H100加速33%-50%

Flash Attention、Mamba作者之一Tri Dao的新作火了 。

他和两位普林斯顿CS博士生提出了一个名叫QuACK的新SOL内存绑定内核库 ,借助CuTe-DSL ,完全用Python写 ,一点CUDA C++代码都没用到 。

在带宽3TB/s的H100上 ,它的速率比像PyTorch的torch.compile、Liger这类已经由深度优化的库还要快33%-50% 。

Tri Dao体现 ,让内存麋集型的内核抵达“光速”并非什么神秘技巧 ,只需把几个细节处置惩罚到位就行 。

我很喜欢Phil Tillet对差别工具在生产力和性能方面各有取舍的看法 ,好比torch compile、triton、CUDA、PTX 。但CuTe-DSL以及类似的基于Python的DSL或许能改变这一时势 ,虽然现在还处于早期阶段 。并且 ,说未必很快我们就能让大语言模子来天生这些内核了!

新作一经发出 ,吸引不少大佬关注 。

英伟达CUTLASS团队资深架构师Vijay转发 ,自诩他们团队做的CuTe-DSL把种种细节都打磨得很好 ,由此像Tri Dao这样的专家能够让GPU飞速运行 。

同时他还预告今年会有更多相关内容推出 。

同样被吸引而来的尚有PyTorch团队成员Horace He ,上来就夸赞“太酷了 ,尤其关于长序列来说” 。

不过他还指出 ,在处置惩罚长度不凌驾约16384的序列时 ,PyTorch的torch.compile的性能数据能较轻松地获得优化 ,更靠近理想状态 。

接着给出了几点优化torch.compile性能的建议:

默认情形下 ,若用差别形状数据测试 ,torch.compile会天生动态形状内核 ,可通过设置dynamic=False关闭该行为 。举行更多自动调优操作能进一步提升性能 。torch.compile在天生无循环的长期化归约内核上较守旧 ,可通过启用多内核(设置(TORCHINDUCTOR_MULTI_KERNEL=1)来让其自动调优 。

最后他体现 ,照旧不可否定QuACK是一项很是精彩的事情 ,并且它也是CuTe-DSL一个很好的教学示例 。

Tri Dao也作出了回应 ,“太棒了 ,这正是我们想要的 ,我们会试试这些要领 ,然后更新图表” 。

食用指南

QuACK作者们写了一篇教程来先容详细做法 ,内里的代码可以直接使用 。

让内存麋集型内核抵达“光速”

想让GPU在模子训练和推理时都高速运转 ,就得同时优化两种内核:一种是盘算麋集型(好比矩阵乘法、注重力机制) ,另一种是内存麋集型(像逐元素运算、归一化、损失函数盘算)

其中 ,矩阵乘法和注重力机制已经是优化得相当到位了 。以是作者这次把重点放在内存麋集型内核上——这类内核大部分时间都耗在内存会见(输入输出)上 ,真正用来盘算的时间反而未几 。

只要搞懂并使用好现代加速器的线程和内存层级结构 ,就能让这些内核的速率迫近“理论极限” 。并且多亏了最新的CuTe-DSL ,不必写CUDA C或C++代码 ,在随手的Python情形里就能做到这一点 。

内存麋集型的内核有个特点:它的算术强度(也就是浮点运算量FLOPs和传输字节数的比值)很小 。一旦内核的算术强度落到内存麋集型的领域 ,它的吞吐量就不再由每秒能完成几多浮点运算决议 ,而是看每秒能传输几多字节了 。

在这类内存麋集型的内核里 ,逐元素的激活操作处置惩罚起来相对简朴 。由于每个元素的盘算互不滋扰 ,天生就适合完全并行处置惩罚 。

不过 ,像softmax、RMSNorm这些深度学习算子中 ,还经常用到“归约”操作 ,需要对所有值举行聚合 。

并行的连系性归约算法会执行O(log (归约维度数))轮的部分归约 ,这些归约在差别空间的线程间举行 ,而作者对 GPU内存层级的相识将在此历程中施展作用 。

并行最大归约:

接下来 ,作者将先容怎样使用GPU的内存层级结构来实现高效的归约内核 。

作为示例 ,使用CuTe DSL实现了大语言模子里常用的三个内核:RMSNorm、softmax和交织熵损失

目的是抵达硬件的最大吞吐量 ,即 “GPU光速吞吐量” ,而这需要两个要害要素:1)全局内存的合并加载/存储 ;2)硬件感知的归约战略 。

别的 ,作者还将诠释集群归约 ,以及它怎样助力超大规模归约使命 ,这是英伟达GPU从Hopper架构(H100)最先引入的一个较新特征 。

然后 ,详细解说这些要害要素的细节 ,并叙述它们怎样资助编写“光速”内核 。

GPU内存层级结构

在写内核代码前 ,得先搞明确现代GPU的内存层级是怎么回事 。这里以Hopper架构的GPU(好比 H100)为例举行说明 。

Hopper架构的GPU里 ,CUDA的执行分为四个层级:线程(threads)、线程块(thread blocks)、新引入的线程块集群(thread block cluster)以及完整网格(the full grid) 。

单个线程是在流式多处置惩罚器(SM)里 ,以32个线程一组的“warp”形式运行的 ;每个线程块拥有一块192-256 KB的统一共享内存(SMEM) ,统一线程块内的所有warp都可会见该内存 。

H100的线程集群允许最多16个运行在相邻SM上的线程块 ,通过漫衍式共享内存(DSMEM)结构读取、写入相互的共享内存并执行原子操作 。这一历程通过低延迟的集群屏障举行协调 ,从而阻止了价钱高昂的全局内存往返传输 。

内存的每个层级都有用于外地归约的读写原语 。因此 ,作者将在CuTe DSL中开发一个通用的归约模板 ,使H100在256-262k的归约维度规模内始终抵达“光速”吞吐量 。

H100中的内存层级结构:

Hopper GPU的执行粒度与内存层级之间的对应关系:

每个内存层级的会见延迟和带宽都纷歧样 。

好比 ,会见线程自己的寄存器也就几纳秒 ,会见共享内存大提要 10-20纳秒 。再往上 ,会见L2缓存的延迟就会飙升到150-200纳秒 ,最后会见DRAM(主存)得花约400纳秒 。

带宽方面 ,会见寄存器能抵达100 TB/s ,会见共享内存(SMEM)约为20-30 TB/s ,会见L2缓存是5-10 TB/s 。关于受内存限制的内核来说 ,H100的HBM3显存带宽(3.35TB/s)往往是性能瓶颈 。

以是 ,为了把硬件性能榨干 ,设计内存麋集型的内核时 ,得顺着内存层级来

最好将大部分外地归约操作分派在较高的内存层级上 ,只将少量经由外地归约后的值转达到下一个内存层级 。Chris Fleetwood在博客里对A100(不含线程块集群)的内存会见延迟举行了类似的说明 ,而H100则在共享内存(SMEM)和全局内存(GMEM)之间增添了一个特另外内存层级笼统 。

H100中内存会见的延迟:

硬件感知的加载与存储战略

写内核代码时 ,第一个要解决的问题就是“怎么加载输入数据、存储效果” 。关于受内存限制的内核来说 ,HBM的3.35 TB/s通常是瓶颈 ,这意味着需要在加载和存储战略上做到极致优化 。

在启动内核之前 ,首先会通过特定的线程-值结构(TV-layout)对输入数据举行分区 。这决议了每个线程怎么加载和处置惩罚归约维度上的值 。

由于每个线程都要从全局内存(GMEM)加载数据 ,以是得想步伐确保每次加载操作在硬件上一连地传输最大数目的bits 。这种手艺通常被称为内存合并(memory coalescing)或全局内存的合并会见(coalesced access to global memory) ,CUDA最佳实践指南对这一看法举行了更详细的诠释 。

合并内存会见:

在H100中 ,这意味着每个线程处置惩罚的数据量得是128bits的倍数 , 即4xFP32或者8xBF16 。因此 ,关于FP32来说 ,这会将4次加载和存储操作组合(或“向量化”)为一次内存事务 ,从而最大化吞吐量 。

详细操作上 ,作者会异步地将数据从全局内存(GMEM)加载到共享内存(SMEM) ,然后将加载操作向量化到寄存器中 。等归约出最终效果后 ,就直接存回全局内存 。

有时间 ,还可以把输入数据从全局内存或共享内存重新读到寄存器 ,这样能镌汰寄存器的占用 ,阻止数据“溢出” 。

下面是用Python CuTe DSL写的加载操作代码片断 ,为了看着简朴 ,这里省略了数据类型转换和掩码谓词的相关代码 。

硬件感知的归约战略

当每个线程持有一个小的输入向量后 ,就可以最先对它们举行归约了 。每次归约都需要举行一次或多次完整的行扫描 。

追念一下 ,从内存层级的顶层到低层 ,会见延迟逐渐增添 ,而带宽逐渐镌汰 。

因此 ,归约战略应遵照这种硬件内存层级

一旦部分效果存留在内存金字塔的较高层级中 ,就连忙对其举行聚合 ,只将经由外地归约后的值转达到下一个内存层级 。

作者会凭证下表从顶层到低层对值举行归约 ,并且每一步都只在对应的内存层级中举行加载和存储操作 。

差别内存层级中的归约战略:

1、线程级归约(读写寄存器)

每个线程会在外地对多个向量化加载的值举行归约 。作者使用TensorSSA.reduce函数 ,其中需要传入一个可连系的归约算子op、归约前的初始值init_val ,以及归约维度reduction_profile 。

2、Warp级归约(读写寄存器)

warp是由32个一连线程组成的牢靠组 ,每周期会执行相同的指令 。(同步的)warp归约允许统一Warp内的每个线程通过专用的洗牌(shuffle)网络 ,在一个周期内读取另一个线程的寄存器 。经由蝶式warp归约后 ,统一warp中的每个线程都会获得归约后的值 。

作者界说了一个辅助函数warp_reduce ,用于以“蝶式”归约顺序执行Warp归约 。关于warp级原语的详细诠释 ,读者可参考Yuan和Vinod撰写的CUDA博客“Using CUDA Warp-Level Primitives” 。

蝶式warp归约(Butterfly warp reduction) ,也称为 “xor warp shuffle”:

3、线程块级归约(读写共享内存)

一个线程块通常包括多个(在H100中最多32个)warp 。在线程块归约中 ,每个加入归约的warp中的第一个线程会将该warp的归约效果写入共享内存中预先分派的归约缓冲区 。

在经由线程块级同步(屏障)确保所有加入的warp都完成写入后 ,每个warp的首线程会从归约缓冲区中读取数据 ,并在外地盘算出线程块的归约效果 。

4、集群归约(读写漫衍式共享内存)

线程块集群是Hopper架构中新增的执行层级 ,由一组相邻的线程块(最多16个)组成 。统一集群内的线程块通过漫衍式共享内存(DSMEM)举行通讯 ,这种内存有专门的高速SM间网络支持 。

在统一集群中 ,所有线程都可通过DSMEM会见其他SM的共享内存 ,其中共享内存的虚拟地点空间在逻辑上漫衍于集群内的所有线程块 。DSMEM可通过简朴的指针直接会见 。

漫衍式共享内存:

在集群归约中 ,作者首先把目今warp的归约效果通过专用的SM间网络(也就是DSMEM) ,发送到其他对等线程块的共享内存缓冲区里 。

随后 ,每个warp从其外地归约缓冲区中获取所有warp的值 ,并对这些值举行归约 。

这里还得用到一个内存屏障用来统计数据抵达的数目 ,以阻止过早会见外地共享内存(不然会导致不法内存会见的过失) 。

把整个归约流程串起来看:首先做线程级归约 ,然后在统一个warp内聚合线程级归约的效果(即warp级归约) ,接着凭证归约维度的数目 ,在每个线程块或线程块集群上进一步转达归约后的值 。

NCU 性能剖析(Softmax 内核)

作者在配备HBM3显存(DRAM峰值吞吐量=3.35 TB/s)的NVIDIA H100 上 ,对批量维度为16K、归约维度为 131K的softmax内核做了性能测试 。内存事情负载图由Nsight Compute天生 。

设置是:线程块集群巨细为4 ,每个线程块有256个线程 ,输入数据类型为FP32 。加载和存储操作都做了向量化处置惩罚 ,每条指令一次搬运128 bits数据(也就是4 FP32值)

最终测出来的DRAM吞吐量也就是显存带宽使用率抵达了3.01TB/s ,相当于DRAM峰值吞吐量的89.7% 。除了共享内存(SMEM)外 ,还高效使用了漫衍式共享内存(DSMEM) 。

该计划的内存事情负载图:

作者还拿自己的实现与torch.compile(PyTorch 2.7.1 版本)举行了比照 。

首先 ,获取了torch.compile天生的Triton内核代码 。

该内核实现softmax时包括2次全局内存加载(盘算行最大值和部分指数和时各加载1次 ,以及最终的softmax 值)和1次存储 。

在这种情形下 ,只管该Triton内核仍能使硬件的DRAM吞吐量跑满 ,但特另外1次不须要加载会导致Triton 内核的有用模子内存吞吐量(约2.0 TB/s)仅为本文作者实现计划的三分之二(约3.0 TB/s)

torch.compile天生的Triton内核(调优设置部分省略)

内存吞吐量

作者对RMSNorm、softmax和交织熵损失这几个内核做了基准测试 。测试仍在配备HBM3显存的1块NVIDIA H100 80GB GPU和Intel Xeon Platinum 8468 CPU上举行 。

测试中使用的批量巨细规模为8k-32k ,归约维度规模为256-262k(256×1024) ,输入数据类型为FP32和 BF16 。

基准对例如案如下:

Torch.compile(PyTorch 2.7.1版本):使用默认编译模式 。Liger 内核 v0.5.10版本 :只测了RMSNorm 和 softmax ,且归约维度最多到65k(由于它现在不支持更大的维度) 。cuDNN v9.10.1版本:只测了RMSNorm内核 。

作者基于CuTe DSL的实现计划 ,在归约维度大于4k时 ,内存吞吐量一样平常能稳固在3TB/s左右(差未几是峰值的90%)

归约维度262k时 ,FP32的softmax吞吐量能到3.01TB/s ,而torch.compile只有1.89TB/s ,快了近50% 。关于这3个内核 ,当归约维度≥65k 时 ,该实现计划显著优于所有基准对例如案 。

多个内核的模子内存吞吐量:

作者以为 ,在输入规模≥65k时的优异性能得益于乐成使用了H100中的集群归约

当输入数据量大到把SM的寄存器和共享内存都占满时 ,若是不必集群归约 ,就只能换成在线算法(好比在线softmax) ;不然的话 ,寄存器里的数据会大宗“溢出” ,导致吞吐量显著下降 。

举个例子 ,作者视察到 ,当使用Liger softmax内核时 ,输入规模从32k涨到65k ,吞吐量就从约3.0 TB/s掉到了2.0 TB/s左右 。

作者用NCU(Nsight Compute)工具剖析了它的内存负载图和SASS代码 ,发明当每个SM要加载65k数据时 ,SM的资源被耗尽 ,效果就是大宗寄存器溢出 ,还会频仍往HBM里回写数据 ,这才拖慢了速率 。

Liger softmax内核在批量维度为16k、归约维度为65k且数据类型为FP32时的内存事情负载:

Liger softmax内核汇编代码中的寄存器溢出(LDL指令):

但集群归约能让多个SM协同事情 ,共享各自的资源 ,相当于组成一个“超等”SM(靠DSMEM实现) 。

假设单个SM仅能处置惩罚32k输入 ,那么一个巨细为16的集群将允许处置惩罚50万(0.5M)输入 ,而无需从全局内存(GMEM)重新加载数据 。

由于作者对硬件知识有清晰的明确 ,纵然使用通例的3遍扫描softmax算法 ,也能轻松充分使用所有内存层级的每一个字节 ,实现“光速”级别的吞吐量 。

总结

作者通过实践证实 ,只要全心手工编写CuTe内核 ,就能把硬件里所有内存层级的潜力都榨干 ,实现“光速”级别的内存吞吐量 。

但这种效率是以针对每个算子甚至每个输入形状举行调优为价钱的 ,这自然在效率与开发本钱之间形成了一种权衡 。

Phil Tillet(Triton的作者)在他的演讲中用这张图很好地叙述了这一点 。

凭证作者使用CuTe-DSL的履历 ,它既具备Python的开发效率 ,又拥有CUDA C++的控制能力和性能 。

作者以为 ,高效的GPU内核开发流程是可以自动化的 。

例如 ,RMSNorm中的输入张量TV结构、加载/存储战略以及归约辅助函数 ,可直接应用于softmax内核并仍能抵达相近的吞吐量 。

别的 ,CuTe DSL将为开发者或基于CuTe DSL运行的其他代码天生应用提供无邪的GPU内核开发能力 。

现在 ,将大语言模子应用于自动天生GPU内核是一个活跃的研究偏向 ,未来 ,或许只需挪用“LLM.compile” 就能天生高度优化的GPU内核 。

作者简介

这项事情作者有三位 。

Wentao Guo

Wentao Guo现在是普林斯顿大学盘算机科学专业的博士生 ,师从Tri Dao 。

在这之前 ,他在康奈尔大学获得了盘算机科学的本科和硕士学位 。

Ted Zadouri

Ted Zadouri同样是普林斯顿大学盘算机科学专业的博士生 ,本硕划分读自加州大学欧文分校、加州大学洛杉矶分校

此前Ted Zadouri曾在英特尔实习 ,也曾在Cohere研究大语言模子的参数高效微调 。

Tri Dao

Tri Dao现在是普林斯顿大学盘算机科学助理教授 ,照旧天生式AI首创公司Together AI的首席科学家 。

他因提出一系列优化Transformer模子注重力机制的事情而著名学界 。

其中最有影响力的 ,是其作为作者之一提出了Mamba架构 ,这一架构在语言、音频和基因组学等多种模态中都抵达了SOTA性能 。

尤其在语言建模方面 ,无论是预训练照旧下游评估 ,Mamba-3B模子都优于一律规模的Transformer模子 ,并能与两倍于其规模的Transformer模子相媲美 。

另外他还加入揭晓了FlashAttention1-3版本 ,FlashAttention被普遍用于加速Transformers ,已经使注重力速率提高了4-8倍 。

GitHub链接:https://github.com/Dao-AILab/quack/blob/main/media/2025-07-10-membound-sol.md[1]https://x.com/__tensorcore__/status/1943374119208169858[2]https://x.com/tri_dao/status/1943372100774900056

相关推荐:公与丰满媳1一15黄蓉欧阳锋 异类老妇WddWdd 裸体爆乳羞羞❌网站视频XXX

分享: 2025-07-15 18:10:39 共81款

电脑

安卓

苹果

相关合集

网友谈论 审查所有谈论>>

揭晓谈论

(您的谈论需要经由审核才华显示) 网友粉丝QQ群号:766969941

审查所有0条谈论>>

【网站地图】【sitemap】