MLP_Conv2D 是功能齐全的设计,可将 2D 输入图像与多个内核同时进行卷积。 该设计充分利用了 MLP 和 BRAM 模块,每个 MLP 一个周期执行 12 个 int8 乘法。此外,MLP 列和 BRAM 块均等级联以有效地将图像数据传递,从而允许同时处理多个内核。

 

该设计使用 NoC 接入点(NAP)从片上网络(NoC)读取或写入数据。NoC 连接到 Speedster7t 器件中的 GDDR6 控制器再到外部存储器。

 

AlexNet

尽管最初为 AlexNet 图像和内核大小配置了 MLP_Conv2D 设计,但是 2D 卷积是一个通用过程,因此可以重新配置该设计并使其适应许多不同的 2D 方法。

 

2D 卷积的一般原理是在图像(实际上是另一个 2D 矩阵)上传递内核(2D 矩阵)。对于每次计算,内核均以输入图像的像素为中心,并对每个内核值(称为权重)与其当前对齐的像素执行乘法运算。这些乘法的总和给出了原始图像像素的特定卷积结果。然后将内核移至下一个像素,并重复该过程。

 

经过训练的内核,2D 卷积生成一个输出结果图像,突出显示输入图像的特定特征,例如垂直线,水平线,变化角度的对角线和变化半径的曲线。然后可以将这些特征输入到其他处理层(包括其他 2D 卷积),然后可以将其标识为(通常在软件中)为特定对象。

 

因此,二维卷积处理不应被视为图像识别的完整解决方案,而应被视为处理操作链中的单个关键组件。

 

乘法密度

2D 卷积的挑战是所需的乘法数量,这就是 MLP 中专用的乘法器阵列。对于 AlexNet 配置,每个内核为 11×11= 121 个权重值。但是,卷积实际上是 3D 的,因为输入图像具有三层(RGB),因此一组内核有 121×3 = 363 个乘法来产生单个输出结果。AlexNet 输入图像为 227×227;但是,此图像的 stride 为 4(在计算之间内核移动了四个像素)。此过程导致输出结果矩阵为 54×54 = 2916 个结果。因此,对于一幅图像需要 363×2916 = 1,058,508 次乘法;即处理一个图像需要进行一百万次以上的累加运算。其中单个 Kernel 进行 2D 卷积的动态示意图如下:

 

图表 1 单个 Kernel 进行 2D 卷积的动态示意图

 

对于 MLP_Conv2D,其设计旨在一次处理一幅图像中的 60 个内核,单次执行超过 6000 万次乘法累加操作。

 

性能

MLP_Conv2D 设计可以以 750 MHz 的频率运行。单个 MLP 能够在 137 µs 内对具有 11×11 内核的单个 227×227 RGB 输入图像进行卷积,相当于每秒 15.4GOPS(包含乘和加)。 但一个 MLP_Conv2D 实例由 60 个并行运行的 MLP 构成,可以同时对 60 个输入图像进行卷积,相当于 924GOPS。 最后,将多达 40 个 MLP_Conv2D 实例化到单个器件中,每个实例都通过自己的 NAP 将数据传输到 GDDR6 存储器,从而实现了组合高达 37 TOPS 的性能 - 相当于每秒处理 28,8000 张图像(本设计主要针对卷积核)。

 

资源

MLP_Conv2D 围绕 MLP 和 BRAM 块功能而设计,并使用它们各自的内部级联走线。 同样,NAP 允许直接从外部存储器路由数据互联。这些功能可实现最小的附加逻辑或路由要求,利用率表如下:

 

图表 2 单个 MLP_Conv2D 实例资源使用

 

图表 3 并行 40 个 MLP_Conv2D 实例资源使用

 

图表 4 MLP_Conv2D 框图

 

数据流:单个 MLP

每个 MLP 都有一个邻近的 BRAM。 在此设计中 BRAM 用于存储内核并将其多次传递到 MLP。 初始化时,将从输入 NAP 中读取不同的内核,并将其写入相应的 BRAM。 BRAM 在写侧配置为 72 位,而读取设置为 144 位。在操作期间,仅将 96 位用作内核权重,即读取为 4 个权重×3 层×8 位。初始图像数据从 NAP 读取到输入 FIFO 中,该输入 FIFO 用于将图像存储为一系列行。尽管此输入存储器被列为 FIFO,但仍可作为可重复读取的 FIFO,因为可以多次从中读取行。该存储器配置为 144 位宽,仅使用 96 位,由两个 BRAM72K 组成。每个字由 4 个像素×3 层×8 位组成。初始化时,将读取足够的行以匹配内核中的行数加上垂直跨步所需的行数。即

 


