如何实现一个高效的Softmax CUDA kernel?——OneFlow 性能优化分享

本文探讨了如何优化OneFlow中的Softmax CUDA Kernel,以提高其性能,尤其是在显存带宽利用方面。通过与cuDNN的对比,OneFlow的优化实现展示了更高的显存带宽利用率,接近理论上限。文章详细介绍了三个优化技巧,包括Warp处理、Block处理和不使用Shared Memory的实现,并讨论了CUDA的公共优化策略,如Half类型的pack和Shared Memory的Bank Conflicts避免。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Softmax操作是深度学习模型中最常用的操作之一。在深度学习的分类任务中,网络最后的分类器往往是Softmax + CrossEntropy的组合:

softmax in cnn

尽管当Softmax和CrossEntropy联合使用时,其数学推导可以约简,但还是有很多场景会单独使用Softmax Op。如BERT的Encoder每一层的attention layer中就单独使用了Softmax求解attention的概率分布;GPT-2的attention的multi-head部分也单独使用了Softmax 等等。

softmax in bert

深度学习框架中的所有计算的算子都会转化为GPU上的CUDA kernel function,Softmax操作也不例外。Softmax作为一个被大多数网络广泛使用的算子,其CUDA Kernel实现高效性会影响很多网络最终的训练速度。那么如何实现一个高效的Softmax CUDA Kernel?本文将会介绍OneFlow中优化的Softmax CUDA Kernel的技巧,并跟cuDNN中的Softmax操作进行实验对比,结果表明,OneFlow深度优化后的Softmax对显存带宽的利用率可以接近理论上限,远高于cuDNN的实现。

GPU基础知识与CUDA性能优化原则:

对GPU基础知识的介绍以及CUDA性能优化的原则与目标可以参考之前的文章:

https://zhuanlan.zhihu.com/p/271740706

其中简单介绍了GPU的硬件结构与执行原理:

  • Kernel:即CUDA Kernel function,是GPU的基本计算任务描述单元。每个Kernel都会根据配置参数在GPU上由非常多个线程并行执行,GPU计算高效就是因为同时可以由数千个core(thread)同时执行,计算效率远超CPU。

  • GPU的线程在逻辑上分为Thread、Block、Grid三级,硬件上分为core、warp两级;

  • GPU内存分为Global memory、Shared memory、Local memory三级。

  • GPU最主要提供的是两种资源:计算资源显存带宽资源。如果我们能将这两种资源充分利用,且对资源的需求无法再降低,那么性能就优化到了极限,执行时间就会最短。在大多数情况下,深度学习训练中的GPU计算资源是被充分利用的,而一个GPU CUDA Kernel的优化目标就是尽可能充分利用显存带宽资源。

如何评估一个CUDA Kernel是否充分利用了显存带宽资源?

对于显存带宽资源来说,“充分利用“指的是Kernel的有效显存读写带宽达到了设备显存带宽的上限,其中设备显存带宽可以通过执行 cuda中的的bandwidthTest得到。 Kernel的有效显存带宽通过Kernel读写数据量和Kernel执行时间进行评估:
当 前 K e r n e l 的 有 效 显 存 带 宽 = 读 写 数 据 量 / 执 行 时 间 当前Kernel的有效显存带宽 = 读写数据量 / 执行时间 Kernel=/

Naive的Softmax实现:

在介绍优化技巧之前,我们先看看一个未经优化的Softmax Kernel的最高理论带宽是多少。如下图所示,一个最简单的Softmax计算实现中,分别调用几个基础的CUDA Kernel function来完成整体的计算:

softmax

假设输入的数据大小为Dshape = (num_rows, num_cols), 即 D = num_rows * num_cols ,最Navie的操作会多次访问Global memory,其中:

  • ReduceMax = D + num_rows (read 为 D, write 为 num_rows)
  • BroadcaseSub = 2 * D + num_rows (read 为 D + num_rows,write 为 D)
  • Exp = 2 * D (read 、write 均为D)
  • Redu
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值