基于FPGA的yolo算法加速研究
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 79
•
1.相关介绍
1.1 FPGA
Field-Programmable Gate Arrays (FPGAs)是一种由可配置逻辑模块组成的半导体器件,众多逻辑计算单元组成二维矩阵,逻辑单元之间从水平方向和垂直方向用线网进行连接。
现在一些高端的FPGA芯片,拥有成百上千个可配置逻辑模块,可以实现普通函数的快速计算。
同时FPGA片上拥有一些固定功能的计算单元,比如DSP48,可以实现浮点数乘法运算,同时,FPGA支持多次重新写入和配置。
(1)FPGA和通用处理器对比
FPGA计算单元比传统的一些处理器,比如台式电脑、智能手机、大部分嵌入式系统、GPU等都有优势,这种优势主要是因为FPGA拥有众多可以任意编程的实现通用计算的模块。
这些可配置模块可以用来实现任意专用功能的加速模块,来完成特定的任务,来提高程序的运行速度,使程序有更好的能耗比,实现更大的吞吐量。
拥有这种优势的同时,FPGA牺牲的是它的敏捷性,这意味着开发过程比其他通用处理器更复杂。
开发人员必须详细计算FPGA的可用资源,同时需要考虑如何设计实现框架,可以充分利用FPGA的并行计算优势。
(2)FPGA和ASIC对比
Application-Specific Integrated Circuits (ASICs)是经过专门裁剪和定制的半导体器件。
和FPGA对比,ASIC内部并没有可配置逻辑模块和用于连接各个模块之间的线网,而是直接可以用于固定计算的专用单元,这样的好处就是体积小、运行速度快、性能功耗比高。
但问题是,ASIC复杂的结构设计需要很长的设计周期和前期设计成本,而且要求一次成功率和可扩展的验证。
因此,ASIC非常适合大吞吐量,而又对能耗有要求的应用场景。
ASIC的设计周期和设计成本虽然很昂贵,但是其产品需求量大的时候,这些就都可以被均摊了。
FPGA更适合一些计算电路原型的制作,开发周期相对于ASIC来说短很多。
1.2 Yolo v2算法
Yolo全名为You Only Look Once,是物体检测算法中非常经典的算法之一。
Yolo共有三个版本,本文主要介绍的版本二。
经典的目标检测网络有很多,比如RCNN系列。
RCNN 系列算法又可以分类两大类,首先是Two-Stage类型的算法。
该算法步骤主要分为两步,目标建议和目标分类。
然后是One-Stage类的算法,比如在Faster-RCNN中把目标建议和目标分类作为一个网络,经过一次深度神经网络计算,可以得到两个分支,大大缩短了计算时间。
而Yolo系列算法,则把这两个分支都取消了,前向推理计算时,只用一个网络就可以同时得到待检测目标的分类信息和位置信息。
基于以上背景介绍,本文的主要贡献:
基于FPGA的yolo算法加速研究
同济大学软件学院 孙有腾
(1)基于darknet框架实现了针对该框架下的模型剪枝压缩方法;
(2)将卷积计算模块利用FPGA进行加速。
2.算法实现过程
2.1 剪枝算法的实现
卷积神经网络在进行模型前向推理的过程中,需要将输入特征和权值进行卷积计算。
这些权值也就是卷积核,仔细查看这些权值的分布发现,大部分权值都是处在0的左右,权值的绝对值都很小,比如yolo的权值分布如Figure 1所示。
而且有研究发现,大部分权值其实是冗余的。
因此,可以减去一些多余的卷积核,同时保证对计算结果影响不大。
确定了对减去多余的卷积核的目标之后,那哪些卷积核应该被剪掉呢,本论文采用的方法流程如下:
1)对于某一层,对各个卷积核求L1范数,;
2)对该层的所有卷积核,依据进行排序;
3)剪掉排列最靠后的m个卷积核,同时对于下一层的卷积计算中,对于每个卷积核都要剪掉其对应通道;
4)其余层的卷积核保持不变,直接保存到新的模型中;
本论文根据以上算法流程基于darknet框架实现了此框架下的权值剪枝工具,使用时只需要提供待剪枝的层和剪枝比例,程序会自动完成剪枝工作。
有了以上工具之后,可以方便的对各层进行不同比例的剪枝,然后查看在此剪枝比例下。
Figure 1 权值分布
权值对于最终推理结果的影响,这一步称为敏感度分析。
对Yolo中的卷积层进行敏感度分析之后,可以发现下降的越快的卷积层越敏感,靠后的卷积层的敏感度较低,靠前的卷积层较为敏感,基于以上发现决定对Conv18-23的卷积层进行剪枝,剪枝比例为50%。
仅仅通过这一步的优化,该模型在ARM CPU上的运行时间由50s降低到36s。
模型大小由179M压缩到109M。
• 80
•
2.2 FPGA加速模块的设计
1)并行设计
FPGA 的主要计算优势体现在其可以支持电路级别的并行计算。
对于3D 卷积来说,每个卷积核都可以同时和输入特征进行计算,每个卷积核的所有通道又可以单独和输入特征进行计算,每个输入特征也可以单独参与计算。
同时,以卷积核尺寸为3为例,需要9个元素同时做乘法,再做加法,这个其中9次乘加操作也可以并行。
2)数据复用
为了支持计算的并行性,对于卷积计算的权值部分,FPGA 加速模块的要求是一次性将某层的全部权值加载到FPGA 的片上缓存。
对于输入特征,本论文采用的是Line buffer 的形式,一次性缓存四行输入特征矩阵的参数,当达到四行之后,重新写入整个数组。
3)FPGA 实现效果
最终实现效果如图2所示,输入特征和权值通过AXI 总线,缓存到FPGA 片上,对于卷积计算的乘累加操作,同时综合处N_PE 个计算单元,这些单元同时进行计算,将结果写入到Oc-ache 中,然后进行累加,得到该输出位置(x,y)上
的输出结果。
最终,使用Yolo v2算法检测单张图片在FPGA 上的运行时间大概为270ms ,比英伟达TX2的计算时间慢10ms ,但是功耗比TX 低,FPGA 上运行消耗的功耗只有6.13W ,而TX2的功耗最低还需要7.5W 。
因此本论文的实现在工
程项目中具有实际应用意义。
Figure 2 FPGA加速模块计算原理图
现代网络信息技术的发展革新,使人们的生活和工作方式都实现大幅度的优化提升,对社会各个领域都产生了深刻的影响。
在此背景下人们越来越重视计算机的网络技术的异常问题。
JAVA作为计算机可移植、跨平台的高级语言,在实际编程过程中经常会遇到各种异常情况。
因此,本文从实践角度出发,对JAVA编程中的异常问题进行了分析探讨,并在总结异常处理语法的基础上,提出了科学有效的异常处理方法和技巧。
JAVA异常处理方法和技巧的掌握,对JAVA编程过程意义重大,作为计算机面向的高级语言,JAVA的应用非常广泛,由于具备跨平台和可移植等诸多优势,JAVA已经成为信息时代的最重要的编程语言之一。
因此,在JAVA编程实践过程中,程序员要全面掌握异常处理的语法和JAVA代码的健壮性,在遇到异常事件的情况下,可以及时抛出异常捕捉异常,进而确保代码的可读性和执行效率。
一、JAVA异常处理的概念
JAVA异常处理是在实际编程过程中,遇到的网络连接异常、文件丢失等一系列异常情况,导致程序员的系统程序受到破坏,而在异常情况下,Throwable是对JAVA异常的描述。
程序员在异常处理过程中,可以调用一些函数,查看是否为常规值进行判断,如果函数运行后不是常规值,就表明了异常情况的出现。
JAVA
编程中异常处理的方法和技巧研究
济宁职业技术学院电子信息工程系 马玉凤 姜
晗
二、JAVA编程中异常处理机制
Exception类是JAVA语言的标准,它是通过程序运行而产生,JAVA异常处理机制具有方便快捷的特点,能够为对象提供更加有针对性的服务。
(一)抛出异常
JAVA系统实际运行时,如果出现程序中的方法被调用,此时往往会出现一些错误,导致这些错误产生的原因往往是多方面的。
在这样一种情况下,JAVA的异常处理机制往往会因为错误的发生而间接的出现异常对象,在此时实现抛出异常则是充分发挥JAVA虚拟机的作用,确保系统能够正常有序的运行。
(二)异常捕获
通过一场处理机实现异常抛出之后,程序员需要查找异常匹配关键语句,这样才可以帮助系统实现对异常的捕获。
JAVA语言通过try-catch-finally等关键语句可以做到捕获异常。
实际应用过程中try关键语句是一种常见的、正常的程序代码,可以存放异常代码;catch关键语句也能够捕获异常;finally能够处理异常;throw能够抛出异常。
在程序代码中异常的种类是多种多样的,正因如此,程序员可以实现用try子句嵌套catch子句。
(三)异常处理
要想实现处理异常的目的就必须将与异常匹配的关键语句找出来,如果程序员不能够找到异常,就必须马上终止运行程序。
当然,如果程序员再找到异常后,没有实现对异常的有效处理,也可以做出抛出处理的决定。
在做出抛出异常决定后还可以将异常转交。