一旦加载了初始数据和内核,便开始计算。

 

从输入 FIFO 中读取第一条图像行,并读取与内核水平大小匹配的图像数据像素数量。在读取这些像素时,将读取匹配的内核权重。MLP 将这些 96 位流的每一个乘以 12 个 int8 值并累加结果。输入 FIFO 前进到第二行,重复此过程,直到内核的所有行都与输入图像左上角的适当像素相乘。在此过程中,MLP 积累了结果;现在,该结果是图像与内核卷积的左上角的 2D 卷积。该结果以 16 位结果的形式从 MLP 输出。重复此过程,输入 FIFO 跨行超前 STRIDE 参数设置的像素数(对于当前设计,STRIDE 固定为 4)。在每个处理周期包括在内时,都会生成另一个结果,直到水平地获取了适当数量的结果为止。

 

然后,将输入 FIFO 下移 STRIDE 行数,然后重复该过程以生成输入图像中下一组线的卷积结果。当输入 FIFO 向下移动时,不再需要 FIFO 中的初始行,因此与 MLP 计算并行时,将加载下一组用于输入图像的 STRIDE 行。考虑外部存储源的带宽要求时,可以看到映像和内核仅从内存中读取一次。然后,它们可以从各自的 BRAM 中重新使用,从而减少了外部存储器带宽的总体负担,其过程参考图表 1。

 

数据流:多个 MLP

MLP 的一个显著特点是能够将数据和结果从一个 MLP 或 BRAM 级联到同一列中。 MLP_Conv2D 通过将 MLP 及其关联的 BRAM 放在列组中来利用这些级联路径。在将 BRAM 加载到内核时,级联路径用于将数据流水线传输到每个 BRAM,并且使用 BRAM 块地址模式选择要写入内核的 BRAM。

 

在计算过程中,输入的图像数据将在 MLP 的列中级联,以便每个 MLP 在其下一个邻居之后的一个周期接收到图像数据。同时,控制内核读取的 BRAM 读取地址以一个周期的延迟级联到 BRAM 列中。这样,每个 MLP 在其先前的 MLP 之后一个周期接收相同的图像数据和相同的内核读取地址。每个 MLP 的计算差异在于,其关联的 BRAM 将具有不同的内核数据。结果是一个图像并行地与多个内核卷积。并行卷积的数量称为 BATCH。

 

数据流:计算结果

如前所述,每个 MLP 为内核和图像部分的每个卷积生成 16 位结果。

 

MLP 排列在 16 列中,因此从该列中生成一个 256 位字,该字由该列中每个 MLP 的结果组成。然后将此 256 位字写入输出 NAP。 这种安排导致卷积结果作为同一图像的图层存储在内存中;因此,当三层或 RGB 存储在单个输入字中时,匹配输入字排列。

 

然后,由于可以在完整的 256 位结果上的 16 个并行实例中执行激活功能,因此该安排允许将涉及的结果并行处理到激活层中。同样,一旦 256 位结果通过输出 NAP 写回到存储器中,则可以将结果读回到另一个 2D 卷积电路中。

 

图表 5 MLP_Conv2D 布局示意图

 

布局

在 Speedster7t 架构中,每个 NAP 对应 32 个 MLP。该设计经过优化,可使用两个 NAP,一个用于读取,一个用于写入,因此可以对应 64 个 MLP。

 

但是,输入和输出 FIFO 需要两个 BRAM 72K 存储块才能创建一个 256 位宽的组合存储器。因此,这些存储器将消耗 64 个可用位置中的四个用于数据 I / O。

 

设计被安排为使用与两个 NAP 相关联的四列 MLP。但是,第一列和最后一列都使用 14 个 MLP,剩下两个 MLP 位置分别用于输入和输出 FIFO。中间两列使用所有 16​​个可用的 MLP。在平面图中,各列的排列方式是使第一列(底部具有输入 FIFO 存储器)与 NAP 相邻,以改善时序。

 

下面显示了一个实例,即使用了 60 个 MLP(Batch=60)的设计实际布局图(突出显示了路线):

 

图表 6 60 个 MLP 布局图

 

在全芯片构建中使用 40 个实例时,尽力使每个实例都使用 NAP 与内存进行通信。结果,FMax 仍能达到 750MHz,并使用掉芯片中的所有 80 个 NAP 以及 94%的 MLP 和 BRAM72K。

 

图表 7 2400 个 MLP 布局图

 

下一期将举例介绍 MLP 的浮点架构和性能,敬请期待。