Page 334 - 《软件学报》2020年第9期
P. 334

董晓  等:面向稀疏卷积神经网络的 GPU 性能优化方法                                                     2955


         在表中列出了每一个算子的具体信息.可以看到:我们选取的算子覆盖了仅需要 36M 计算的简单算子,也包含需
         要 236G 计算的复杂算子.参数最少的算子仅包含 500 个参数,而最大的算子包含超过 14 万个参数.在实验中使
         用的批大小为 64 和 1.在执行生成的代码时,对于每一个算子,我们根据输出张量形状和任务划分信息计算出加
         载 CUDA kernel 时的线程块与线程的形状.
                                 Table 2    Convolution operators used in experiments
                                       表 2   实验中使用的卷积算子信息
                     编号    H×W    C    K   R*S   卷积参数数目    计算量/百万次     来源模型     数据集
                      1    24×24   1   20  5×5     500         36.8     LeNet5  MNIST
                      2     8×8   20   50   5×5   25 000      204.8     LeNet5   MNIST
                      3    32×32   3   32  5×5    2 400       314.5     AexNet   Cifar10
                      4    16×16   32  32   5×5   25 600      838.8    AlexNet  Cifar10
                      5     8×8   32   64   5×5   51 200      419.4    AlexNet  Cifar10
                      6    56×56   64  64   3×3   36 864     14 797.5   ResNet   ImageNet
                      7    28×28   128  128   3×3   147 456   14 797.5   ResNet   ImageNet
                      8   224×224  3   64  3×3    1 728      11 098.1   VGG16   ImageNet
                      9   224×224  64  64   3×3   36 864     236 760.1   VGG16   ImageNet
                      10   112×112  64  128   3×3   73 728   118 380    VGG16   ImageNet

             为了说明我们提出方法的有效性,我们选取了多种在 GPU 上执行卷积神经网络的方法作为对比对象.这些
         对比对象可以分为两大类.
             •   第 1 类是不利用参数中稀疏性的方法,包括 cuDNN            [15] 和 cuBLAS [16] .cuDNN 内封装了多种优化的卷积
                实现,并且会在运行时根据输入数据规模和具体平台等信息选择最优实现.cuBLAS 中的 Sgemm 被用
                来实现卷积,我们使用了基于矩阵展开的卷积方法,并将第 1 步输入张量展开和第 2 步矩阵乘法的总时
                间作为 cuBLAS 方法的执行时间.另外,虽然结构化剪枝一般并不造成稀疏计算的问题,考虑到其也是
                一类利用神经网络参数冗余性,加速神经网络执行的方法,我们也将其选做对比方法,并使用 cuDNN 实
                现结构化剪枝后的计算.我们选择了通道剪枝                [18] 和卷积核剪枝   [19] 两个结构化剪枝方法进行对比:对于
                通道剪枝,我们比较删除卷积操作一半输入通道的情况;对于卷积核剪枝,比较删除一半卷积核的情况.
                此外,由于卷积核数目减半会导致卷积结果的通道数为之前的一半,使得后续卷积的输入通道数目减
                少,因此我们也考虑了同时将输入通道和卷积核数目减半的情况.虽然不考虑利用参数的稀疏性,但
                cuDNN 和 cuBLAS 经过专家的精心调优,可以实现非常好的性能;
             •   另一类方法是与本文工作目的相同,同样可以进行稀疏神经网络计算的方法.我们选择了 Escoin                              [24] 和
                cuSPARSE [23] 进行对比.对于 cuSPARSE,我们使用与 cuBLAS 类似的方法,基于 cuSPARSE 中的稀疏-
                稠密矩阵乘法实现卷积,并考虑输入张量展开的时间;Escoin 也提供了稀疏卷积的 GPU 优化实现,我们
                从 github 上下载了它的代码.
             实验中使用的 cuDNN,cuBLAS 和 cuSPARSE 的版本分别为 7.6.5,9.0 和 9.0.Escoin 使用了当前的最新版本
         (github commit e89275f961847319e6b0331f0dc163a3293fad4c).实验在英伟达 GPU 编程环境 CUDA 9.0 下进行,
         使用 nvcc 9.0 编译器编译代码.
         3.2   与稀疏和稠密卷积方法的对比分析
             在这一节中,我们分析我们的优化方法对其他可用于稀疏卷积优化执行的方法的性能收益.大部分模型剪
         枝工作没有详细给出每一层的压缩比例,考虑到已有模型压缩工作在实验中所涉及的模型上均实现了超过 10
         倍的压缩,我们在本节中使用 0.9 的稀疏程度进行性能测试.在第 3.6 节中,我们进一步分析了不同稀疏程度下的
         性能.我们使用在每个算子上执行 10 次的平均时间表示每个方法的性能.图 7 和图 8 分别展示了批大小为 64
         和批大小为 1 时的实验结果.我们计算了本文方法生成的算子对其他方法的加速比:数值大于 1 表示我们的方
         法性能更优,小于 1 表示对比方法的性能更好.
   329   330   331   332   333   334   335   336   337   338   339