一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种基于稀疏向量矩阵计算的神经网络加速器及加速方法与流程

2021-10-24 07:04:00 来源:中国专利 TAG:向量 人工智能 稀疏 矩阵 芯片


1.本发明涉及人工智能芯片技术领域,尤其是涉及一种基于稀疏向量矩阵计算的神经网络加速方法。


背景技术:

2.神经网络在计算机视觉、语音识别和自然语言处理等应用无处不在。随着神经网络的发展,神经网络的模型越来越大,神经网络的运算量越来越大,同时产生的功耗也越来越大。神经网络的计算主要集中在卷积层和全连接层的乘加运算,但是对于乘加运算,零值的参与是不影响最终的运算结果。神经网络的模型有大量的零值运算,如果可以跳过零值的运算,就可以减少大量的运算,降低运算带来的功耗。但是跳过零值的运算,使得神经网络的运算不规则性,为了处理不规则稀疏数据格式和加速神经网络的计算,本文提出了一种基于稀疏向量矩阵计算的神经网络加速方法。


技术实现要素:

3.针对现在技术中存在的问题,本发明提供一种基于稀疏向量矩阵计算的神经网络加速方法,针对神经网络非零值数据的计算,减少访问,减少神经网络的计算量,有效处理好稀疏数据格式,加速神经网络的计算,同时来降低所产生的能耗。
4.一种基于稀疏向量矩阵计算的神经网络加速器,包括多个稀疏向量矩阵计算单元,所述的稀疏向量矩阵计算单元包括激活队列fifo、地址读取单元、稀疏权重sram、算术运算单元、输出缓存模块、relu模块以及非零数据检测单元。
5.非零数据检测单元用于对激活数据的检测,过滤掉零值激活数据,非零数据检测单元往激活队列fifo中广播数据,经过非零数据检测单元的处理,得到的非零值激活数据以及激活数据的列索引j。
6.激活队列fifo用于缓存非零数据检测单元检测出来的非零激活数据以及对应的激活数据的列索引,用于处理pe负载不均衡问题。
7.地址读取单元包含两个sram,分别是sram0和sram1,分别存储的是csc数据压缩得到的指针p
j
和p
j 1
,p
j 1
和p
j
的差值等于当前激活数据需要从稀疏权重矩阵中读取的权重数据个数。p
j 1
和p
j
会根据相应的逻辑产生相应的权重数组读取地址,从稀疏权重sram中读取相应的权重数据数组。
8.稀疏权重sram存储的是csc压缩得到的权重数组{w,z},w代表权重数据,z代表当前权重数据处于稀疏权重矩阵的行数,w和z分别用8bit数据表示的。稀疏矩阵sram根据地址读取单元计算出来的权重数组读取地址去读取出相应权重数组。
9.算术运算单元是负责激活数据和权重数据的乘加运算,输出给输出缓存模块,根据z将相应数据累加到相应位置。
10.输出缓存模块用于负责存储计算完成的激活数据,作为下一层神经网络的输入激活数据;
11.relu模块用于对激活数据的非线性运算,把小于零值的数据变换为零值。
12.一种基于稀疏向量矩阵计算的神经网络加速方法,步骤如下:
13.步骤(1)、稀疏权重数据压缩;
14.通过csc稀疏数据压缩算法对神经网络的权重数据进行压缩,得到非零值权重数组。
15.首先将神经网络的权重数据按照输入通道的方向排布成列向量,csc数据压缩算法按照列进行压缩。对于列向量i=[a1,a2,a3,...,an],利用csc稀疏数据压缩算法去除列向量中的零值,得到w向量,根据w向量中每个非零权重数据处于哪一行得到当前权重数据处于稀疏权重矩阵的行数,假设列向量i=[0,0,1,3,0,0,0,2],利用csc稀疏数据压缩算法得到w=[1,3,2],z=[2,3,7],w代表权重列向量中数据,z代表当前权重数据处于列向量的哪一行(列向量从第0行开始算起)。对于多个列向量构成的权重矩阵,每列都通过csc数据压缩算法进行压缩,同时产生列指针p,p代表权重数据处于每列第一个非零数据在w中的位置。
[0016]
步骤(2)、设计稀疏向量矩阵计算单元;
[0017]
所述的稀疏向量矩阵计算单元包括激活队列fifo、地址读取单元、稀疏权重sram、算术运算单元、输出缓存模块、relu模块以及非零数据检测单元。
[0018]
非零数据检测单元用于对激活数据进行检测,过滤掉零值激活数据,非零数据检测单元往激活队列fifo中广播数据,经过非零数据检测单元的处理,得到非零值激活数据以及激活数据的列索引j。
[0019]
激活队列fifo用于缓存非零数据检测单元检测出来的非零激活数据以及对应的激活数据的列索引j。激活队列fifo用于处理负载不均衡问题,因为广播的非零激活数据会和对应的权重数据进行乘加运算。当存在多个稀疏向量矩阵计算单元时,权重数据的稀疏性在稀疏权重sram中是不同的,所以不同的稀疏向量矩阵计算单元对于广播过来的激活数据运算所消耗的周期也是不同的。提前运算完的稀疏向量矩阵计算单元需要等待未完成的稀疏向量矩阵计算单元,才能更新非零激活数据以及对应的列索引。每个稀疏向量矩阵计算单元中有一个激活队列fifo,能够解耦合,完成稀疏向量矩阵计算单元的处理,处理负载不均衡问题,但是只要有一个激活队列fifo满了,就要停止广播非零激活数据。
[0020]
所述的地址读取单元包括两个sram,分别为sram0和sram1,分别存储csc数据压缩得到的指针p
j
和p
j 1
,p
j 1
和p
j
的差值等于当前激活需要从稀疏权重矩阵中读取的权重数据个数。然后根据p
j
和p
j 1
产生相应的权重数组读取地址,从稀疏权重sram中读取相应的权重数组。
[0021]
稀疏矩阵sram用于存储csc压缩得到的权重数组{w,z},w代表权重数据,z代表当前列向量中当前权重数据处于哪一行,w和z分别用8bit数据表示的。稀疏矩阵sram根据地址读取单元计算出来的权重数组读取地址去读取出相应权重数组。
[0022]
所述的算术运算单元负责激活数据和权重数据的乘加运算,将运算结果输出给输出缓存模块,然后根据z将相应数据累加到相应位置。
[0023]
所述的输出缓存模块用于负责存储计算完成的激活数据,作为下一层神经网络的输入激活数据,所述的relu模块用于对激活的非线性运算,将小于零值的数据变换为零值。
[0024]
步骤(3)、非零检测单元对激活数据进行检测,广播非零激活数据act以及其对应
的列索引j给激活队列fifo中,激活队列fifo将列索引j传输给地址读取单元计算出读取权重数组的地址,每个周期产生一个地址,地址进入稀疏权重sram中读取出相应的权重数组{w,z},算术运算单元根据z将相应运算结果累加到相应的位置,将运算结果输出给输出缓存单元,输出缓存单元存储的激活数据也作为下一层激活数据。relu模块将激活数据中的小于零的数据变换为0,在下一层计算时同样也是通过非零检测单元过滤掉零值数据,开始下一层的计算。
[0025]
本发明有益效果如下:
[0026]
采用上述方案后,本发明利用csc稀疏数据压缩算法和稀疏向量矩阵计算单元,减少了计算量和对外部存储器的访问,对神经网络的inference进行加速,可以提高cnn的实时性,实现了更高的计算性能,同时降低了能耗。
附图说明
[0027]
图1是本发明的csc稀疏权重矩阵压缩示意图;
[0028]
图2是本发明的激活队列fifo处理负载不均衡示意图;
[0029]
图3是本发明的地址读取单元结构示意图;
[0030]
图4是本发明的稀疏向量矩阵计算单元结构示意图。
具体实施方式
[0031]
下面结合附图和实施例对本发明方法进行进一步说明。
[0032]
本发明方法,具体步骤如下:
[0033]
步骤(1).通过csc压缩算法对稀疏权重矩阵进行数据压缩。
[0034]
csc压缩算法对训练好的稀疏权重矩阵进行数据压缩,只保留非零的权重数据,但是需要记录保留下来的数据的位置,所以增加了4bit o和16bit的指针。csc稀疏权重矩阵压缩如图1所示,对于图中4x8的矩阵来说,里面存放的是一个个权重数据,权重数据有零值也有非零值。利用csc稀疏矩阵压缩算法,将4x8的矩阵中的32个数据压缩为10个数据,去掉了零值数据,只保留非零数据,因为神经网络在计算过程中零值数据的参与不会影响运算的结果。利用csc稀疏矩阵压缩算法可以只传输有效的数据,充分利用带宽,同时每个非零权重数据会产生相应的z和列指针p。如图1所示,csc稀疏权重压缩得到的有效信息为w,z,p三个变量,其中w表示的非零权重数据,z表示非零权重数据处于哪一行。列指针p是权重矩阵每列中的第一个非零权重数据在w中的位置,如红色0代表的是第0列中w
0,0
在w变量中的位置是0,黑色2代表的是第1列中w
3,1
在w变量中的位置是2,依次类推得到其他的p变量。p
j 1
和p
j
的差值对于当前激活需要从稀疏权重矩阵中某一列读取的权重数据个数,如p0和p1的差值是2

