查看原文
其他

细粒度稀疏也能取得高加速比:神经网络模型压缩与加速的新思路

曹士杰 张宸 微软研究院AI头条 2020-09-12



编者按: 深度神经网络让人工智能在多个领域获得了极大的进步,但随着模型日益变大、变复杂,深度神经网络的低延迟推理对应用落地来说至关重要。为此,微软亚洲研究院系统与网络组从模型的稀疏性入手解决计算力需求增长与供应之间的矛盾,通过利用权重稀疏性(weight sparsity)和特征图稀疏性(feature map sparsity)同时达到高准确率,高模型压缩率和加速比。


当前人工智能在图像、语音等领域取得的成功很大程度上归功于大型多层的深度神经网络模型。为了达到更好的效果或解决更复杂的问题,这些模型还在日益变大、变复杂。然而,在人工智能的多数应用领域,例如机器翻译、语音识别、自动驾驶等等,用户对人工智能系统的响应速度都非常敏感,有些甚至关乎生命安全。因此深度神经网络的低延迟推理是人工智能应用落地场景中一个非常关键的问题


为了解决计算需求不断增长的问题,学术界和工业界都进行了大量的努力。一个直接的方法是通过定制化专用计算硬件(例如GPU、FPGA、ASIC),通过对深度神经网络进行领域特定体系结构设计(domain specific architecture design)提升神经网络的计算效率和速度,例如GPU中的Tensor Cores和 TPU中基于脉动阵列的矩阵乘法单元。然而,这种方法仍然满足不了日益增长的需求,深度学习模型还在增大,同时对于很多部署在移动端的AI应用,因为受到功耗和电源供应的限制,移动端处理器计算力的增长更是相对缓慢。


于是,我们希望用另一个方法解决计算力需求增长与供应之间的矛盾:模型的稀疏性。许多实验证明,神经网络模型都是过参数化的(over-parameterized),许多参数都是冗余的,恰当的删除这些参数对模型最终的结果几乎没有影响。模型剪枝(model pruning)就是一个很好的例子。神经网络中存在很多数值为零或者数值接近零的权值,合理的去除这些“贡献”很小的权值,再经过对剩余权值的重训练微调,模型可以保持相同的准确率。对于很多神经网络来说,剪枝能够将模型大小压缩10倍以上,这就意味着可以减少10倍以上的模型计算量,结合定制硬件的计算力提升,最终可能达到更高的性能提升。 


尽管听起来非常美好,现实并不尽如人意。模型剪枝带来的的稀疏性,从计算特征上来看非常的“不规则”,这对计算设备中的数据访问和大规模并行计算非常不友好。例如对GPU来说,我们使用cuSPARSE稀疏矩阵计算库来进行实验时,90%稀疏性(甚至更高)的矩阵的运算时间和一个完全稠密的矩阵运算时间相仿。也就是说,尽管我们知道绝大部分的计算是浪费的(90%稀疏性意味着性能提升的上限是10倍),却不得不忍受“不规则”带来的机器空转和消耗。


顺着这个思路,许多研究开始探索通过给神经网络剪枝添加一个“规则”的约束,使得剪枝后的模型更加适合硬件计算,但这种方法通常会牺牲模型的准确率和压缩比。我们认为 “非规则”的剪枝契合了神经网络模型中不同大小权值的随机分布,这对深度学习模型的准确度至关重要。而这种随机分布是深度学习模型为了匹配数据特征,通过训练后所得到的固有结果,为了迎合计算需求而设定的特定稀疏分布会增加破坏模型表达能力的风险,降低模型的准确度和压缩比。大量的实验也验证了这个观点。


从计算的角度来看,“随机”与“规则”是一对矛盾的概念,非此即彼。如果要两者兼顾,就不得不各自有所损失。然而,我们认为 “随机”是特征上的随机和权值分布上的随机,并不完全等于计算上的随机。模型剪枝中特征上的“随机”与计算上的“规则”并不是一个绝对矛盾的概念,这就给调和这一对矛盾提供了空间,让我们得以取得既快又准的稀疏化模型。我们提出了一种在特征上“ 随机”但非常适合FPGA与GPU计算的稀疏化方法,并验证了其数学上与非规则稀疏的相似性。相关论文发表在FPGA 2019 和 AAAI 2019。


另一方面,神经网络的稀疏性并不仅仅存在于参数中,我们进一步探索了深度神经网络中特征图(每层神经网络的输入输出)的稀疏性,例如图像中的背景等对当前任务不重要的感知域,经过激活函数(如ReLU)后未被激活的部分特征图等。这意味着人工神经网络的神经元并不会对每一张图像都产生响应。通过在主流模型和数据集上的实验,我们发现,尽管不同层展现出的稀疏性各不相同,特征图的稀疏性平均超过了50%,有一些层甚至高达95%。然而与模型剪枝不同的是,特征图响应的稀疏性是随着每一张输入图像动态变化的,因此对加速提出了更多的挑战。我们在CVPR 2019的工作提出了一种创新的方法利用特征图的稀疏性


