FPGA也能做RNN!

原创内容,转载请注明:  [http://www.ssdfans.com]  谢谢!

作者 琥珀

导言:循环神经网络(RNNs)具有保留记忆和学习数据序列的能力。由于RNN的循环性质,难以将其所有计算在传统硬件上实现并行化。当前CPU不具有大规模并行性,而由于RNN模型的顺序组件,GPU只能提供有限的并行性。针对这个问题,普渡大学的研究人员提出了一种LSTM在Zynq 7020 FPGA的硬件实现方案,该方案在FPGA中实现了2层128个隐藏单元的RNN,并且使用字符级语言模型进行了测试。该实现比嵌入在Zynq 7020 FPGA上的ARM Cortex-A9 CPU快了21倍。

 

LSTM是一种特殊的RNN,由于独特的设计结构,LSTM适合于处理和预测时间序列中间隔和延迟非常长的重要事件。标准的RNN可以保留和使用最近的过去信息,但是不能学习长期的依赖关系。并且由于存在梯度消失和爆炸的问题,传统的RNN无法训练较长的序列。为了解决上述问题,LSTM添加了记忆控制单元来决定何时记住、遗忘和输出。LSTM的单元结构如图1所示。其中⊙代表element-wise的乘法。

 


图1

 

用数学表达式表示图1如图2所示。其中表示Sigmoid函数,是层的输入向量,是模型参数,是记忆单元激活值,是候选记忆单元门,是层的输出向量。下标表示前一时刻,就是相应的输入、遗忘和输出门。这些门决定何时记住或遗忘一个输入序列,以及何时输出。人们需要对模型进行训练,从而得到所需的输出参数。简单来说,模型训练是一个迭代过程,其中训练数据被输入,然后将得到的输出与目标进行比较。模型通过BP算法进行训练。由于添加了更多的层和更多的不同的功能,模型可以变得相当复杂。 对于LSTM,每个模块有四个门和一些element-wise的操作。 深层LSTM网络具有多个LSTM模块级联,使得一层的输出是下一层的输入。


图2

 

了解完了LSTM的特性后,如何设计LSTM在FPGA上的实现呢?下面我们来看一下实现方案。

 

1)硬件

 

硬件实现的主要操作就是矩阵向量乘法和非线性函数。

 

矩阵向量乘法由MAC单元计算, MAC单元需要两个流:输入向量流和加权矩阵的行向量流。将相同的矢量流与每个权重矩阵行相乘并累加,以产生与权重矩阵的高相同尺寸的输出向量。在计算每个输出元素之后,MAC被重置以避免累积先前的矩阵行计算。可以通过向权重矩阵的最后一列添加偏置向量来将偏置b添加到乘法累加中,同时为输入向量增加一个额外的单位值。这样就不需要为偏置添加额外的输入端口,也可以向MAC单元添加额外的预配置步骤。 将MAC单元的结果加在一起。加法器的输出是一个元素的非线性函数,它是用线性映射来实现的。

 

非线性函数被分割成线性y = ax + b,其中x限于特定范围。在配置阶段,a,b和x范围的值存储在配置寄存器中。每个线性函数段用MAC单元和比较器实现。输入值与线性范围之间的比较决定是处理输入还是将其传递给下一个线性函数段模块。非线性函数分为13个线段,因此非线性模块包含13个流水线段模块。 实施设计的主要组成部分是如图3所示的门模块。

 


图3

 

实现模块使用直接存储访问(DMA)端口来进行数据的读入或写出。由于DMA端口是独立的,因此即使模块同时激活端口,输入流也不会同步。因此,需要流同步模块。该同步块用来缓存一些流数据,直到所有端口都是流式传输。当最后一个端口开始传输时,同步块开始输出同步流。这样就能确保到MAC单元的向量和矩阵行元素对齐。另外,图3中的门模块还包含一个将32位值转换为16位值的重分区块。MAC单元执行16位乘法,产生32位值。然后使用32位值执行加法以保持精度。

 