0=0,所以当前列中的有效权重数据个数是2,也就是w
0,0
和w
2,0
。从图1中看出,第3列(j=3)中权重数据都是零值,有效数据个数是0,对于的p3=4,p4=4,p4和p3的差值为0,即代表当前列中的非零权重数组个数是0个。
[0035]
步骤(2).设计稀疏向量矩阵计算单元;
[0036]
如图2所示,稀疏向量矩阵计算单元包括激活队列fifo、地址读取单元、稀疏权重sram、算术运算单元、输出缓存模块、relu运算以及非零数据检测单元。
[0037]
激活队列fifo缓存非零数据检测单元检测出来的非零激活数据以及对应的激活
数据的列索引。激活队列fifo是为了处理pe负载不均衡问题。
[0038]
非零数据检测单元是对激活数据的检测,过滤掉零值激活数据,非零数据检测单元往激活队列fifo中广播数据,经过非零数据检测单元的处理,得到的非零值激活数据以及激活数据的列索引j。
[0039]
地址读取单元包含两个sram,分别是sram0和sram1,分别存储的是csc数据压缩得到的指针p
j
和p
j 1
,p
j 1
和p
j
的差值对于当前激活需要从稀疏权重矩阵中读取的权重数组个数。p
j 1
和p
j
会根据相应的逻辑产生相应的权重数组读取地址,从稀疏权重sram中读取相应的权重数组。
[0040]
稀疏权重sram存储的是csc压缩得到的权重数组{w,z},w代表权重数据,z代表当前权重数据处于稀疏权重矩阵的行数,w和z分别用8bit数据表示的。稀疏矩阵sram根据地址读取单元计算出来的权重数组读取地址去读取出相应权重数组。
[0041]
算术运算单元是负责激活数据和权重数据的乘加运算,输出给缓存模块,根据z将相应数据累加到相应位置。
[0042]
输出缓存模块是负责存储计算完成的激活,作为下一层神经网络的输入激活,relu模块进行对激活的非线性运算,把小于零值的数据变换为零值。
[0043]
稀疏向量矩阵计算单元具体工作方法如图2所示:
[0044]
非零检测单元对激活数据进行检测,广播非零激活数据act以及其对于的列索引j给激活队列fifo中,激活队列fifo将列索引j传输给地址读取单元计算出读取权重数组的地址,每个周期产生一个地址,地址进入稀疏权重sram中读取出相应的权重数组{w,z},算术运算单元根据z将相应运算结果累加到相应的位置,将运算结果输出给输出缓存单元,输出缓存单元存储的激活数据也作为下一层激活数据。relu模块将激活数据中的小于零的数据变换为0,在下一层计算时同样也是通过非零检测单元过滤掉零值数据,开始下一层的计算。
[0045]
激活队列fifo处理负载不均衡如图3所示,在没有激活队列fifo的情况下,权重数组的稀疏性在稀疏权重sram中是不同的,所以不同的稀疏向量矩阵计算单元对于广播过来的激活数据运算所消耗的周期也是不同的。提前运算完的稀疏向量矩阵计算单元需要等待未完成的稀疏向量矩阵计算单元,才能更新非零激活数据以及对应的列索引。就如图3(a)所示,每个稀疏向量矩阵计算单元pe计算完当前列中权重数据所花费的周期是不一样的,所以需要等待最慢的那个pe计算完,才能更新激活以及其列索引j。所以列1花费的时间是pe1,就是计算花费时间最多的那个pe,列2花费最多的时间是pe3,这样子带来了负载不均衡。
[0046]
如图3(b)所示,激活队列fifo是为了处理负载不均衡问题,因为广播的非零激活会和对应的权重数据进行乘加运算。如果有多个稀疏向量矩阵计算单元,每个稀疏向量矩阵计算单元中有一个激活队列fifo,可以解耦合,不需要关注其他pe有没有完成,这样可以处理负载不均衡问题,但是要注意是只要有一个激活队列fifo满了,就要停止广播非零激活数据。
[0047]
如图4所示,地址读取单元中包含两个sram,分别是sram0和sram1,里面存储的csc稀疏权重矩阵压缩得到p变量,根据激活队列广播出来激活数据的列索引j,从两个sram中读取两个数据,并且产生相应的地址。图4中的j=0,此时从sram0和sram1中读取0和2这两
个数据,也就是p
j 1
=2和p
j
=0。对于读取出来的p
j 1
和p
j
会根据相应的组合逻辑产生地址信息,分别是地址0和地址1,供稀疏权重sram读取权重数组。若j=1的话,从两个sram中分别读取出2和3,产生的地址信息是地址2,所以会从稀疏权重矩阵中读取一个权重数组。p
j 1
和p
j
的差值对于当前激活需要从稀疏权重矩阵中读取的权重数据个数,如果之间的差值为0的话,如图4中的p
j 1
=4和p
j
=4,那么不需要从稀疏权重sram中读取权重数组。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献

  • 日榜
  • 周榜
  • 月榜