您现在的位置是:首页 > 数字电源 > 技术解析

FPGA也能做RNN

时间:2017-09-13 来源:

导言:循环神经网络(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

用数学表达式表示图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

 

图3

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

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

 

图4

 

图4

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

 

 

图5

2)驱动软件

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

由于LSTM的循环性质,每次循环c和h都被覆盖。这样做可以最大限度地减少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

 

表1

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

 

图6

 

图6

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

 

 

图7

换一批

延伸阅读

[疯狂史] 大学学了四年电子出来啥都干不成,原因难道都在我自己吗?

大学学了四年电子出来啥都干不成,原因难道都在我自己吗?

随着嵌入式EDA电子技术的飞速发展和应用领域的延伸扩张,仅仅在30多年前尚未曾有过的大量学科纷纷出现在高等教育的课程设置中。......

关键字:大学 嵌入式 EDA

[真心话] 致青春 FROM:一只嵌入式行业摸爬滚打数十载的老鸟

致青春   FROM:一只嵌入式行业摸爬滚打数十载的老鸟

作为一名在嵌入式行业摸爬滚打许久的老鸟,回想自己的经历之路,那么漫长可又仿佛近在眼前。——此文仅献给那些刚刚踏上硬件之路和还在徘徊的同学们,在此我简要的记录了我的学习经历和其间自己所获的一些心得,以帮助初学者少走弯路。......

关键字:工程师 嵌入式 FPGA

[真心话] 嵌入式系统工程师的十个“不要”

嵌入式系统工程师的十个“不要”

不要第一句话就说:给个代码吧!你应该想想为什么。当你自己想出来再参考别人的提示,你就知道自己和别人思路的差异。......

关键字:嵌入式 系统工程师

[图酷] ARM+FPGA

ARM+FPGA

基于ARM+FPGA的高速同步数据采集方案,主要包括以下几个部分:ARM控制器、存储电路、FPGA逻辑控制电路、A/D转换电路、FIFO缓存、电源电路、接口电路等。......

关键字:
发表评论 共有条评论
用户名: 验证码:

精确稳定 让平均电流法帮你实现模块电源并联

精确稳定 让平均电流法帮你实现模块电源并联

今天要为大家介绍的是平均电流法,这种方法能够精确稳定的帮助工程师实现电源模块的并……

九款最简单的电子镇流器电路图原理图分析

九款最简单的电子镇流器电路图原理图分析

从工作原理而言,电子镇流器是一个电源变换电路,它将交流输入市电电源的波形、频率和……

干货|交流接触器常用接线电路图和实物图

干货|交流接触器常用接线电路图和实物图

今天分享一些电气知识中的交流接触器常用接线电路图和实物图,从简单到复杂。

……

项目外包