FPGA万花筒之(七):FPGA实现神经网络加速的Hello World

姓名:张俸玺 学号:20012100022 学院:竹园三号书院

转自https://blog.csdn.net/weixin_38712697/article/details/82818683

【嵌牛导读】FPGA,可编程门阵列,作为一种较为新型的技术,为大多数人所陌生。如今,FPGA成为一个技术热门。FPGA的神经网络实现是当今世界的热门技术话题之一。那么,FPGA如何实现神经网络加速的Hello World呢,本文对此做出了解答。

【嵌牛鼻子】FPGA 神经网络 激活函数 代价函数

【嵌牛提问】FPGA如何实现神经网络加速的Hello World?

【嵌牛正文】

听完很多大咖的观点,对于工程师,未来十年应该有两个技术可以做,一个是AI,提升生产力,一个是区块链,厘清生产关系。个人觉得还是AI好玩些,希望可以挤进去折腾下。对于AI应用落地,其实判断标准就两个,是否可以提升生产力(当然有时不是直接的,产生的数据可能在其他地方提高效率),一个是能否降低交易成本,把实惠给老百姓。

好像有点扯远了,我们还是聊技术吧。FPGA工程师如果想进这个行业,首先要先明白神经网络部署的一些基本步骤。FPGA工程师我们总不能只做翻译的活吧。

定义网络的结构:最基本的就是层数、维度、激活函数,对一般工程师其实是使用,而不是发明。

一个模型一般由以下这些函数构成

initialize_parameter(根据网络结构初始化参数,这个学问很多,初始化不好,收敛不好。

sigmoid, relu(激活函数),如果都用线性的,那深度网络就没用了,自己代入公司就知道了,最后相当于单层网络。

forward_propagation 正向传播,最简单就是点积,然后激活函数

compute_cost 计算代价函数

backward_propagation,反向传播时这个梯度下降也是很多算法滴。其实反向跟正向计算差不多,只不过反向输出层先求导,然后一级一级往回求梯度。。。

update_parameters 更新参数,有个挺重要的超参数,学习率,尝试多个学习率时也是有技巧滴,不是平均,可能指数平均更容易赚大运。

这些模型需要的函数设计好了,接下来就开始训练,一般分训练集(训练用)、开发集(选择一组好的超参数用)、测试集(测试用)。

训练好的模型就拿去做推理,推理其实就是一个正向传播算法,他的参数是训练好的。

搭建模型时给tensorflow做个广告,真的比自己用numpy做简单啊,好处是设计好正向传播,反向传播不用写代码,只要告诉他怎么优化代价函数就好,其他交给框架了。当然如果你要做硬件加速器,那还是要理解计算过程的。


FPGA在这一过程中能干啥呢,当然是加速了,深度神经网络里面最多的计算就是乘加运算。当然如果你认为只是乘加,那就说明层次不够啊。。。

一般要解决几个主要问题:

RAM如何设计,FPGA适合干这个,很大一部分原因是内部RAM分布式的,天生用来保存权重的。

哪些层放在FPGA中加速,哪些放在CPU中。

软硬件调度如何设计

数据与参数如何“流进”这个网络才能最优。

内部RAM放不下时咋整?


这些都设计出来,针对某个特定网络的加速器就设计完了,剩下的就是动手开干,实现你的想法吧。当然这种做法与传统的算法加速,比如实现加密算法,流程上没太大区别。其实还有很多更先进的东西,那就好好去读下相关论文及资料,比如微软的brainwave。。。

最后提两个问题哈:

为什么大家都说FPGA适合做推理,做训练不如GPU?理解算法以及FPGA结构,应该可以找到1,2个原因。欢迎大家分享想法。

微软的Bing为什么选择FPGA部署推理算法?

你可能感兴趣的:(FPGA万花筒之(七):FPGA实现神经网络加速的Hello World)