Eyeriss中的RS(行固定)数据流

Eyeriss中的RS(行固定)数据流

Eyeriss想必大家都读过,但是你在第一次读v1的时候可能并不清楚他所讲的RS数据流具体是什么样的。笔者在这里专门对Eyeriss v1中的RS(行固定)数据流进行详细举例说明。

原文中有关RS数据流的部分:
“Eyeriss: An Energy-Efficient Reconfigurable Accelerator for Deep Convolutional Neural Networks”中的第四段。
“Eyeriss: A Spatial Architecture for Energy-Efficient Dataflow for Convolutional Neural Networks”中的第V部分。

原文中有关RS数据流的图如下:
Eyeriss中的RS(行固定)数据流_第1张图片
Eyeriss中的RS(行固定)数据流_第2张图片

第一次看到原文中的描述和这几张图片笔者一脸懵逼,这数据到底是怎么流动的呢?
于是笔者亲自拿出笔纸写写画画,终于大致搞明白了PE中的数据流。在这里分享给需要了解RS数据流的人。

卷积运算大家应该都清楚,这里不必赘述。接下来直接上干货。

1D Convolution Primitives

首先对于原文中的“1D Convolution Primitives”的操作,它是把2D卷积分解成一行一行的卷积来算。每个PE里面装权重的一行和输入特征的一行,然后权重的一行和输入特征的一行进行一维卷积。举个例子:

输入特征矩阵D:

[01,02,03,04,05,06]
[07,08,09,10,11,12]
[13,14,15,16,17,18]
[19,20,21,22,23,24]
[25,26,27,28,29,30]

权重矩阵W:

[50,51,52]
[53,54,55]
[56,57,58]

对于上面的矩阵怎么用“1D Convolution Primitives”操作呢,“1D Convolution Primitives”的操作就是将D矩阵的一行和W矩阵的一行进行一维卷积。

[01,02,03,04,05,06]和[50,51,52]进行一维卷积:

  • [50,51,52]首先和[01,02,03,04,05,06]中前三个元素进行卷积,产生一个结果为50×01+52×02+53×03=313;
  • 然后[50,51,52]向右移动并计算,最终产生结果[313,464,614,772]。

这就是一次“1D Convolution Primitives”的操作。
Eyeriss中的RS(行固定)数据流_第3张图片

将例子对比与上图,其中的“绿色块1”就对应权重矩阵W的第一行:[50,51,52],“蓝色块1”就代表输入特征矩阵D的第一行:[01,02,03,04,05,06],“Op1”代表一次“1D Convolution Primitives”的操作。其中“Op1”操作只完成了一组一维卷积,对于3×3的权重矩阵W,需要三个Op,也就是完成三组一维卷积,在“Op3”完成的时候才能产生输出特征矩阵的第一行“红色块1”。

Eyeriss论文中说这个操作是在一个PE中完成的,也就是说,做此操作的一个PE里面暂存的数据有:D矩阵的一行和W矩阵的一行,在本次例子里是[01,02,03,04,05,06]和[50,51,52]。

logical PE set (逻辑PE集)

了解完“1D Convolution Primitives”的操作后,接下来就是RS数据流了。

对于RS数据流,论文讲了Logical Mapping(逻辑映射)和Physical Mapping(物理映射),逻辑映射讲了RS数据流是什么,数据怎么流动,而物理映射则是讲RS数据流在芯片上的物理实现。笔者这里只讲逻辑映射,因为这篇文章主要是为了让大家明白RS数据流的数据流动方式。

RS数据流需要 logical PE set (逻辑PE集,后面简称PE集),图6中的PE集是3×3规模的。实际上,PE集的规模是根据输入特征矩阵、权重矩阵、输出特征矩阵的规模而定的。如笔者上面举的例子,输入特征矩阵是5×6的,权重矩阵是3×3的,那么可知输出特征矩阵是3×4的。PE集的高应该为权重矩阵的高3,PE集的宽度应该为输出特征矩阵的高度3。那么对于笔者上面举的例子,其PE集的规模应该为3×3。

PE集的规模确定后,接下来就是怎么在这个3×3的PE集中实现RS数据流了。

RS数据流

话不多说,直接上例子,利用RS数据流计算矩阵D与矩阵W的卷积。

输入特征矩阵D:

[01,02,03,04,05,06]
[07,08,09,10,11,12]
[13,14,15,16,17,18]
[19,20,21,22,23,24]
[25,26,27,28,29,30]

权重矩阵W:

[50,51,52]
[53,54,55]
[56,57,58]

由以上两个矩阵确定的PE集规模为3×3。

将D矩阵和W矩阵按行分块。

则D=

[D0]
[D1]
[D2]
[D3]
[D4]

W=

[W0]
[W1]
[W2]

3×3PE集:
Eyeriss中的RS(行固定)数据流_第4张图片
T=0:(注意:这里每个T代表一次“1D Convolution Primitives”的操作的时间和各行之间部分和累加的时间之和,包含了多个clk)
D矩阵的每一行和W矩阵的每一行放到对应位置,准备送往PE集。
Eyeriss中的RS(行固定)数据流_第5张图片
T=1:
W矩阵和D矩阵的各行送往PE集,每个PE内进行“1D Convolution Primitives”的操作,然后三个PE产生的部分和向上累加,产生输出特征矩阵P的第一行P1。

图中有颜色的箭头代表在此T内有相应的数据传输。

请注意:图中PE内的“ * ”操作是一维卷积操作,例如“D0*W0”,是D矩阵的第一行D0与W矩阵的第一行W0进行一维卷积,即[01,02,03,04,05,06]与[50,51,52]进行“1D Convolution Primitives”的操作,产生部分和为[313,464,614,772],是一个4维行向量,P1是三个这样的行向量相加的结果,P1也是一个4维行向量,它是输出特征矩阵的第一行。
Eyeriss中的RS(行固定)数据流_第6张图片
T=2:
D矩阵的各行沿着对角线方向向右上转递,W矩阵的各行向右转递,W的行和D的行在PE内两两相遇时,则在PE里进行“1D Convolution Primitives”的操作。如下图,产生部分和向上累加,产生输出特征矩阵P的第二行P2。
Eyeriss中的RS(行固定)数据流_第7张图片
T=2:
D矩阵的行继续向右上转递,W矩阵的各行继续向右转递,在PE里进行“1D Convolution Primitives”的操作。产生部分和向上累加,产生输出特征矩阵P的第三行P3。
Eyeriss中的RS(行固定)数据流_第8张图片
到这里就计算完了。
最终得到输出特征矩阵P=

[P1]
[P2]
[P3]

上例就是单次矩阵卷积如何利用RS数据流进行计算。

利用RS进行连续的卷积运算就是不停的有W和D传输到PE集内,然后每个T内每个PE内都有一维卷积操作。相信大家明白了怎么用RS进行单次卷积后,利用RS进行连续的卷积运算就不难办了。

以上是笔者对Eyeriss中提出的RS数据流的讲解,希望对大家有帮助。

你可能感兴趣的:(神经网络处理器,神经网络,深度学习,卷积神经网络)