主要设计了一个可以高效处理稀疏化CNN的高效硬件架构,主要思想就是跳过weight和activation中有0的乘法的情况。以达到加速(cycle)和降低功耗的效果。
以下按照原文结构,大致概括一下文章的脉络。
ABSTRACT
本文设计了一个Sparse CNN (SNN)的加速器硬件架构,通过设计一种压缩的数据流模式,同时探索了weight和activation在硬件中的稀疏性,即跳过含有0的乘法计算,以此可以减少数据交换和存储空间。相对于密集的CNN加速器,分别提高了2.7X和2.3X的性能和功耗。
1 INTRODUCTION
列举一些关键信息。
SparseCNN的可以被剪枝的weight大约占20%~80% [16, 17].
50-70%的activation被约束到0.
通过对非零数的压缩编码(即引入非零数的index),可以在on-chip RAM上存下更多的有效数据进行运算,减少从DRAM访存的功耗。
SCNN是首次同时高效处理weight和activation稀疏的硬件架构。
设计了高效的SCNN dataflow来降低访存(activation stationary)。
探索不同网络的稀疏度:
黄色的三角形对应于weight和activation都为非零的情况,可以看出随着层数加深,相比于只处理稀疏weight,仍有很大的优化空间(最后一层可能只有不到50%的非零乘法)
不同工作对于weight 和 activation 稀疏度的利用:
3 SCNN DATAFLOW
起了个很难听的名字:
PlanarTiled-InputStationary-CartesianProduct-sparse, or PT-IS-CP-sparse.
相对应该数据流用来处理非稀疏的网络时:PT-IS-CP-dense
先看PT-IS-CP-dense的情况:
3.1 PT-IS-CP-dense
以一层的卷积层为例:
通常的inference情况下,都取N为1.
按照最简单的处理卷积的顺序(比如使用for循环),处理顺序为:N → K →C →W → H → R → S
PT-IS-CP-dense则采用 input-stationary(IS)的计算顺序,即外层循环是整张activation(即 input 数据不流动),为 C → W → H → K → R → S
对于输入数据,需要input buffer 来在片上存储数据,同时由于不能一次处理完所有的input channel,所以需要accumulator buffer来存储中间值 partial sum(psum),而且每个buffer都对应着一个(读取-累加-写入)的操作,用来计算最终的output channel每一个pixel的值。这个acc buffer和adder合起来称之为一个acc unit。
将K个kernel(也对应着K个output channel)拆分成Kc个为一组,共有K/Kc组output-channel groups。每次只存储一个group在片上的weight buffer和accumulation buffer。则这样的子块(sub-volumes)对应的片上缓存为:
对应的外部循环顺序为:
K/Kc → C → W → H → Kc → R → S
讨论对应到并行的硬件结构中的计算流程。
3.1.1 Intra-PE parallelism.
乘法器的并行化主要对应于CP(笛卡尔积)的过程,其可以最大化spatial reuse。
每次从weightbuffer取出F个weights的向量,从input buffer取I个activation的向量。输入到一个FxI的乘法器array,即两两相乘。每个乘法器的输出,通过并行计算的坐标信息,输出累加到对应的Psum上(即找到对应的accu buffer的位置)
可以带来两个好处:(1)每个w被I个activation重用(通过广播结构),每个activation被F个w重用;(2)每一个乘法输出的psum都是有用的(?),不需要额外的访存和计算
3.1.2 Inter-PE parallelism.
PT(PlanarTiled)对应于PE间的并行化处理。通过将每个大小为WxH的activation拆分成WtxHt的小tile,均摊到每一个PE中。每个PE含有C个channel,共CxWtxHt个数据。
Halo:但是卷积的操作模式,会导致在跨tile的过程中,边缘的数据分布在不同的PE中,所以
有话要说...