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

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


         networks. First,  a template is designed for  convolution operators  with several optimizations targeting  GPU  architecture.  Through
         compiling and analyzing, the operator template is transformed to the intermediate representation template, which serves as the input to the
         designed  algorithm to generate  sparse  convolution  code  according to specific sparse  convolution parameters.  Moreover, to improve
         memory throughput, optimizations  are performed on data  access  and data placement based  on the  characteristics of  memory  access in
         neural networks. Finally, as the location information can be encoded into the generated code implicitly, the index structure for the sparse
         parameters can be eliminated, reducing the memory footprint during the execution. In experiments, it is demonstrated that the proposed
         sparse code generating method can improve the performance of sparse convolutional neural networks compared with current methods.
         Key words:    neural networks; sparse; GPU; performance optimization; convolution; code generation
                                                                             [1]
             深度神经网络近年来持续受到学术界和工业界的广泛关注.自从 2012 年 AlexNet 在大规模图像分类问题
         中展示出惊人的能力以来,研究人员持续通过在神经网络模型结构和训练算法等领域的创新,借助日益增长的
         算力和大规模数据集,不断提升神经网络在各类任务中的表现.与此同时,众多企业也将神经网络模型应用到各
                                                          [4]
                                                                     [5]
         种应用中.比较典型的应用包括物体检测与识别                 [2,3] 、自动驾驶 、机器翻译 等.虽然这些模型在各类任务中展
         现出了惊人的精度,但这些模型会占用大量存储空间,同时在执行时伴随着巨大的计算开销.例如,用于图像分
                                                     [6]
         类和物体检测等计算机视觉应用的 ResNet50 网络模型 包含超过 2 500 万个参数,对一张形状为 224×224 的彩
         色图像进行分类,需要执行 76 亿次运算.另一方面,神经网络模型能力的进步也依赖于模型规模的增长.早期用
                                                                                [8]
                                        [7]
         于简单的手写数字识别的 LeNet5 模型 仅包含约 6 万个参数,而对于在复杂的 ImageNet 大规模图像分类比
                                     [1]
         赛中取得优异表现的 AlexNet 模型 ,其参数数目超过了 6 千万.庞大的参数规模和计算需求阻碍了神经网络模
         型的广泛应用,同时也使得实现神经网络的高效执行成为了一个既有很强实际意义,同时也十分紧迫的问题.
             面对神经网络庞大的参数数目和海量的计算需求,研究人员提出了模型剪枝的方法来挖掘神经网络模型
         参数中的冗余性,对模型进行简化.由于被移除的参数不需要保留,同时与之相关的计算也可以省略,所以模型
         剪枝方法能够有效降低神经网络模型的存储开销和计算需求.在保证剪枝后的模型在目标任务上的精度损失
         在一定范围内的条件下,模型剪枝方法能够从神经网络中识别出对最终精度影响不大的参数,并将这些参数从
         网络中移除,生成一个精简的模型.在模型剪枝方法中,不对可移除参数的分布位置施加约束的非结构化剪枝一
         般能够最大限度地挖掘参数的冗余性.典型的非结构化模型剪枝方法可以在精度几乎没有损失的情况下,移除
         模型中超过 90%的参数       [9−12] ,同时将剪枝后稀疏模型的计算需求降低为剪枝前的约 10%.
             尽管非结构化的模型剪枝方法有效降低了理论计算量,但在 GPU 平台上将这部分理论性能收益转换为实
         际的性能加速却面临着严峻的挑战:首先,与剪枝前的稠密计算相比,剪枝后的稀疏计算的计算密度更低,这使
         得 GPU 计算核心与 DRAM 之间的数据传输容易成为性能瓶颈,导致剪枝后的稀疏计算难以充分利用 GPU 的
         计算能力;其次,对于稀疏数据,我们往往仅保留其中的非 0 元素,并使用额外的索引结构存储这些元素的位置信
         息,以节约存储空间.这两部分共同构成了稀疏数据的表达,例如典型的稀疏矩阵格式 CSR(compressed sparse
         row) [13] ,CSC(compressed sparse column),COO(coordinate)和稀疏张量格式 CSF(compressed sparse fiber) [14] 等.稀
         疏参数表示中的索引结构增加了稀疏神经网络执行时的访存需求,进一步恶化了计算密度低的问题.最后,GPU
         本身的执行模型和存储层次都比较复杂,而且目前已有的在 GPU 上进行稠密神经网络计算的 cuDNN                                   [15] 和
         cuBLAS [16] 等方法经过了专家精心的手工优化.因此,需要结合计算中的数据访问特点和 GPU 的体系结构特征,
         对数据的布局和任务划分等进行相应优化,才能将稀疏计算的理论加速效果转化为实际的性能收益.
             本文中,我们提出了一种稀疏感知的卷积算子代码生成方法,能够为剪枝后稀疏的卷积神经网络生成高效
         的前向推理的执行代码.图 1 展示了我们方法的整个流程:首先,我们为卷积算子设计了算子模板.算子模板不考
         虑卷积参数的稀疏性.通过对算子模板的编译和分析,我们建立卷积算子的中间表示模板.基于对中间表示模板
         的分析,我们可以建立卷积参数与中间表示中指令的映射关系.之后,通过结合具体的稀疏模型参数,对中间表
         示模板进行分析和变换,从中识别并删除与无效参数相关的指令序列,获得针对稀疏参数的算子代码.中间表示
         模板可以在不同的稀疏参数间复用.另外,我们基于模型参数在神经网络执行过程中取值固定的特点,为模型参
         数和算子输入设计了不同的访问路径,提升了执行中的访存吞吐量.同时,在生成的稀疏卷积算子代码中,有效
   319   320   321   322   323   324   325   326   327   328   329