Note:SNAP

概述:

本文分析了已有的神经网络加速器,并对其进行了分类:

  • 按照数据加载方式:channel-first、channel-last

  • 按照对稀疏性的支持:A、W/A、W

SNAP属于channel-first,W/A,其压缩非零格式的数据并以数值-索引的格式输入。

文中还提出了神经网络加速器在设计中面临的主要问题:

  1. 乘法器(阵列)的利用率

  2. 数据通路的冲突和内存访问争用

  3. 卷积结构的变化

两种数据加载顺序:

  • channel-first:

![](file:///C:/Users/Jingyu_Li/AppData/Roaming/marktext/images/2022-09-20-16-38-15-image.png?msec=1667047358569)

数据按通道顺序排序,图b、c中展示了数据压缩的格式。一般来说,压缩的一个数据束越大越有利于提高利用率和计算效率,但是应该保证同一束中的激活在同一位置上(行列)。

这样做,完成一次计算之后,将中间结果写入时,访存争用较小。

  • channel-last:

![](file:///C:/Users/Jingyu_Li/AppData/Roaming/marktext/images/2022-09-20-16-32-33-image.png?msec=1667047358568)

这种方式的弊端在于PSUM在写入OFM-MEM时对于同一地址的争用较为频繁,尤其是在稀疏度不足时。

数据-索引匹配机制

本文使用了一种索引匹配的结构AIM,用于从输入的数据束中分离出匹配的激活-权重对。

![](file:///C:/Users/Jingyu_Li/AppData/Roaming/marktext/images/2022-09-20-21-04-32-image.png?msec=1667047358567)

前端比较器用于对比激活和权重的通道信息,有匹配的通道就将valid-pos标志位的valid位置一,代表数据匹配,并记录对应数据在激活数据束中的位置。

产生valid-pos标志位后,将其送入sequence decoder,得到相应的权重和激活。由于1个PE中只包含三个乘法器,因此sequence decoder也只有三路数据输出。![](file:///C:/Users/Jingyu_Li/AppData/Roaming/marktext/images/2022-09-20-21-37-15-image.png?msec=1667047358568)AIM中比较器阵列的数量需要trade off,既需要足够多的数量来保证同时生成的激活-权重对,也要考虑由此带来的功耗、面积提升的问题。经过测试,32x32是比较合适的。

两级部分和合并机制

  • PE内部,通道维度上的合并

PE的结构如下图所示:

![](file:///C:/Users/Jingyu_Li/AppData/Roaming/marktext/images/2022-09-20-21-45-30-image.png?msec=1667047358562)

同时进行运算的三对数据来自于同一个数据束,根据数据束打包的方式,乘法器计算产生的PSUM的存放地址有下列四种情况:

![](file:///C:/Users/Jingyu_Li/AppData/Roaming/marktext/images/2022-09-20-21-48-56-image.png?msec=1667047358556)

这四种情况由reduction ctrlor根据计算出的地址决定

  • 内核中(PE间)像素维度上的合并

对于常规卷积的运算:

col = 0、1、2的权重被广播到PE阵列的各列上,(h,w)=(2,2)、(2,3)、(2,4)的激活数据被广播到各行中。这样,处在对角线位置上的PE产生的数据对应的存储地址是相同的。

对于FC层和PW卷积来说也是类似的,只不过是处在同一行上的PE的输出数据对应的地址相同。

![](file:///C:/Users/Jingyu_Li/AppData/Roaming/marktext/images/2022-09-20-21-59-13-image.png?msec=1667047358572)

这样的机制可以在计算完成后就合并大量部分和,减少访存的次数和争用情况。

芯片的评估

![](file:///C:/Users/Jingyu_Li/AppData/Roaming/marktext/images/2022-09-20-22-05-47-image.png?msec=1667047358568)

芯片中包含激活和权重buffer、全局累加器(用于计算最终的部分和)、计算核以及控制器。片上共计集成了252个16bit 的乘法器和280.6kB的SRAM。

值得注意的是:每个AIM在三个PE之间时分复用。

文中首先使用一个采用channel-last数据流的加速器和SNAP运行稀疏的Resnet-50模型,并将这两者运行的结果与仅支持稠密计算的加速器的运行速度对比:

![](file:///C:/Users/Jingyu_Li/AppData/Roaming/marktext/images/2022-09-20-22-13-07-image.png?msec=1667047358556)

很显然,SNAP的数据流是有优势的,但是随着层数加深,这种优势不再明显。

原因有二:

(1)越深层的网络稀疏度越高,其在输出时导致的访存争用越少,这样channel -first数据流的优势就不再明显了

(2)越稀疏的网络结构,越容易导致各个核、PE之间的工作负载不平衡,这对于索引匹配和部分和合并都有影响。

通俗的讲工作负载不平衡还容易导致工作少的PE的等待工作多的PE。

要解决这样的问题,可以在进行计算前采取更加激进的预处理措施,降低数据的不规则度,也可以适当增大OFM buffer。

文中还将SNAP与之前一些优秀的设计进行了对比:

![](file://C:\Users\Jingyu_Li\AppData\Roaming\marktext\images\2022-09-20-22-21-53-image.png?msec=1667047358569)

总的来说,channel-first 的机制对于解决访存争用的问题很有效,而channel-last 的方案在工作负载不平衡的情况下则有更好的表现。

posted @ 2022-10-29 20:47  JerryLiF  阅读(83)  评论(0)    收藏  举报