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 所示.全局内存基于