用FPGA加速卷积神经网络的知识储备

用FPGA加速卷积神经网络的知识储备

  • 1.FPGA
    • 1.FPGA分类
    • 2.开发工具
    • 3.开发工具2
  • 2.卷积神经网络
    • 1.卷积神经网络基础
    • 2.开发语言
  • 3.总结
  • 参考内容

本文是我经过一段时间学习的学习总结,由于是初学者的缘故,可能总结会有纰漏甚至错误,希望同样从事该方向研究的大佬以及爱好者批评指正,不胜感激。

下面我会从硬件和神经网络两方面来介绍使用FPGA做卷积神经网络加速所需要的知识基础。

1.FPGA

1.FPGA分类

毫无疑问,Xilinx是当前FPGA领域的带头大哥,占据了百分之60左右的全球市场份额。而Altera在被intel收购以后,也有着相当优秀的发展潜力。就这两家而言,Xilinx胜在高端性能,资源丰富。而Altera胜在价格低廉,是新手入门的性价比的不二之选。

2.开发工具

Xilinx:Vivado,功能完善,集成了HLS,虽然会有一些奇怪的bug,但是瑕不掩瑜。

Altera:Quartus II,集成了modelsim工能,非常直觉化,容易入门,bug很少(曾是高管骄傲的谈资),非常适合新手入门,但并不适合大规模系统开发。

3.开发工具2

VHDL/Verilog:硬件描述语言,永远的神。就目前而言,想要完全发挥FPGA的性能,硬件描述语言无疑是首选,但是上手有一定的难度,需要付出比较大的努力。
(补充:学习资源丰富,不会增加搜寻资源的时间成本)。

HLS:HLS是高层综合(High level Synthesis),是将C或者c++语言编译为FPGA能够读懂和运行的RTL级别的语言。通过HLS这个过程可以显著加快FPGA的设计进程,而不用从底层的FPGA语言编起。但是由于软件工程师本身的知识体系的原因,使用hls相比硬件工程师而言,仍有不小的差距。换言之,现在使用hls炉火纯青的工程师仍是硬件工程师。
(补充:Xilinx的Vivado由于集成了hls工具,而Altera的Quartus II在17.x版本以后才支持,所以就学习资源的丰富性以及易用性而言,Xilinx独孤求败。所以如果要选择HLS来开发FPGA的话,个人建议选择Xilinx的器件作为硬件开发板)。

OpenCL:OpenCL(全称Open CompuTIng Language,开放运算语言)是第一个面向异构系统通用目的并行编程的开放式、免费标准,也是一个统一的编程环境,便于软件开发人员为高性能计算服务器、桌面计算系统、手持设备编写高效轻便的代码,而且广泛适用于多核心处理器(CPU)、图形处理器(GPU)、Cell类型架构以及数字信号处理器(DSP)等其他并行处理器,在游戏、娱乐、科研、医疗等各种领域都有广阔的发展前景。
基于FPGA的OpenCL有如下优点:

a.与传统的FPGA设计流程相比,产品能够更迅速面市。
b.使用OpenCL C (基于ANSI C)并行编程语言而不是传统的底层硬件描述语言(HDL)来描述您的算法。
c.在更高层的设计抽象环境中迅速进行设计开发。
d.针对目前和未来的FPGA重新定位OpenCL C代码,设计不会过时。
e.跳过耗时的手动时序收敛以及FPGA、主机和外部存储器之间的通信接口设计工作,一个步骤中就可以在FPGA上实现OpenCL的C代码。
f.相比于硬件方案,功耗有明显的降低。

当然,OpenCL的缺点同HLS类似,相比于硬件描述语言,仍无法完全发挥FPGA的性能。
(补充:选择OpenCL必然选择Altera开发器件,但是目前能找到的开源资源很少,需要自身有一定的资源支撑)。

2.卷积神经网络

由于FPGA开发硬件的特殊性,普通的卷积神经网络直接移植到开发板上明显是达不到加速的效果的,所以想要实现加速效果,我们必须对卷积神经网络进行轻量化设计。而轻量化网络,需要我们对神经网络结构有深入了解以及对编写语言有一定的基础。

1.卷积神经网络基础

轻量化卷积神经网络有以下方法:如网络剪枝、低秩分解、压缩编码等,减小神经网络模型参数量、简化卷积神经网络算法运算过程等。进行以上操作,需要我们对神经网络的结构有很深入的了解,所以,实现神经网络的FPGA加速器设计,对神经网络模型的把控必不可少。
推荐学习内容:吴恩达的深度学习,李沐的动手学深度学习等。

2.开发语言

可以编写神经网络开发语言很多,C,C++,Python,选择哪一种开发语言需要根据上面开发工具选择相匹配,如果使用HLS或者是OpenCL,C和C++是最好的选择,如果选择硬件描述语言来设计硬件的话,那么选择Python毫无疑问更方便,因为Python相比其他两种更容易编写,更容易理解。

3.总结

用FPGA做神经网络的加速器,我们可以选择的方案方法搭配有很多,我们应该根据自身的能力以及所拥有的资源选择最适合自己的结合,避免时间成本的增加。在查漏补缺的同时,代码能力必然需要提高!代码能力必然需要提高!!代码能力必然需要提高!!!(重要的事情说三遍)代码是灵魂,没有代码能力,一切都是空谈!!!!!!

最后,还是希望同方向的大佬以及爱好者批评指正,分享资源,不胜感激。

参考内容

参考内容:http://www.elecfans.com/emb/fpga/20130412313552.html

你可能感兴趣的:(学习笔记)