xattention稀疏注意力的计算方法
本文讨论了稀疏注意力的计算方法,其核心思想是通过选择矩阵的分块,将重要的矩阵挑选出来参与计算。这是因为注意力矩阵具有稀疏性,而如何选择这些重点矩阵是各类算法需要解决的主要问题。
本文讨论了稀疏注意力的计算方法,其核心思想是通过选择矩阵的分块,将重要的矩阵挑选出来参与计算。这是因为注意力矩阵具有稀疏性,而如何选择这些重点矩阵是各类算法需要解决的主要问题。
Dynamo 发布以后,我大概速览了一些设计文档,并且提取了一些关键点,并对比一些其他方案的异同点。
参考 Triton论文
参考 GPU MODE Lecture 14: Practitioners Guide to Triton
从Trinton主页引用的话
现代 GPU 的架构大致可以分为三个主要组件 ——DRAM、SRAM 和 ALU—— 在优化 CUDA 代码时必须考虑每个组件:
这几句话可能比较抽象,下面给一下这几个组件的指标可能感受更直观,参考Which GPU(s) to Get for Deep Learning: My Experience and Advice for Using GPUs in Deep Learning。
其中指出:
~380 个周期~200 个周期~34 个周期每个操作总是由 32 个线程组成的Warp执行,Warp中的线程必须相互等待。GPU 上的所有内存操作都针对warp进行了优化。
根据Simplifying CUDA kernels with Triton: A Pythonic Approach to GPU Programming的说法,GPU中的HBM(High Bandwidth Memory)等价于我们讲的Global Memory,SRAM对应的是L1和L2 Cache对应的是Shared Memory,这几个词在一些文档中可能会有不同的叫法,但是意思是一样的。
A100中的内存带宽约为 2TB/s,L1 缓存带宽:~100-200 TB/s 理论带宽,L2 缓存带宽:~4-7 TB/s 理论带宽。
再看OpenAI的三条说明的意思就是:
这个是OpenAI给出的GPU架构的简图,我们需要明确不同内存,缓存,和执行单元的周期之间的关系就比较好理解GPU计算当中的性能瓶颈。
Triton的目标其实就是优化 HBM -> SRAM -> 寄存器 的带宽,这在Torch里面直接实现不了,通过一些融合算子是可以减少写回到HBM的。
Triton的文档给出的很多实现的代码,可能都不太奏效了,笔者自己测试下来并没有超过torch本身的实现,
可能torch本身也再不断改进吧,这些差别很快就超越了,但是在一些写自定义融合算子方面应该还是比较有优势的。