2
Journal of Software 软件学报
Key words: neural networks; sparse; GPU; performance optimization; convolution; code generation
深度神经网络近些年来持续受到学术界和工业界的广泛关注.自从 2012 年 AlexNet
[1]
在大规模图像分
类问题中展示出惊人的能力以来,研究人员持续通过在神经网络模型结构和训练算法等领域的创新,借助日
益增长的算力和大规模数据集,不断提升神经网络在各类任务中的表现.与此同时,众多企业也将神经网络模
型应用到各种应用中.比较典型的应用包括物体检测与识别
[2] [3]
,自动驾驶
[4]
,机器翻译
[5]
等.虽然这些模
型在各类任务中展现出了惊人的精度,但这些模型会占用大量存储空间,同时在执行时伴随着巨大的计算开
销.例如,用于图像分类和物体检测等计算机视觉应用的 ResNet50 网络模型
[6]
包含超过 2500 万个参数,对一
张形状为 224*224 的彩色图像进行分类需要执行 76 亿次运算.另一方面,神经网络模型能力的进步也依赖于
模型规模的增长.早期用于简单的手写数字识别的 LeNet5 模型
[7]
仅包含约 6 万个参数,而对于在复杂的
ImageNet
[8]
大规模图像分类比赛中取得优异表现的 AlexNet 模型
[1]
,其参数数目超过了 6000 万.庞大的参数
规模和计算需求阻碍了神经网络模型的广泛应用,同时也使得实现神经网络的高效执行成为了一个既有很强
实际意义,同时也十分紧迫的问题.
面对神经网络庞大的参数数目和海量的计算需求,研究人员提出了模型剪枝的方法来挖掘神经网络模型
参数中的冗余性,对模型进行简化.由于被移除的参数不需要保留,同时与之相关的计算也可以省略,所以模型
剪枝方法能够有效降低神经网络模型的存储开销和计算需求.在保证剪枝后的模型在目标任务上的精度损失
在一定范围内的条件下,模型剪枝方法能够从神经网络中识别出对最终精度影响不大的参数,并将这些参数
从网络中移除,生成一个精简的模型.在模型剪枝方法中,不对可移除参数的分布位置施加约束的非结构化剪
枝一般能够最大限度地挖掘参数的冗余性.典型的非结构化模型剪枝方法可以在精度几乎没有损失的情况
下,移除模型中超过 90%的参数
[9] [10] [11] [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 展示了我们方法的整个流程.首先,我们为卷积算子设计了算子模板.算子
模板不考虑卷积参数的稀疏性.通过对算子模板的编译和分析,我们建立卷积算子的中间表示模板.基于对中
间表示模板的分析,我们可以建立卷积参数与中间表示中指令的映射关系.之后,通过结合具体的稀疏模型参
数,对中间表示模板进行分析和变换,从中识别并删除与无效参数相关的指令序列,获得针对稀疏参数的算子
代码.中间表示模板可以在不同的稀疏参数间复用.另外,我们基于模型参数在神经网络执行过程中取值固定
的特点,为模型参数和算子输入设计了不同的访问路径,提升了执行中的访存吞吐量.同时,在生成的稀疏卷积
算子代码中,有效
参数的位置信息已经被隐式地编码在代码序列中,不再需要额外的索引结构,从而降低了运行中的访存需求,
评论