图2中的公式1,2,3,4都能用上述模块实现,剩下的只是计算公式5和6的一些element-wise的运算。为此,方案引入了如图4所示的包含额外的乘法器和加法器的模块。

 


图4

 

最终形成的实现LSTM的方案如图5所示。该方案使用图3中的三个模块和图4中的一个。门被预配置为具有非线性函数(tanh或S形)。内部模块由状态机控制以执行一系列操作。实现的设计使用四个32位DMA端口。由于操作以16位完成,每个DMA端口可以传输两个16位流。权重和连接在主存储器中以利用该特征。然后根据要执行的操作将流路由到不同的模块。

 


图5

 

2)驱动软件

 

控制和测试软件用C代码实现。该软件将权重值和输入向量放入主存储器,并使用一组配置寄存器控制硬件模块。权重矩阵的每行结尾是相应的偏置值。输入向量包含一个额外的单位值,使得矩阵向量乘法仅添加矩阵行的最后一个元素。零填充用于匹配矩阵行尺寸和向量尺寸,这使流同步更容易。

 

由于LSTM的循环性质,每次循环ch都被覆盖。这样做可以最大限度地减少CPU完成的内存复制次数。为了实现多层LSTM,将上一层的输出复制到下一层的位置,以便在层之间保留以进行错误度量。此外,控制软件还需要通过在控制寄存器中设置不同的存储位置来更改不同层的权重。

 

实验和实验结果

 

实验实现了一个字符级语言模型,它预测了给定前一个字符的下一个字符。根据字符,模型生成一个看起来像训练数据集的文本,它可以是一本书或大于2 MB字的大型互联网语料库。本实验选取莎士比亚的一部分作品进行了训练。实验实现了一个隐藏层大小为128的2层LSTM模型。

 

该方案在包含Zynq-7000 SOC XC7Z020的Zedboard上实现。它包含双ARM Cortex-A9 MPCore,该实验采用的C代码LSTM的实现在Zedboard的双ARM Cortex-A9处理器上运行,时钟频率为667 MHz。在FPGA上的实现运行的时钟频率为142 MHz的。芯片总功率为1.942 W,硬件利用率如表1所示。

 


表1

 

图6展示了不同嵌入式平台上的前馈LSTM字符级语言模型的执行时间,时间越越好。我们看到,即使是在142MHz的时钟频率下,该实现依然比嵌入在Zynq 7020 FPGA上的ARM Cortex-A9 CPU的实现快了21倍。

 


图6

 

图7展示了不同嵌入式平台的单位功耗性能(值越大表示性能越好)。从图中结果可以看出,FPGA的实现单位功耗性能远超其他平台,这进一步说明了FPGA实现的优越性。

 


图7

引用:

Recurrent Neural Networks Hardware Implementation on FPGA, Andre Xian Ming Chang, Berin Martini, Eugenio Culurciello

分类目录 人工智能, 其他.
扫一扫二维码或者微信搜索公众号ssdfans关注(添加朋友->点最下面的公众号->搜索ssdfans),可以经常看到SSD技术和产业的文章(SSD Fans只推送干货)。
ssdfans微信群介绍
技术讨论群 覆盖2000多位中国和世界华人圈SSD以及存储技术精英
固件、软件、测试群 固件、软件和测试技术讨论
异构计算群 讨论人工智能和GPU、FPGA、CPU异构计算
ASIC-FPGA群 芯片和FPGA硬件技术讨论群
闪存器件群 NAND、3D XPoint等固态存储介质技术讨论
企业级 企业级SSD、企业级存储
销售群 全国SSD供应商都在这里,砍砍价,会比某东便宜20%
工作求职群 存储行业换工作,发招聘,要关注各大公司招聘信息,赶快来
高管群 各大SSD相关存储公司高管和创始人、投资人

想加入这些群,请微信扫描下面二维码,或搜索nanoarchplus,加阿呆为微信好友,介绍你的昵称-单位-职务,注明群名,拉你进群。SSD业界需要什么帮助,也可以找阿呆聊。