目录:
事先声明,仅用于记录和讨论,有任何问题欢迎批评指正,只是觉得菜的大佬们请绕路,就不用在这里说大实话了,因为本身就是一个粗糙的demo。ISE的v文件在github,由于大家想要vivado工程,我就做了一个,有点大,传到了百度网盘。
链接:https://pan.baidu.com/s/1OEUPTEQ3miRcPFCaWy-3MA
提取码:bqit
提起把项目代码讲解一下的念头主要是源于最近一个同学开始转行做这个,感觉很复杂无从下手。在给他讲的时候想起我最开始入手一块FPGA到自己写出整个框架的艰辛,以及寻找并阅读开源项目的艰难,所以打算把整个过程完整的记录下来,也方便和大家交流。
现在github上对于在FPGA实现卷积神经网络的项目也很多,各大公司也都有做,Xilinx和AMD的开源项目也能搜到,但是由于功能太强大而导致代码复杂新手很难阅读(也许这是FPGA口的一个特色?)。另外就是有很多论文,各种各样的加速方式,看了之后,woc NB,但是咋复现啊。本项目由于主要是从结构出发,因此只是对结构进行了实现,对于硬件层面的优化较少,都是使用最简单的方式进行实现的,因此可能理解起来也算是容易一些。当然现在越来越多的研究者和同学使用HLS进行开发,确实HLS相对于简单很多,开发周期大大缩短。
对于基于FPGA实现CNN的研究,个人感觉单纯的在这方面进行普适性的研究已经许久没有颠覆性的进步了,研究人员在FPGA上面实现了VGG、Resnet等各种各样的网络结构,各种各样的硬件级优化也都做了很多。而我们从工程应用的角度把他作为一种工具去在某一个领域去进行加速,这样是可以针对特定的应用场景特定的网络进行特定的处理。很多现在的论文也是这样,做一个项目场景,而FPGA的使用是为了加速这一过程,至于CNN,那也只是一种方法而已。
从工程角度,对于使用FPGA加速CNN,个人觉得应该分为四个步骤
- 在软件层面对CNN进行优化
- 在软件层面对CNN进行FPGA适应性处理
- 将CNN算法分解为适合FPGA实现的结构
- FPGA实现及优化
这整个应该是一个完整的流程。
首先FPGA本身的存储空间有限,现在的大型网络具有巨大的参数量,哪怕是在一些具体应用中使用了较小的网络(如本项目,因为要实现的功能并不复杂,因此网络结构也比较简单),参数量仍然很大,因此第一步应该在软件层面就优化一些,比如剪枝,既可以减少参数量又可以减少计算量,何乐不为。
其次CNN不一定完全适合FPGA,比如我们希望在FPGA中调用DSP单元进行定点数计算,那么我们需要对CNN的参数进行定点数量化处理。
分解的话主要是提取CNN的计算流程,把每一步的计算公式完整的使用matlab或者python等进行实现,而且不掉调用库函数,完全来仿真FPGA的实现,比如卷积是否要分解为多步进行等。
最后才是在FPGA上的实现以及优化。
个人意见哈~也不见得对,而且仅限于单片处理,多片的话要考虑的东西就更多了。
总之呢,下篇开始我将会对这个项目按照我个人写程序时候的顺序进行讲解。所有的.v文件我已经上传到了github。
我发现点下面的链接会跳到一个不知道是谁的CSDN下面需要付费下载,这个很迷惑,麻烦自行复制下面的链接。
Github:https://github.com/MasLiang/CNN-On-FPGA
那个不知道是谁的链接:https://download.csdn.net/download/weixin_42138780/18551586
没有下载不让举报,有办法的朋友麻烦举报一下
之前做的一个
讲解视频
也传到了B站。
最后,有任何问题请及时指出,欢迎各路大佬进行交流。