Bank-Balanced Sparsity(BBS):高模型准确率且硬件友好的块平衡稀疏模式

权值剪枝是一种非常有效的对深度神经网络引入稀疏性的方法。权值剪枝一般使用预先定义好的阈值来指导对权值的剪枝,绝对值小于这个阈值的权重将会被丢弃。完成剪枝后,模型的准确率会有所下降,通过重训练和微调剩余权重可以恢复模型的准确率。这种对每一个独立权值进行剪枝的方法称为细粒度剪枝(fine-grained pruning),这种方法可以在不损失模型准确率的情况下压缩网络模型大小。但是对于硬件计算来说,细粒度剪枝的一个缺点是将权值矩阵变成了不规则的稀疏矩阵,例如图1中最左侧的权值矩阵所示(这里我们以全连接层为例)。稀疏矩阵运算虽然需要更少的绝对计算量,但是不规则的内存访问和计算模式会增加存储访问延迟,破坏计算的并行性。后续的研究工作提出了粗粒度的剪枝方法(coarse-grained pruning),这种方法以block为剪枝对象,用block的平均值或最大值来代表整个block的重要性,例如图1示例中以2,3,4位block size。粗粒度剪枝方法使得权值矩阵更加规则,更加有利于硬件加速,但难以达到和细粒度剪枝相同的模型准确率或稀疏度(即相同稀疏度时,准确率低;相同准确率时,稀疏度低)。因此对于深度神经网络中权值的稀疏性来说,存在模型准确率和硬件加速比的权衡。


图1:不同剪枝方法对应的权值矩阵


Bank-Balanced Sparsity 


在这项工作中,我们思考了如何在稀疏神经网络中同时实现高模型准确率和高硬件执行效率,提出了Bank-balanced sparsity, 即块平衡稀疏,简称 BBS,一种用于模型剪枝的、可保持高模型准确率且硬件友好的稀疏模式。


我们首先介绍块平衡剪枝方法,如图2所示。对于一个稠密权值矩阵,我们首先将矩阵中的每一行分割成多个大小相同的bank。然后在每一行的每一个bank中采用细粒度剪枝方法。同时为了使每一个bank达到相同的稀疏度,对每一个bank的细粒度剪枝均采用相同的百分比作为阈值。图2示意了块平衡剪枝先对bank进行切分后,对每一个bank进行细粒度剪枝的过程。


图2:块平衡剪枝方法框架图


由于我们在每个bank内使用细粒度剪枝,因此能够很大程度地保留那些数值较大的权值,保持权值的随机分布,从而保持高模型准确率。同时这种方法得到的稀疏矩阵模式将矩阵进行了平衡的分割,这有利于硬件解决不规则的内存访问,并对矩阵运算实现高并行度。


可达到的模型准确率和稀疏度


为了验证块平衡稀疏的效果,我们可视化了使用块平衡剪枝后的权值分布,并和细粒度剪枝和粗粒度剪枝后得到的稀疏模式进行了比较,如图3所示。图中三个示例所选取的是相同的一块权值矩阵,并达到了相同的稀疏度。结果显示,块平衡稀疏的模式非常接近于细粒度剪枝后的无结构限制的稀疏模式。而粗粒度剪枝因为限制了非零权值的位置,所以稀疏模式有很大的不同。


图3:细粒度剪枝(a)、块平衡剪枝(b)和粗粒度剪枝(c)后得到的稀疏模式对比


同时我们也验证了该方法分别在RNN和CNN模型上所能达到的准确率和稀疏度,如图4所示的LSTM模型在PTB数据集上使用不同的稀疏模式的准确率和稀疏度。图中,块平衡稀疏和非结构化稀疏的准确率-稀疏度曲线是非常接近的,在不降低模型准确率的情况下都可以达到80%的稀疏度,表明块平衡稀疏可以达到和非结构话稀疏几乎相同的模型压缩效果。而结构化稀疏在不降低模型准确率的情况下只能达到40%的稀疏度,在相同稀疏度的情况下,与非结构化稀疏和块平衡稀疏相比模型准确率更低。


图4:LSTM模型在PTB数据集上使用不同的稀疏模式的准确率和稀疏度


硬件加速器设计


