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

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


         记忆网络(long short-term  memory)等.本文中,我们主要关注卷积神经网络.这一类网络在计算机视觉领域的问
                                                                                               [7]
         题中已经获得了广泛应用,包括手写字符识别、图像分类和自动驾驶等.典型的卷积神经网络模型包括 LeNet ,
                [1]
                               [6]
         AlexNet ,VGG [17] 和 ResNet 等.卷积层的参数可以被抽象为一个 4 维张量,4 个维度分别是卷积核维度、通道
         维度、高和宽.图 2 展示了一个包括 2 个卷积核,每个卷积核包含 2 个通道,宽和高为 3 的卷积参数张量.















                   Fig.2  Example of a 2×2×3×3 convolution parameter tensor and different pruning methods
                            图 2  1 个 2×2×3×3 的卷积参数张量以及不同剪枝方法的例子

             尽管神经网络模型参数规模巨大,已有研究发现:在训练完成的神经网络模型中,不同参数对模型最终精度
         的影响是不同的,存在相当比例的冗余参数,将其移除后,神经网络的精度不会发生明显变化.基于这一发现,研
         究人员提出了模型剪枝(model pruning)方法,从训练完成的神经网络中识别并删除部分参数,生成一个参数数
         目更少的轻量级稀疏模型.根据所删除参数在原模型中的位置特点,模型剪枝方法可以被分为结构化剪枝                                      [18−20]
         和非结构化剪枝      [11,21,22] 两类.结构化剪枝方法考虑参数在原模型中的分布特点,移除的参数不是随机分布在原
         模型的任意位置,而是具有一定的结构.以卷积参数为例,结构化剪枝方法以卷积核                            [19] ,或通道 [18] ,或行、列 [20] 等
         为单位进行剪枝.经过结构化剪枝获得的模型,其参数往往仍然具有规则的结构特点,可以被视为规模更小的稠
         密参数,因而通常可以直接使用针对稠密计算的优化库进行计算,所以一般不涉及稀疏计算问题.而非结构化剪
         枝将每个参数作为剪枝的基本单位,独立地对每个参数进行剪枝,因而可以删除任意位置的参数.典型的方法包
                                         [9]
         括 Deep Compression [11] ,DNS [10] ,ADMM 等.这些方法基于某种规则判断每个参数对最终精度的影响,识别出
         相对不重要的参数进行移除.图 2 右侧分别展示了非结构化剪枝和结构化剪枝的例子,其中,结构化剪枝又包含
         以通道和卷积核为剪枝基本单位的情况.经过非结构化剪枝,非 0 参数的分布没有规律,模型参数变为不规则的
         稀疏张量(或稀疏矩阵),在稀疏模型上的计算也变成了稀疏模型参数与稠密输入数据的计算.在 GPU 上执行时,
         需要借助 cuSPARSE    [23] 或 Escoin [24] 等稀疏计算库.由于非结构化剪枝不对剪枝参数的分布做任何限制和假设,
         所以往往能够获得相较于结构化剪枝更好的压缩效果                    [25,26] ,能够更有效地降低模型的存储开销.目前的研究工
         作表明:非结构化剪枝能够实现对典型的卷积神经网络模型参数 9 倍~100 倍                      [9,10,22] 的压缩,有效地解决了神经网
         络模型参数规模过大的问题,同时也显著降低了模型在推理过程中的计算需求.文献[27]也按照剪枝粒度的不
         同,概述了当前的模型剪枝工作.

         1.2   GPU体系结构
             GPU 由于其高性能和高能效比的特点,已经在高性能计算和深度学习等领域获得了广泛应用.GPU 一般包
         含多个流多处理器(streaming multiprocessor),每个流多处理器内又包含众多执行核心(CUDA core).在 GPU 程
         序载入时,GPU 线程按照用户指定的配置被分层组织并绑定到具体的执行核心上.线程首先被划分为线程块
         (thread block),线程块绑定到流多处理器上.线程块内的线程绑定到相应的流多处理器的执行核心上执行.在执
         行时,GPU 线程以 warp 为单位进行调度.一个 warp 包含相邻的 32 个线程.通过支持大量线程的并行执行,GPU
         能够提供很高的峰值性能.
             为了满足大量线程执行中的访存需求,GPU 设计了复杂的存储层次和访存路径,如图 3 所示.全局内存基于
   321   322   323   324   325   326   327   328   329   330   331