Page 341 - 《软件学报》2020年第9期
P. 341
2962 Journal of Software 软件学报 Vol.31, No.9, September 2020
SDC [32] 在执行神经网络前为稀疏参数引入了一个额外的预处理步骤,计算每个有效参数在输入张量上对应的
偏移量.在后续进行计算时,基于这个偏移量访问输入数据.SDC 降低了运行时计算每个有效参数对应的输入数
据位置的计算量,但对每个有效参数,仍然需要一个额外的偏移量记录位置信息.本文的方法避免了位置信息的
记录,进一步降低了计算过程中与位置信息相关的计算和访存需求.另外,以上工作均面向 CPU,本文的方法针
对 GPU 平台.上述工作的优化技术并不能直接应用到 GPU 平台上.本文基于 GPU 的特点设计了算子模板,并结
合 PTX 指令的特点设计了冗余指令删除的稀疏代码生成方法.同时利用了 GPU 存储层次和访存路径的特点,
优化了稀疏卷积运行时的访存性能.
Escoin [24] 也针对稀疏卷积在 GPU 平台上性能差的问题,它使用 GS 中的卷积算法,并对其在 GPU 上的实现
进行了优化.作者利用了共享内存和高速缓存实现数据重用,改善访存吞吐量.本文的方法采用了从稠密代码中
删除冗余指令的方法,为具体的稀疏参数定制对应的算子代码.另外,由于采用 GS 提出的稀疏卷积计算方法,
Escoin 也继承了 CSR 稀疏格式占用额外位置信息的缺点.也有一些工作从稀疏性的分布规律入手,进行稀疏卷
积在 GPU 上的优化.这些工作对稀疏数据中非零元素的分布进行了约束和假设,降低优化稀疏计算的难度.
Scott 等人在文献[33]中为参数具有分块稀疏特点的全连接算子和卷积算子设计了高效的 GPU 实现,并展示了
基于分块稀疏参数构建小世界 LSTM 等算法的有效性.在文献[34]中,作者提出了均衡剪枝方法,将矩阵每一行
分为等宽的多个块,在剪枝时,要求所有块内保留相同数目的非 0 元素.作者利用这一性质实现了不同 GPU 线程
间的负载均衡,并使用共享内存解决在输入数据上的不连续访存问题.与以上工作相比,我们的方法不对剪枝后
稀疏模型参数的分布做任何约束,因此可以在通过任意剪枝方法获得的模型上工作,同时也给模型剪枝算法留
下了更大的空间,有助于剪枝算法删除更多的参数.
4.2 稀疏神经网络加速器
面对稀疏神经网络计算难以在现有处理器上获得有效加速的问题,也有一些工作尝试通过设计新的加速
器进行解决.由于稀疏模型参数数目显著降低,且数据搬运的能耗往往高于代数计算 [11] ,EIE [35] 将稀疏模型的参
[1]
数放入片上缓存中,节约了大量的能耗.SCNN [36] 同时利用参数中的稀疏性和 ReLU 激活函数 在输入数据中引
入的稀疏性,利用笛卡尔积计算卷积.在文献[37]中,作者在 GPU 上增加了额外的部件,用于在运行时跳过取值为
0 的参数对应的冗余指令.与以上工作相比,本文使用了纯软件的方法在现有的 GPU 平台上实现了稀疏卷积的
加速,不需要对现有硬件平台进行修改.
5 总结与未来工作
在本文中,我们提出了一种加速剪枝后稀疏卷积神经网络在 GPU 上执行的优化方法.我们基于从稠密代码
中删除冗余指令的思想,设计实现了一个稀疏优化框架.在算子模板中,我们将模板参数与计算指令绑定,并建
立基于 PTX 的算子中间表示模板.基于中间表示模板和具体的稀疏参数取值,通过分析识别冗余的指令,生成对
应的 GPU 程序.为了改善稀疏计算的访存瓶颈,我们利用常量缓存加速稀疏参数的访问;同时,在生成的算子代
码中隐式编码非 0 参数的位置信息,避免了存储位置信息带来的额外访存需求.通过实验,我们验证了本文所提
出的方法能够有效改善稀疏卷积在 GPU 上的执行效率,并且相对已有方法实现了显著的加速效果.
未来,我们计划从多个方面改进当前的工作.
• 首先是算子模板的编译速度.由于需要确定参数与对应指令的关系,我们需要将模型参数涉及的计算
进行循环展开.当算子规模比较大时,会导致展开后的代码序列很长,这会影响编译生成 PTX 中间表示
的速度.尽管生成的 PTX 中间表示模板可以用于同一算子的不同稀疏参数,但加快编译生成 PTX 的速
度能帮助我们探索在更多算子上的性能情况,同时也使我们可以在算子模板上尝试更多的优化技术.
由于展开的循环序列执行非常类似的计算,我们希望能够利用这一特点,在循环之间复用 PTX 代码,以
改进编译生成 PTX 中间表示的速度;
• 第二,我们希望探索在 CPU 上基于稠密中间表示模板,建立优化稀疏程序的思路.