由于块平衡稀疏具有天然的行平衡和块平衡特性,我们可以为之设计一种高并行的稀疏矩阵运算加速器。在块平衡稀疏模式中,权值矩阵的每一行和每一块都有相同数目的非零权值。因此当我们按照行和块去切分矩阵,并将其对应的计算映射到并行的硬件模块或线程时,负载均衡被自然保证。同时,在上述并行计算的过程中,每一个块内有且只有一个权值元素需要内存访问其对应被乘元素(如特征图中的对应元素)。因此我们采用了分块的存储器设计来缓存这些特征元素,来消除内存访问冲突,最大化利用存储带宽。在分块的存储器设计中,每一个memory bank都有一个独立的内存访问随机访问接口,因此可以支持每个时钟周期同时随机访问多个内存地址。

 

我们分别将上述硬件加速器设计方法实现在了FPGA和GPU中。基于FPGA的加速器针对的是batch size 为1的LSTM网络推断,如图5所示。设计核心是一个高并行度的稀疏矩阵向量乘法加速单元。相比于之前的基于FPGA的LSTM加速器,BBS加速器实现了7.0-34.4倍的延迟降低和2.3-3.7倍的能效提升。


图5:稀疏矩阵运算加速器框架图


基于GPU的加速器设计充分利用了GPU体系结构中,shared memory也是分块组织的。因此我们也将该加速器设计映射到了多线程的cuda实现。实验结果表明,相较于非机构化稀疏和结构化稀疏,块平衡稀疏模式和定制的GPU实现达到了更好的硬件加速与模型准确率之间的平衡。


图6:PTB数据集中不同稀疏模式下的模型准确率和推理时间


相关研究成果已发表在FPGA 2019和AAAI 2019。更多细节请参考论文:


Efficient and Effective Sparse LSTM on FPGA with Bank-Balanced Sparsity. 

Shijie Cao, Chen Zhang, Zhuliang Yao, Wencong Xiao, Lanshun Nie, Dechen Zhan, Yunxing Liu, Ming Wu, Lintao Zhang. (FPGA 2019). 

论文链接:https://www.microsoft.com/en-us/research/uploads/prod/2019/05/FPGA2019_final.pdf


Balanced Sparsity for Efficient DNN Inference on GPU. 

Zhuliang Yao, Shijie Cao, Wencong Xiao, Chen Zhang and Lanshun Nie. (AAAI 2019).

论文链接:https://arxiv.org/abs/1811.00206



SeerNet:通过低比特量化方法预测卷积神经网络的特征图稀疏性


这篇论文关注的是卷积神经网络中输出特征图的稀疏性。例如,在卷积神经网络中,每个卷积层后通常会连接ReLU层或者Max-pooling层。经过ReLU或Max-pooling层后,卷积层的大部分输出被置为零或丢弃。从计算的角度考虑,如果能够省略零值输出和丢弃输出所对应的先导卷积计算,则可以大大减少卷积层的计算量。


由此我们提出了SeerNet。“Seer” 是“预见/先知”,文如其名,我们利用极低比特网络以极低的代价预测输出特征稀疏性,通过稀疏的高精度计算加速神经网络计算。SeerNet可以直接应用于预训练好的模型中,而无需对原始模型做任何修改或重训练。图7简述了本文的核心思想,对于每层卷积神经网络,首先使用量化后的低比特(例如4比特,2比特,1比特)网络预测输出特征的稀疏分布,然后利用稀疏分布信息引导原始精度的模型推理,即只进行有效输出(非零输出)所对应的卷积计算。


图7:SeerNet模型框架图


通过针对硬件优化的稀疏算法设计,本文基于CPU的实现在卷积层上取得了最高5.79x的加速,并且在端到端的模型推理中取得1.2x-1.4x的加速。同时,由于新型的AI硬件对混合精度的计算提供了更好的支持,SeerNet会有更大的用武之地,例如NVIDIA最新发布的Turing架构支持16/8/4-bit 混合精度张量计算单元,Xilinx和Altera的FPGA提供了任意精度整数计算的支持。这些硬件平台对低比特操作的支持可以降低预测过程的额外开销,同时定制的算法和体系结构可以最大化地加速稀疏计算。


图8:SeerNet在ResNet和VGG的不同层取得的sparsity和speedup


相关研究成果已经发表在CVPR 2019。更多细节请参考论文:


SeerNet: Predicting Convolutional Neural Network Feature-Map Sparsity through Low-Bit Quantization.  

Shijie Cao, Lingxiao Ma, Wencong Xiao, Chen Zhang, Yunxin Liu, Lintao Zhang, Lanshun Nie, Zhi Yang. (CVPR 2019). 

论文链接:https://www.microsoft.com/en-us/research/uploads/prod/2019/05/CVPR2019_final.pdf







你也许还想看


感谢你关注“微软研究院AI头条”,我们期待你的留言和投稿,共建交流平台。来稿请寄:msraai@microsoft.com。


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存