第15卷第2期 智能系统学报 Vol.15 No.2 2020年3月 CAAI Transactions on Intelligent Systems Mar.2020 D0:10.11992/tis.201902007 网络出版地址:http:/kns.cnki.net/kcms/detail/23.1538.TP.20191205.1449.006.html 一种高效的稀疏卷积神经网络加速器的设计与实现 余成宇12,李志远2,毛文宇,鲁华祥2 (1.中国科学院半导体研究所,北京100083,2.中国科学院大学,北京100089;3.中国科学院脑科学与智能技 术卓越创新中心,上海200031:4.半导体神经网络智能感知与计算技术北京市重,点实验室,北京100083】 摘要:针对卷积神经网络计算硬件化实现困难的问题,之前大部分卷积神经网络加速器的设计都集中于解决 计算性能和带宽瓶颈,忽视了卷积神经网络稀疏性对加速器设计的重要意义,近来少量的能够利用稀疏性的卷 积神经网络加速器设计也往往难以同时兼顾计算灵活度、并行效率和资源开销。本文首先比较了不同并行展 开方式对利用稀疏性的影响,分析了利用稀疏性的不同方法,然后提出了一种能够利用激活稀疏性加速卷积神 经网络计算的同时,相比于同领域其他设计,并行效率更高、额外资源开销更小的并行展开方法,最后完成了 这种卷积神经网络加速器的设计并在PGA上实现。研究结果表明:运行VGG-16网络,在ImageNet数据集 下,该并行展开方法实现的稀硫卷积神经网络加速器和使用相同器件的稠密网络设计相比,卷积性能提升了 108.8%,整体性能提升了164.6%,具有明显的性能优势。 关键词:卷积神经网络;稀疏性;嵌入式FPGA;R©LU;硬件加速;并行计算;深度学习 中图分类号:TN4文献标志码:A文章编号:1673-4785(2020)02-0323-11 中文引用格式:余成宇,李志远,毛文宇,等.一种高效的稀疏卷积神经网络加速器的设计与实现.智能系统学报,2020, 15(2):323-333. 英文引用格式:YU Chengyu,LI Zhiyuan,MAO Wenyu,.etal.Design and implementation of an efficient accelerator for sparse con volutional neural network Jl.CAAI transactions on intelligent systems,2020,15(2):323-333. Design and implementation of an efficient accelerator for sparse convolutional neural network YU Chengyu2,LI Zhiyuan2,MAO Wenyu',LU Huaxiang'234 (1.Institute of Semiconductors,Chinese Academy of Sciences,Beijing 100083,China;2.University of Chinese Academy of Sci- ences,Beijing 100089,China;3.Center for Excellence in Brain Science and Intelligence Technology,Chinese Academy of Sciences, Shanghai 200031,China;4.Semiconductor Neural Network Intelligent Perception and Computing Technology Beijing Key Lab, Beijing 100083,China) Abstract:To address the difficulty experienced by convolutional neural networks(CNNs)in computing hardware im- plementation,most previous designs of convolutional neural network accelerators have focused on solving the computa- tion performance and bandwidth bottlenecks,while ignoring the importance of CNN sparsity to accelerator design.Re- cently,it has often been difficult to simultaneously achieve computational flexibility,parallel efficiency,and resource overhead using the small number of CNN accelerator designs capable of utilizing sparsity.In this paper,we first ana- lyze the effects of different parallel expansion methods on the use of sparsity,analyze different methods that utilize sparsity,and then propose a parallel expansion method that can accelerate CNNs with activated sparsity to achieve high- er parallelism efficiency and lower additional resource cost,as compared with other designs.Lastly,we complete the design of this CNN accelerator and implemented it on FPGA.The results show that compared with a dense network design using the same device,the acceleration performance of the VGG-16 network was increased by 108.8%and its overall performance was improved by 164.6%,which has obvious performance advantages. Keywords:convolutional neural network;sparsity;embedded FPGA;ReLU;hardware acceleration;parallel computing; deep learning 收稿日期:2019-02-14.网络出版日期:2019-12-06. 基金项目:国家白然科学基金项目(61701473);中国科学院 近年来,由于大数据时代海量数据的获取以 STS计划项目(KFJ-STS-ZDTP-070):中国科学院国 防科技创新基金项目(CXJ小-17-M152:中国科学院 及计算机性能的显著提升,以卷积神经网络为代 战略性先导科技专项(A类)XDA18040400):北京市 表的深度学习算法在许多领域体现出了巨大的优 科技计划项目(Z181100001518006). 通信作者:毛文宇.E-mail:maowenyu(@semi.ac.cn 越性。在计算机视觉方向,深度学习的方法已经
DOI: 10.11992/tis.201902007 网络出版地址: http://kns.cnki.net/kcms/detail/23.1538.TP.20191205.1449.006.html 一种高效的稀疏卷积神经网络加速器的设计与实现 余成宇1,2,李志远1,2,毛文宇1 ,鲁华祥1,2,3,4 (1. 中国科学院 半导体研究所,北京 100083; 2. 中国科学院大学,北京 100089; 3. 中国科学院 脑科学与智能技 术卓越创新中心,上海 200031; 4. 半导体神经网络智能感知与计算技术北京市重点实验室,北京 100083) 摘 要:针对卷积神经网络计算硬件化实现困难的问题,之前大部分卷积神经网络加速器的设计都集中于解决 计算性能和带宽瓶颈,忽视了卷积神经网络稀疏性对加速器设计的重要意义,近来少量的能够利用稀疏性的卷 积神经网络加速器设计也往往难以同时兼顾计算灵活度、并行效率和资源开销。本文首先比较了不同并行展 开方式对利用稀疏性的影响,分析了利用稀疏性的不同方法,然后提出了一种能够利用激活稀疏性加速卷积神 经网络计算的同时,相比于同领域其他设计,并行效率更高、额外资源开销更小的并行展开方法,最后完成了 这种卷积神经网络加速器的设计并在 FPGA 上实现。研究结果表明:运行 VGG-16 网络,在 ImageNet 数据集 下,该并行展开方法实现的稀疏卷积神经网络加速器和使用相同器件的稠密网络设计相比,卷积性能提升了 108.8%,整体性能提升了 164.6%,具有明显的性能优势。 关键词:卷积神经网络;稀疏性;嵌入式 FPGA;ReLU;硬件加速;并行计算;深度学习 中图分类号:TN4 文献标志码:A 文章编号:1673−4785(2020)02−0323−11 中文引用格式:余成宇, 李志远, 毛文宇, 等. 一种高效的稀疏卷积神经网络加速器的设计与实现 [J]. 智能系统学报, 2020, 15(2): 323–333. 英文引用格式:YU Chengyu, LI Zhiyuan, MAO Wenyu, et al. Design and implementation of an efficient accelerator for sparse convolutional neural network[J]. CAAI transactions on intelligent systems, 2020, 15(2): 323–333. Design and implementation of an efficient accelerator for sparse convolutional neural network YU Chengyu1,2 ,LI Zhiyuan1,2 ,MAO Wenyu1 ,LU Huaxiang1,2,3,4 (1. Institute of Semiconductors, Chinese Academy of Sciences, Beijing 100083, China; 2. University of Chinese Academy of Sciences, Beijing 100089, China; 3. Center for Excellence in Brain Science and Intelligence Technology, Chinese Academy of Sciences, Shanghai 200031, China; 4. Semiconductor Neural Network Intelligent Perception and Computing Technology Beijing Key Lab, Beijing 100083, China) Abstract: To address the difficulty experienced by convolutional neural networks (CNNs) in computing hardware implementation, most previous designs of convolutional neural network accelerators have focused on solving the computation performance and bandwidth bottlenecks, while ignoring the importance of CNN sparsity to accelerator design. Recently, it has often been difficult to simultaneously achieve computational flexibility, parallel efficiency, and resource overhead using the small number of CNN accelerator designs capable of utilizing sparsity. In this paper, we first analyze the effects of different parallel expansion methods on the use of sparsity, analyze different methods that utilize sparsity, and then propose a parallel expansion method that can accelerate CNNs with activated sparsity to achieve higher parallelism efficiency and lower additional resource cost, as compared with other designs. Lastly, we complete the design of this CNN accelerator and implemented it on FPGA. The results show that compared with a dense network design using the same device, the acceleration performance of the VGG-16 network was increased by 108.8% and its overall performance was improved by 164.6%, which has obvious performance advantages. Keywords: convolutional neural network; sparsity; embedded FPGA; ReLU; hardware acceleration; parallel computing; deep learning 近年来,由于大数据时代海量数据的获取以 及计算机性能的显著提升,以卷积神经网络为代 表的深度学习算法在许多领域体现出了巨大的优 越性。在计算机视觉方向,深度学习的方法已经 收稿日期:2019−02−14. 网络出版日期:2019−12−06. 基金项目:国家自然科学基金项目 (61701473);中国科学院 STS 计划项目 (KFJ-STS-ZDTP-070);中国科学院国 防科技创新基金项目 (CXJJ-17-M152);中国科学院 战略性先导科技专项 (A 类)(XDA18040400);北京市 科技计划项目 (Z181100001518006). 通信作者:毛文宇. E-mail:maowenyu@semi.ac.cn. 第 15 卷第 2 期 智 能 系 统 学 报 Vol.15 No.2 2020 年 3 月 CAAI Transactions on Intelligent Systems Mar. 2020
·324· 智能系统学报 第15卷 获得了超过人类的认知和分类水平。然而像典 庞大的逻辑和存储空间配套,这不利于大规模并 型的分类网络VGG-16,需要15.5G次乘加操作 行,尤其是在FPGA设备上不能将乘法器资源充 和138M的参数量),巨大的计算量和参数量使 分利用,并且这些设计对于计算量密集的卷积计 得卷积神经网络的实际应用困难重重。 算,最终体现出的加速效果也一般,性价比并不高。 如何加速卷积神经网络计算,近年来一直是 针对这些问题,提出了一种利用稀疏性加速 个活跃的研究领域。文献[3]研究了卷积神经网 计算同时并行效率极高、额外资源开销较小的并 络的加速基本方法,并分析了加速设计的性能瓶 行展开方法,设计并实现了能够高效利用稀疏性 颈。文献[4]比较了各种典型的并行展开方法, 加速计算的卷积神经网络加速器。对于卷积层, 提出了适合实时卷积神经网络计算的数据流结 我们通过使用内核脉动阵列展开与特征图平铺展 构。文献[5]设计了多个卷积层处理器,分别加 开结合的并行展开方式,在有效利用激活稀疏性 速不同的卷积层。文献[6]比较了不同的卷积计 减少计算量加速计算的同时,降低了并行计算负 算展开方式,并提出了有效的数据复用和资源展开 载失衡对加速效果的影响;对于全连接层,我们 方法。 选择使用压缩稀疏列的计算方式,同时利用激活 然而仅从计算性能和带宽瓶颈上入手对加速 稀疏性和参数稀疏性,明显的降低了参数量和计 卷积神经网络计算来说还远远不够,有效利用神 算量。 经网络本身的稀疏性,能够从算法层面大大加快 网络计算速度。卷积神经网络的稀疏性体现在 1卷积神经网络的稀疏性 激活结果和网络参数两个方面。 自然界中的神经系统本身是稀疏的),卷积 文献[8]利用激活稀疏性压缩了激活结果中 神经网络本身也是稀疏的。卷积神经网络的稀疏 的零值,节省了传输带宽开销并降低了计算功 性体现在激活结果和网络参数的两个方面。 耗。文献[9]利用激活稀疏性对卷积计算激活结 卷积神经网络的激活结果是稀疏的。卷积神 果压缩编码,在次层计算中跳过激活输入中的零 经网络使用非线性激活函数模仿了生物中神经元 值降低了卷积神经网络计算量。文献[10]利用参 的放电方式,近年来被广泛使用的ReLU激活 数稀疏性,将激活输入中权重无效的输入别除, 函数将所有负值激活为零,给卷积神经网络的激 降低了卷积神经网络计算量。文献[11]同时利用 活结果带来了显著的稀疏性I。例如AlexNet中 激活稀疏性和参数稀疏性,实时选择激活输入中 卷积层有19%~63%的激活结果是06,而对0进 的有效值广播给所有PE,PE独立索引,将有效的 行乘累加对计算结果没有任何影响,跳过这部分 激活输入和权重的乘积累加到对应位置完成卷积 的无效计算,就能给卷积神经网络加速器带来明 计算,有效降低了网络计算量和参数量。文 显的性能提升。 献[12]同时利用激活稀疏性和参数稀疏性,PE内 卷积神经网络的网络参数是冗余的。卷积神 使用笛卡尔乘积的方法,完成稀疏激活输入与稀 经网络使用了大量的参数来保证网络足够的复杂 疏权重的乘积,再将乘积结果还原到对应位置进 度和表现力,然而大量实验证明,增加参数量并 行累加完成卷积计算,有效降低了网络计算量和 不一定能提升网络效果,甚至会带来网络的过拟 参数量。 合。特别地,虽然卷积神经网络的全连接层占 尽管这些方法都能在一定程度上利用卷积神 用了绝大部分的参数量,却仅贡献了非常小的计 经网络的稀疏性优化计算,但是我们注意到它们 算量。例如VGG-16中全连接层使用了89.4%的 很难兼顾计算灵活性、并行效率和资源开销。文 参数,却仅仅占用了0.8%的计算量。实验证明全 献[8]虽然利用激活稀疏性压缩了激活结果,但 连接层的连接是非常稀疏的,能够在不损失网络 受制于计算方式的规整,实际上并没有将它用于 精度的情况下,通过剪枝移除超过90%的全连接 降低计算量。文献[9-10]、[12]没有对并行计算负 层连接。 载失衡导致的性能损失问题进行优化,进行卷积 如图I所示,实验随机选取了ImageNet数据 计算时平均有20%~40%的性能损失在负载失衡 集中的500张图,直接使用VGG-16网络不做任 上四。文献[1)只对输出特征图方向进行了并行 何优化的原始基础参数,统计了每一层的激活输 展开,在计算输出特征图较少的卷积层时不能完 入稀疏性。实验结果表明,对比VGG-16基准网 全利用计算性能,并行效率受到明显影响。文 络模型,在理想情况下利用激活稀疏性能够降低 献[10-12]为了利用参数稀疏性,每个PE都需要 50.92%的计算量
获得了超过人类的认知和分类水平[1]。然而像典 型的分类网络 VGG-16,需要 15.5 G 次乘加操作 和 138 M 的参数量[2] ,巨大的计算量和参数量使 得卷积神经网络的实际应用困难重重。 如何加速卷积神经网络计算,近年来一直是 个活跃的研究领域。文献 [3] 研究了卷积神经网 络的加速基本方法,并分析了加速设计的性能瓶 颈。文献 [4] 比较了各种典型的并行展开方法, 提出了适合实时卷积神经网络计算的数据流结 构。文献 [5] 设计了多个卷积层处理器,分别加 速不同的卷积层。文献 [6] 比较了不同的卷积计 算展开方式,并提出了有效的数据复用和资源展开 方法。 然而仅从计算性能和带宽瓶颈上入手对加速 卷积神经网络计算来说还远远不够,有效利用神 经网络本身的稀疏性,能够从算法层面大大加快 网络计算速度[7]。卷积神经网络的稀疏性体现在 激活结果和网络参数两个方面。 文献 [8] 利用激活稀疏性压缩了激活结果中 的零值,节省了传输带宽开销并降低了计算功 耗。文献 [9] 利用激活稀疏性对卷积计算激活结 果压缩编码,在次层计算中跳过激活输入中的零 值降低了卷积神经网络计算量。文献 [10] 利用参 数稀疏性,将激活输入中权重无效的输入剔除, 降低了卷积神经网络计算量。文献 [11] 同时利用 激活稀疏性和参数稀疏性,实时选择激活输入中 的有效值广播给所有 PE,PE 独立索引,将有效的 激活输入和权重的乘积累加到对应位置完成卷积 计算,有效降低了网络计算量和参数量。文 献 [12] 同时利用激活稀疏性和参数稀疏性,PE 内 使用笛卡尔乘积的方法,完成稀疏激活输入与稀 疏权重的乘积,再将乘积结果还原到对应位置进 行累加完成卷积计算,有效降低了网络计算量和 参数量。 尽管这些方法都能在一定程度上利用卷积神 经网络的稀疏性优化计算,但是我们注意到它们 很难兼顾计算灵活性、并行效率和资源开销。文 献 [8] 虽然利用激活稀疏性压缩了激活结果,但 受制于计算方式的规整,实际上并没有将它用于 降低计算量。文献 [9-10]、[12] 没有对并行计算负 载失衡导致的性能损失问题进行优化,进行卷积 计算时平均有 20%~40% 的性能损失在负载失衡 上 [12]。文献 [11] 只对输出特征图方向进行了并行 展开,在计算输出特征图较少的卷积层时不能完 全利用计算性能,并行效率受到明显影响。文 献 [10-12] 为了利用参数稀疏性,每个 PE 都需要 庞大的逻辑和存储空间配套,这不利于大规模并 行,尤其是在 FPGA 设备上不能将乘法器资源充 分利用,并且这些设计对于计算量密集的卷积计 算,最终体现出的加速效果也一般,性价比并不高。 针对这些问题,提出了一种利用稀疏性加速 计算同时并行效率极高、额外资源开销较小的并 行展开方法,设计并实现了能够高效利用稀疏性 加速计算的卷积神经网络加速器。对于卷积层, 我们通过使用内核脉动阵列展开与特征图平铺展 开结合的并行展开方式,在有效利用激活稀疏性 减少计算量加速计算的同时,降低了并行计算负 载失衡对加速效果的影响;对于全连接层,我们 选择使用压缩稀疏列的计算方式,同时利用激活 稀疏性和参数稀疏性,明显的降低了参数量和计 算量。 1 卷积神经网络的稀疏性 自然界中的神经系统本身是稀疏的[13] ,卷积 神经网络本身也是稀疏的。卷积神经网络的稀疏 性体现在激活结果和网络参数的两个方面。 卷积神经网络的激活结果是稀疏的。卷积神 经网络使用非线性激活函数模仿了生物中神经元 的放电方式[14] ,近年来被广泛使用的 ReLU 激活 函数将所有负值激活为零,给卷积神经网络的激 活结果带来了显著的稀疏性[15]。例如 AlexNet 中 卷积层有 19%~63% 的激活结果是 0 [16] ,而对 0 进 行乘累加对计算结果没有任何影响,跳过这部分 的无效计算,就能给卷积神经网络加速器带来明 显的性能提升。 卷积神经网络的网络参数是冗余的。卷积神 经网络使用了大量的参数来保证网络足够的复杂 度和表现力,然而大量实验证明,增加参数量并 不一定能提升网络效果,甚至会带来网络的过拟 合 [17]。特别地,虽然卷积神经网络的全连接层占 用了绝大部分的参数量,却仅贡献了非常小的计 算量。例如 VGG-16 中全连接层使用了 89.4% 的 参数,却仅仅占用了 0.8% 的计算量。实验证明全 连接层的连接是非常稀疏的,能够在不损失网络 精度的情况下,通过剪枝移除超过 90% 的全连接 层连接[18]。 如图 1 所示,实验随机选取了 ImageNet 数据 集中的 500 张图,直接使用 VGG-16 网络不做任 何优化的原始基础参数,统计了每一层的激活输 入稀疏性。实验结果表明,对比 VGG-16 基准网 络模型,在理想情况下利用激活稀疏性能够降低 50.92% 的计算量。 ·324· 智 能 系 统 学 报 第 15 卷
第2期 余成字,等:一种高效的稀疏卷积神经网络加速器的设计与实现 ·325· 4.00 3.7元 3.00 2.00 1.00 0.92 1-2 21 2.2 32 3.3 4-14-24-35.15-25-3 FC6 FC7 FC8 层名称 四基准 口利用激活稀疏性 图1利用激话稀疏性前后VGG16网络每层计算量的变化 Fig.1 Changes of the computation amount of VGG-16 network layer before and after utilizing the sparsity of activation 使用动态精度量化的方法叨,将参数与激活 尺寸考虑了边界补零,输入特征图通道深度为, 结果均量化为8bit,并对全连接层进行了剪枝,比 输出特征图的数量为M,内核行方向为K,内核 较了网络剪枝前后的参数量。实验结果如图2所 列方向为K,。进行卷积操作时,N个大小为 示。实验结果表明,全连接层占据了大部分的参 K×K,的窗口同时在输入特征图上滑动,每次获 数量,对全连接层进行稀疏剪枝能够降低 取一个大小为K×K,×N的张量,分别与M个输出 85.23%的参数量。以上两个实验证明了,即使不 特征图的权重卷积。卷积的M个计算结果为输 对网络结构进行任何额外的优化,利用稀疏性对 出特征图上的一个像素点,通过依次滑动窗口, 卷积神经网络计算的提升也非常明显。如何有效 最终获得完整的输出特征图。卷积计算的伪代码 利用稀疏性优化计算是当前的卷积神经网络加速 如算法1中表示。 器设计必须要认真考虑的问题。 CONVI CONV2 FC8 0.03%0.16%C0NV3 2.96% 1.07%CONV4 FC7- 4.26% 12.13% C+K-1 CONV5 ▣CONVI 5.12% 图CONV2 图CONV3 输人特征图 卷积内核 输出特征图 ▣CONV4 日CONV5 图3卷积层计算示意 ▣FC6 日FC7 Fig.3 Schematic diagram of convolution computing FC8 FC6 算法1典型的卷积计算伪代码 74.28% for(m=0:m<M;m++) 1输出特征图 ×10的 120 for(n =0:n<N:n++){ 输入特征图 102.76 for(r=0;r<R;r++) 特征图的行 10o ⑧基准 回剪枝后 for(c=0;c<C:c++) /特征图的列 for(i=0:i<K:i++) 内核行方向 60 for(j=0;j<Ky;j++)( 内核列方向 0 16.78 O侣+=K×n乘累加 4.11 图o.67 4904 }}}} FC6 FC7 FC8 利用稀疏性加速卷积神经网络计算会给硬件 层名称 上带来两个问题:首先,稀疏的卷积计算是不平 图2VGG-16全连接层参数量比重与剪枝前后的变化 衡的,而并行计算时负载失衡会导致计算单元利 Fig.2 Proportion and Changes of the parameters amount 用率下降,损失性能,在并行队列数量较多、队列 of VGG-16 full connected layer before and after 长度不够长时,负载失衡的影响会非常明显;其 pruning 次,对激活输入和权重的判断或选择会增加逻辑 2 算法理论设计 复杂度,可能会带来不能接受的面积开销,影响 并行展开规模。 典型的卷积神经网络卷积计算如图3所示。 用系统并行自由度来表征并行计算的负载失 输出特征图的行数为R、列数为C,输入特征图的 衡。如图4所示,大部分卷积计算是以窗口滑动
0 0.170.17 3.70 3.70 3.70 3.70 3.70 3.70 1.97 1.85 1.85 1.28 1.93 1.90 1.85 1.08 0.92 0.22 0.22 0.18 0.210.08 0.030.01 0.010.01 0.92 0.92 1.29 0.89 1.51 2.44 1.00 1-1 1-2 2-1 2-2 3-1 3-2 3-3 4-1 4-2 4-3 5-1 5-2 5-3 FC6 FC7 FC8 2.00 计算量/(GOP) 层名称 3.00 4.00 基准 利用激活稀疏性 图 1 利用激活稀疏性前后 VGG-16 网络每层计算量的变化 Fig. 1 Changes of the computation amount of VGG-16 network layer before and after utilizing the sparsity of activation 使用动态精度量化的方法[19] ,将参数与激活 结果均量化为 8 bit,并对全连接层进行了剪枝,比 较了网络剪枝前后的参数量。实验结果如图 2 所 示。实验结果表明,全连接层占据了大部分的参 数量,对全连接层进行稀疏剪枝能够降 低 85.23% 的参数量。以上两个实验证明了,即使不 对网络结构进行任何额外的优化,利用稀疏性对 卷积神经网络计算的提升也非常明显。如何有效 利用稀疏性优化计算是当前的卷积神经网络加速 器设计必须要认真考虑的问题。 102.76 16.78 4.11 4.10 0.67 0.94 0 20 40 60 80 100 120 ×106 FC6 FC7 FC8 参数量 层名称 基准 剪枝后 CONV1 0.03% CONV2 0.16% CONV3 1.07% CONV4 4.26% CONV5 5.12% FC6 74.28% FC7 12.13% FC8 2.96% CONV1 CONV2 CONV3 CONV4 CONV5 FC6 FC7 FC8 图 2 VGG-16 全连接层参数量比重与剪枝前后的变化 Fig. 2 Proportion and Changes of the parameters amount of VGG-16 full connected layer before and after pruning 2 算法理论设计 典型的卷积神经网络卷积计算如图 3 所示。 输出特征图的行数为 R、列数为 C,输入特征图的 尺寸考虑了边界补零,输入特征图通道深度为 N, 输出特征图的数量为 M,内核行方向为 Kx,内核 列方向 为 Ky。进行卷积操作时, N 个大小 为 Kx×Ky 的窗口同时在输入特征图上滑动,每次获 取一个大小为 Kx×Ky×N 的张量,分别与 M 个输出 特征图的权重卷积。卷积的 M 个计算结果为输 出特征图上的一个像素点,通过依次滑动窗口, 最终获得完整的输出特征图。卷积计算的伪代码 如算法 1 中表示。 Ky N C+Kx−1 Kx R+Ky−1 Ky Kx N M . . . . . . = C R M 输入特征图 输出特征图 卷积内核 * 图 3 卷积层计算示意 Fig. 3 Schematic diagram of convolution computing 算法1 典型的卷积计算伪代码 for(m = 0;m < M;m+ +){ //输出特征图 for(n = 0;n < N;n+ +){ //输入特征图 for(r = 0;r < R;r + +){ //特征图的行 for(c = 0; c < C; c+ +){ //特征图的列 for(i = 0;i < Kx ;i+ +){ //内核行方向 for( j = 0; j < Ky ; j+ +) { //内核列方向 O (m) (c,r)+ = K (m,n) (i, j) × I (n) (c+i,r+j) ; //乘累加 }}}}}} 利用稀疏性加速卷积神经网络计算会给硬件 上带来两个问题:首先,稀疏的卷积计算是不平 衡的,而并行计算时负载失衡会导致计算单元利 用率下降,损失性能,在并行队列数量较多、队列 长度不够长时,负载失衡的影响会非常明显;其 次,对激活输入和权重的判断或选择会增加逻辑 复杂度,可能会带来不能接受的面积开销,影响 并行展开规模。 用系统并行自由度来表征并行计算的负载失 衡。如图 4 所示,大部分卷积计算是以窗口滑动 第 2 期 余成宇,等:一种高效的稀疏卷积神经网络加速器的设计与实现 ·325·
·326· 智能系统学报 第15卷 为时间基本单位控制时序的,窗口滑动之间需要 是按照这3种并行展开方式的其中的一种或者多 等待所有并行化方向上的计算队列计算完成,所 种展开的。 以系统并行自由度越高,负载失衡造成的性能损 对突触进行并行展开通常使用脉动阵列的 失就越严重。对于完全规则设计的卷积计算模 方式。如图5(a)所示,图中K=K,=3,PE缓存权 型,所有并行计算队列的计算时间是相同的,这 重,按照内核行方向K从左到右级联,每次计算 样的系统的并行自由度为1,而增加对权重K 时PE将乘法运算结果与左边相邻PE输入的值 和对激活输入n的选择会使子队列长度不均 做加法运算送往右边相邻PE,每行最右边PE通 等,增加系统并行自由度。 过一个深度为R的IFO连接到次行,脉动阵列 的输入为0,通过全部9个PE之后计算完成全部 计算队列0 计算队列1 内核方向的计算。这种并行展开方式共享了激活 计算队列2 输入,复用了权重。它利用激活稀疏性的系统并 计算队列3 行自由度为1,利用参数稀疏性的系统并行自由 度为K×K,同时利用两种稀疏性的系统并行自由 ☐计算时间☐等待时间|滑窗操作 度为K×K, 图4并行计算性能损失示意 对神经元进行并行展开通常使用二维映射的 Fig.4 Schematic diagram of parallel computing perform- ance losses 方式,如图5(b)所示,特征图的行方向R和列方 卷积计算硬件化设计的关键在于如何兼顾数 向C被分块为T,与T,图中T,=T=3,计算开始 据共享、复用和计算的灵活性,对于稀疏的卷积 时,T×T的激活输入被初始化到T,×T。个PE上, 计算,需要最大化数据共享来降低并行计算时负 权重K广播到每个PE完成乘累加计算,每个 载失衡导致的性能损失。本文分别从并行展开方 PE分别缓存计算结果,每次计算时PE向左或者 式和利用稀疏性方式进行分析比较,确定并行效 向上将激活输入传递给相邻PE,依次按照内核行 率极高、额外资源开销较小的稀疏卷积神经网络 方向K和列方向K,输入权重并传递激活输入, 加速器设计。 经过K×K,个周期,计算完成,每个PE完成了对 2.1并行展开方式 应神经元的全部内核方向的乘累加计算。这种并 如图5所示,总体来说,卷积神经网络加速器 行展开方式共享了权重,复用了激活输入。它利 设计的卷积计算的并行展开方式可以分为3种: 用激活稀疏性的系统并行自由度为T,×T,利用参 展开突触(K、K,)、展开神经元(R、C)、展开特征 数稀疏性的系统并行自由度为1,同时利用两种 图(M、。大部分卷积神经网络加速器的设计都 稀疏性的系统并行自由度为T,×T。 激活输人0 激话输只 权重参数 第0行 PE EFIFOG第1行 凤同散输入 +回 PE 激活输人 输出结果0 第1行 个 EP激活输入 第0行 E 个PE-FIFO2>第2行 第2行 PE 激活输人 PE PE>输出结果 梦结果1 第0列 第1列 第2列 输出结果x PE 激活输入激活输入激活输入 (a)展开突触(脉动阵列) (b)展开神经元(二维映射) (c)展开特征图(平铺) 图5并行展开方式示意 Fig.5 Schematic diagram of parallel expansion mode 对特征图进行并行展开通常使用平铺的方 数稀疏性的系统并行自由度为Tm,同时利用两种 式。如图5(c)所示,输人特征图N和输出特征图 稀疏性的系统并行自由度为T×Tm。 M被分块为Tn与Tm,图5中T=1,Tm=2,对应相同 假设同时利用权重K您和激活输入n的 输入特征图的乘法器共享激活输入,对应相同输 稀疏性,由上文的分析可以看出,无论从什么方 出特征图的乘法器将计算结果经由一个加法树累 向对计算进行并行化,都会增加系统并行自由 加输出。这种并行展开方式共享了激活输入。它 度,系统并行自由度等于PE展开数量。可以预 利用激活稀疏性的系统并行自由度为T,利用参 见在一个没有经过特殊均衡化处理的网络上,由
K (m,n) (i, j) I (n) (c+i,r+j) 为时间基本单位控制时序的,窗口滑动之间需要 等待所有并行化方向上的计算队列计算完成,所 以系统并行自由度越高,负载失衡造成的性能损 失就越严重。对于完全规则设计的卷积计算模 型,所有并行计算队列的计算时间是相同的,这 样的系统的并行自由度为 1,而增加对权重 和对激活输入 的选择会使子队列长度不均 等,增加系统并行自由度。 计算队列0 计算队列1 计算队列2 计算队列3 计算时间 等待时间 滑窗操作 图 4 并行计算性能损失示意 Fig. 4 Schematic diagram of parallel computing performance losses 卷积计算硬件化设计的关键在于如何兼顾数 据共享、复用和计算的灵活性,对于稀疏的卷积 计算,需要最大化数据共享来降低并行计算时负 载失衡导致的性能损失。本文分别从并行展开方 式和利用稀疏性方式进行分析比较,确定并行效 率极高、额外资源开销较小的稀疏卷积神经网络 加速器设计。 2.1 并行展开方式 如图 5 所示,总体来说,卷积神经网络加速器 设计的卷积计算的并行展开方式可以分为 3 种: 展开突触 (Kx、Ky )、展开神经元 (R、C)、展开特征 图 (M、N)。大部分卷积神经网络加速器的设计都 是按照这 3 种并行展开方式的其中的一种或者多 种展开的[4]。 对突触进行并行展开通常使用脉动阵列[20] 的 方式。如图 5(a) 所示,图中 Kx=Ky=3,PE 缓存权 重,按照内核行方向 Kx 从左到右级联,每次计算 时 PE 将乘法运算结果与左边相邻 PE 输入的值 做加法运算送往右边相邻 PE,每行最右边 PE 通 过一个深度为 R 的 FIFO 连接到次行,脉动阵列 的输入为 0,通过全部 9 个 PE 之后计算完成全部 内核方向的计算。这种并行展开方式共享了激活 输入,复用了权重。它利用激活稀疏性的系统并 行自由度为 1,利用参数稀疏性的系统并行自由 度为 Kx×Ky,同时利用两种稀疏性的系统并行自由 度为 Kx×Ky。 K (m,n) (i, j) 对神经元进行并行展开通常使用二维映射的 方式,如图 5(b) 所示,特征图的行方向 R 和列方 向 C 被分块为 Tr 与 Tc,图中 Tr=Tc=3,计算开始 时,Tr×Tc 的激活输入被初始化到 Tr×Tc 个 PE 上, 权重 广播到每个 PE 完成乘累加计算,每个 PE 分别缓存计算结果,每次计算时 PE 向左或者 向上将激活输入传递给相邻 PE,依次按照内核行 方向 Kx 和列方向 Ky 输入权重并传递激活输入, 经过 Kx×Ky 个周期,计算完成,每个 PE 完成了对 应神经元的全部内核方向的乘累加计算。这种并 行展开方式共享了权重,复用了激活输入。它利 用激活稀疏性的系统并行自由度为 Tr×Tc,利用参 数稀疏性的系统并行自由度为 1,同时利用两种 稀疏性的系统并行自由度为 Tr×Tc。 (a) 展开突触(脉动阵列) (b) 展开神经元(二维映射) (c) 展开特征图(平铺) 输出结果x9 第0行 激活输入 第1行 激活输入 第2行 激活输入 第0列 激活输入 第1列 激活输入 第2列 激活输入 激活输入0 激活输入1 FIFO FIFO PE PE PE PE PE PE PE PE PE 第1行 第0行 第2行 第1行 输出结果 激活输入 A W W W W W W W W W PE PE PE PE PE PE PE PE PE W 权重参数 A A A A A A A A A PE W PE W PE W PE W 输出结果0 输出结果1 A A 图 5 并行展开方式示意 Fig. 5 Schematic diagram of parallel expansion mode 对特征图进行并行展开通常使用平铺的方 式。如图 5(c) 所示,输入特征图 N 和输出特征图 M 被分块为 Tn 与 Tm,图 5 中 Tn=1,Tm=2,对应相同 输入特征图的乘法器共享激活输入,对应相同输 出特征图的乘法器将计算结果经由一个加法树累 加输出。这种并行展开方式共享了激活输入。它 利用激活稀疏性的系统并行自由度为 Tn,利用参 数稀疏性的系统并行自由度为 Tm,同时利用两种 稀疏性的系统并行自由度为 Tn×Tm。 K (m,n) (i, j) I (n) 假设同时利用权重 和激活输入 (c+i,r+j) 的 稀疏性,由上文的分析可以看出,无论从什么方 向对计算进行并行化,都会增加系统并行自由 度,系统并行自由度等于 PE 展开数量。可以预 见在一个没有经过特殊均衡化处理的网络上,由 ·326· 智 能 系 统 学 报 第 15 卷
第2期 余成字,等:一种高效的稀疏卷积神经网络加速器的设计与实现 ·327· 于负载失衡造成的性能损失将是非常严重的。与 使用平铺的方式对输出特征图方向部分并行展开 此同时,只要利用参数稀疏性,这3种并行展开方 了Tm长度,这Tm个PE组成一个共享激活输入的 式目前的数据共享与复用都会遭到不同程度的破 PE组,然后将K×K,个这样的PE组按突触方向 坏,每个PE都需要独立的选择与索引逻辑,这导 使用脉动阵列的方式并行展开。使用这样的并行 致单位PE面积可能会非常巨大,不利于大规模 展开方式,展开了Tm×K×K,个PE,而整个系统仅 并行。尤其是目前看来,对于计算量密集的卷积 使用了1个逻辑单元负责有效激活输入选择,就 计算,通过利用参数稀疏性节省的计算量可能还 完成了利用激活稀疏性加速计算的功能,资源开 不能抵消资源上的开销,这是得不偿失的。 销极小,并且系统并行自由度仅为1,负载失衡造 基于以上这些考虑,在卷积层计算时仅利用 成的性能损失最低。对应的卷积层计算伪代码如 了激活输入n的稀疏性。如图6所示,首先 算法2所示。 激活输入,口回 MAC PE PEPE SFIFO第1行 激活输人 MAC MAC 第0行 PE FIFO>第2行 MAC 第1行 以PE PE 输出结果 T 展开输出特征图(平铺) 展开突触(脉动阵列 PE Core 图6本设计使用的并行展开方式示意 Fig.6 Schematic diagram of parallel expansion mode in our design 算法2卷积层计算伪代码 数密度为4%),计算队列的长度特别长(VGG-16, for(m =0;mM;m+=Tm) 不分块情况下FC-6的激活队列长度为25088), K=load_weight(m); 足以忽略负载失衡造成的性能损失,非常适合利 for(c=0;c<C;c++) 用参数稀疏性进行计算,所以对全连接层计算使 for(r=0;r<R;r++) for(n=0;n<N:n++) 用压缩稀疏列(CSC)方式同时使用了激活稀疏性 if(mn≠0 和参数稀疏性。全连接层计算是简单的矩阵乘 法,使用平铺的方式并行展开输出特征图效率最 for(j=0;j<Ky;j++)( #unroll 高,此时系统并行自由度为Tm。对应的全连接层 for(i=0;i<K;i++) 计算伪代码如算法3所示。 #unroll 算法3全连接层计算伪代码 for(tm m;tm min(m+Tm,M):tm++){ for(m=0;mM;m+=T) #unroll for(n=0:nN:n+=T)( S[+=K×I②: K=load_weight(m,n); 》 for (tn=n;tn min(n+T,N);tn++){ Kv-l Kx-1 #pipeline O=Systoli if(m≠0) =0 册 for (tm m;tm min(m+Tm,M)tm+=Tmm) #parallelism 注意到现代卷积神经网络的卷积核几乎只 for(tmm tm;tmm min(tm+Tmm,M);tmm++) 有3×3和1×1,并且对于大于3×3的卷积核(例如 #pipeline 5×5)可以使用多次3×3卷积替代四。类似的,每 if(Kamm)≠0) 个PE组分别独立计算输出特征图即可以将3×3 Q(tmm)+=K(tmm.in)x (tn). 卷积工作模式转换成1×1卷积工作模式。所以本 }7 文提出的这种并行展开方式展开3×3的卷积核是 2.2利用稀疏性方式 可以适应于大部分卷积神经网络的。 卷积神经网络稀疏性分为激活稀疏性和参数 全连接层参数量巨大,片上片下传输带宽是 稀疏性两种,利用稀疏性的方式直接决定了设计 全连接层计算瓶颈,不做任何算法优化在硬件上 的复杂性和额外的资源开销量,我们分别分析不 完成全连接层计算是效率极低的,并且本身全连 同的利用稀疏性方式。 接层稀疏性非常高(对于VGG-16,FC-6的有效参 利用激活稀疏性主要可以分为压缩编码和多
于负载失衡造成的性能损失将是非常严重的。与 此同时,只要利用参数稀疏性,这 3 种并行展开方 式目前的数据共享与复用都会遭到不同程度的破 坏,每个 PE 都需要独立的选择与索引逻辑,这导 致单位 PE 面积可能会非常巨大,不利于大规模 并行。尤其是目前看来,对于计算量密集的卷积 计算,通过利用参数稀疏性节省的计算量可能还 不能抵消资源上的开销,这是得不偿失的。 I (n) (c+i,r+j) 基于以上这些考虑,在卷积层计算时仅利用 了激活输入 的稀疏性。如图 6 所示,首先 使用平铺的方式对输出特征图方向部分并行展开 了 Tm 长度,这 Tm 个 PE 组成一个共享激活输入的 PE 组,然后将 Kx×Ky 个这样的 PE 组按突触方向 使用脉动阵列的方式并行展开。使用这样的并行 展开方式,展开了 Tm×Kx×Ky 个 PE,而整个系统仅 使用了 1 个逻辑单元负责有效激活输入选择,就 完成了利用激活稀疏性加速计算的功能,资源开 销极小,并且系统并行自由度仅为 1,负载失衡造 成的性能损失最低。对应的卷积层计算伪代码如 算法 2 所示。 W A MAC MAC MAC MAC 激活输入 PE 展开输出特征图(平铺) 展开突触(脉动阵列) 输出结果 FIFO FIFO PE PE PE PE PE PE PE PE PE 第1行 第0行 第2行 第1行 激活输入 A W PE Core 图 6 本设计使用的并行展开方式示意 Fig. 6 Schematic diagram of parallel expansion mode in our design 算法2 卷积层计算伪代码 for(m = 0;m < M;m+ = Tm){ K = load_weight(m); for(c = 0; c < C; c+ +){ for(r = 0;r < R;r + +){ for(n = 0;n < N;n+ +){ if( I (tn) (r,c+j) , 0 ) { for( j = 0; j < Ky ; j+ +) { #unroll for(i = 0;i < Kx ;i+ +){){ #unroll for(tm = m;tm < min(m+Tm, M);tm+ +){ #unroll S (tm) (c,r) [i] [ j ] + = K (tm,n) (i, j) × I (n) (c,r) ; }}}}}} O (tm) (c,r) = Systolic Ky ∑−1 j=0 Kx∑−1 i=0 S (tm) (c+i−Kx,r+j−Ky) [i] [ j ] ; }}} 注意到现代卷积神经网络的卷积核几乎只 有 3×3 和 1×1,并且对于大于 3×3 的卷积核 (例如 5×5) 可以使用多次 3×3 卷积替代[2]。类似的,每 个 PE 组分别独立计算输出特征图即可以将 3×3 卷积工作模式转换成 1×1 卷积工作模式。所以本 文提出的这种并行展开方式展开 3×3 的卷积核是 可以适应于大部分卷积神经网络的。 全连接层参数量巨大,片上片下传输带宽是 全连接层计算瓶颈,不做任何算法优化在硬件上 完成全连接层计算是效率极低的,并且本身全连 接层稀疏性非常高 (对于 VGG-16,FC-6 的有效参 数密度为 4%),计算队列的长度特别长 (VGG-16, 不分块情况下 FC-6 的激活队列长度为 25 088), 足以忽略负载失衡造成的性能损失,非常适合利 用参数稀疏性进行计算,所以对全连接层计算使 用压缩稀疏列 (CSC) 方式同时使用了激活稀疏性 和参数稀疏性。全连接层计算是简单的矩阵乘 法,使用平铺的方式并行展开输出特征图效率最 高,此时系统并行自由度为 Tm。对应的全连接层 计算伪代码如算法 3 所示。 算法3 全连接层计算伪代码 for(m = 0;m < M;m+ = Tm){ for(n = 0;n < N;n+ = Tn){ K = load_weight(m,n); for(tn = n;tn < min(n+Tn,N);tn+ +){ #pipeline if( I (tn) , 0 ) { for(tm = m;tm < min(m+Tm, M);tm+ = Tmm){ #parallelism for(tmm = tm;tmm < min(tm+Tmm, M);tmm+ +){ #pipeline if( K (tmm,tn) , 0 ) { O (tmm)+ = K (tmm,tn) × I (tn) ; }}}}}}} 2.2 利用稀疏性方式 卷积神经网络稀疏性分为激活稀疏性和参数 稀疏性两种,利用稀疏性的方式直接决定了设计 的复杂性和额外的资源开销量,我们分别分析不 同的利用稀疏性方式。 利用激活稀疏性主要可以分为压缩编码和多 第 2 期 余成宇,等:一种高效的稀疏卷积神经网络加速器的设计与实现 ·327·