Sparse-YOLO: Hardware/Software Co-Design of an FPGA Accelerator for YOLOv2
作者:互联网
Sparse-YOLO: Hardware/Software Co-Design of an FPGA Accelerator for YOLOv2
ABSTRACT
YOLO是最流行的检测框架之一,它在速度和准确性之间进行了最佳的权衡。然而,由于CNN固有的高计算工作量,在针对低能耗的高通量处理时仍然具有挑战性。该方法提出一种针对CPU+ FPGA异构平台的软硬件协同设计方法。首先,将一种新的稀疏卷积算法扩展到YOLOv2框架中,然后开发了一种基于异步执行并行卷积核的资源高效FPGA加速架构。其次,引入了硬件感知神经网络剪枝、聚类和量化等算法级优化方案,成功地将YOLOv2算法的计算量节省了7倍;最后,提出了一种基于FPGA的加速器设计的端到端设计空间探索流程,研究并实现了两种硬件/软件分区策略。
1 介绍
虽然CNN是计算密集型的,但最近的研究表明通过对用于推理计算的CNN模型进行权重剪枝和量化,可以显著降低计算工作量和内存带宽需求。在硬件层面,还研究了专用加速器/处理器,以利用卷积算法固有的并行性,进一步加快计算速度。
在所有的硬件平台中,现场可编程门阵列(fpga)由于其灵活的架构(包括大量处理元件、片上存储块和可重构互连)而受到越来越多的关注,非常低的功耗和快速的开发周期(特别是借助基于高级合成(HLS)的工具)。
根据一些现有基于FPGA加速的YOLO算法可以分成三类:
- 第一个设计利用了CNN推理计算固有的并行性,以一种直接的方式执行空间卷积算法,在大量的数字信号处理器(DSP)块上执行大量的乘法累加(MAC)操作。
- 另一类方案用低位或单位逻辑运算(如AND或XOR)代替DSP对MAC运算的要求,使FPGA的逻辑资源通常比DSP块更丰富。可以开发更高效的硬件电路,打破片上DSP资源的限制。
- 第三种类型的加速器利用先进的卷积算法,如频域卷积方案,在硬件设计上,与直接的空间卷积算法相比,减少了计算工作量(即MAC操作的数量),反过来,为所实施的加速器获得了可观的性能增益。
本文主要贡献:
- 针对基于CPU+ fpga的异构计算平台开发了专用加速器架构。
- 提出了一种端到端软硬件协同设计(HW-SW)工作流程,涵盖了从算法级神经网络压缩到硬件级秒级电路设计和体系结构设计空间探索(DSE)的所有重要研究课题。
- 针对不同的硬件设置,提出了两种HW/SW分区策略。
2 背景
2.1 YOLOv2算法
2.2 ABM-SpConv算法
ABM-SpConv算法是一种特殊的稀疏卷积方法,旨在灵活平衡地利用FPGA加速器的片上逻辑和DSP资源。该方案的核心思想是将卷积计算中涉及到的累加和乘运算解耦为两个独立的阶段,通过共享唯一的量化权值,使乘法的计算复杂度降低到一个较低的累加速率。它的主要优点是,当在FPGA设备上实现稀疏卷积计算时,显著放松了对乘法器(DSP单元)的资源需求。
在FPGA上实现ABM-SpConv方案时,为了实现最大的效率和最高的吞吐量,必须仔细解决与计算工作量和带宽相关的两个设计挑战。首先,由于CNN由多个卷积层组成,一般每一层的参数个数不同,参数的值分布也不同。其次,在大多数传统的神经网络剪枝方案中,CNN模型剪枝采用启发式规则,仅考虑参数的显著性,而没有考虑底层硬件架构的计算和带宽特性。在FPGA设备上实现时,工作负载和带宽的不均衡会导致硬件资源利用率低,系统整体性能下降。
3 系统设计
3.1 目标异构平台
本文提出的YOLOv2加速器针对的是一个由通用CPU和FPGA器件组成的异构计算平台。为了便于系统的软硬件协同设计,我们采用OpenCL框架开发了YOLOv2加速器的硬件和软件分区,如图所示。
数据在CPU和FPGA之间通过PCIe链路传输,吞吐量非常高。注意,CPU和FPGA设备也可以异步并行地执行独立的计算任务。
3.2 HW/SW划分
针对具有不同计算能力的异构计算平台,提出了两种HW/SW分区策略。
第一个策略适用于具有强大cpu的平台,它可以用于分配YOLOv2网络中几个非性能关键层的工作负载,比如max-pooling、Reorg和Concat。然后,可以利用所有的FPGA硬件资源来加速卷积层,以最大限度地提高系统的整体性能。对于连续图像帧上的目标检测任务,如监控系统,当CPU处理max-pooling层和Reorg层的速度远快于FPGA上执行的卷积层时,YOLOv2算法的平均检测速度只取决于卷积层的执行时间。
第二种划分策略适用于嵌入式或移动平台,如Xilinx Zynq FPGA设备,其中的cpu通常计算能力较低。
3.3 硬件结构设计
在硬件上实现稀疏卷积算法的一个关键设计挑战是,细粒度的非结构化剪枝结果会导致非零参数数量不一致,这些参数不规则地分布在每个权值滤波器中,在全局同步MAC阵列的传统硬件结构上实现时,会引入不平衡的计算工作量,阻碍加速器充分利用卷积算法固有的并行性。
图6给出了YOLOv2 FPGA加速卡的顶层结构。该加速器由一个任务调度器、一对数据加载/存储单元(DLU/DSU)、多个稀疏卷积单元(SCU)和连接到外部DDR内存和PCIe总线的接口组成。另外还设计了一个可选的最大池单元(MPU)来提供在fpga上实现最大池层的选项。
3.3.1 DATA LOAD/STORE UNITS
据加载/存储单元(Data Load/Store Unit, DLU/DSU)负责将特征图和权重数据从外部DDR内存提取到每个SCUs,并将卷积结果存储回外部内存。
在每一层卷积的开始,DLU首先从外部内存读取特征地图数据的一个预取窗口,并通过OpenCL内核到内核通道同时将数据广播给每个SCU。
然后,DLU以循环的方式将每个卷积任务对应的所需权重过滤器加载到scu。在预取窗口执行的所有卷积任务完成后,DLU返回到初始状态,等待任务调度程序的新命令。
3.3.2 SPARSE CONVOLUTION UNIT
SCU是所提议的加速器的主要计算引擎。如图7所示,每个SCU被实现为两个自动运行的OpenCL内核,即积累引擎(AE)和乘法引擎(ME)。
3.3.3 ON-CHIP BUFFER DESIGN
如图8左侧所示,卷积操作都是基于连续的滑动窗口进行的,滑动窗口之间通常有一大块重叠区域。在本文中,我们提出了一种基于行缓存的特征映射缓存方案来利用卷积运算的这一重要特性来提高外部存储器带宽的效率。
3.3.4 HARDWARE MAX-POOLING UNIT
MPU被设计为管道之外的独立内核,以支持灵活的HW/SW分区策略。
在执行过程中,MPU首先将全局内存中奇数行的数据加载到片上PoolBuffer中,然后将偶数行的数据逐像素读取,并与Pool-Buffer中同时对应位置的数据进行比较。最后,较大的部分结果存储到寄存器中,当两个中间结果都得到时,选择最大的值作为max池操作的输出,并写回全局内存。
3.4 SOFTWARE FUNCTION DESIGN
3.4.1 SOFTWARE MAX-POOLING FUNCTION
提出的软件池实现采用流SIMD扩展(SSE)和POSIX线程(Pthreads)来加速CPU上的最大池层。
3.4.2 REORG AND CONCAT FUNCTIONS
在全局内存中设计了一个Concat Buffer来实现YOLOv2中的Concat函数。与其他卷积层不同的是,在加速器计算conv20之后,结果会以偏移量存储回Concat Buffer。Reorg操作的结果也存储在同一个缓冲区中。通过这种方式,conv22可以直接从Concat Buffer获取拼接的数据,而不需要额外的数据移动。
3.5 PERFORMANCE MODELING
在本节中,我们首先对两个重要的性能指标建立模型,包括推断吞吐量和算术强度,这些指标将用于车顶线模型,以探索和找到在目标平台上提供最高性能的最佳设计点。
4 硬件层面算法优化
4.1 优化流程
提出的算法级优化流程包括三个步骤。第一步是CNN模型剪枝,它的目标是在模型大小(内存占用)和计算工作量上平衡教育率,这样加速器提供的性能增益就可以最大化,而不受外部内存带宽的限制。第二步是优化参数值的分布,使稀疏卷积算法中积累运算次数与乘法次数的比例与硬件参数Nam相匹配。最后的优化步骤融合BN层到卷积层避免复杂的浮点操作所需的批处理规范化,然后整个CNN模型进行量化在定点格式字长较短,从而进一步减少内存占用的重量和实现成本的硬件电路。
4.2 基于Roofline-model的权重剪枝
一种典型的roofline模型如图12a所示。当所实现的算法算法强度较低时,会陷入roofline模型的内存限制区域,这意味着外部内存接口无法提供足够大的数据流来满足处理器中计算单元的吞吐量要求。随着运算强度的增加,可达到的最高性能的上限也相应提高,直到达到计算边界区域,这表明内存带宽总是足够的,加速器的峰值性能仅受片上硬件资源的限制。
我们提出了一种新的基于roofline模型的修剪算法(也称为roofline-pruning)。Roofline剪枝的目标是使每个卷积层的算术强度尽可能接近记忆边界区域和计算边界区域的结合处。因此,硬件加速器可以获得最高可达到的性能。
4.3 权重聚类
为了避免硬件参数Nam与Sam之间可能出现的不匹配,我们提出在量化前对每个权值滤波器的参数值进行聚类,以严格限制每个权值滤波器唯一非零参数的数量。
4.4 BN融合和动态定点量化
在FPGA设计中,将全精度浮点运算转换为低比特定点运算可以节省大量的硬件资源和外部内存带宽。
启示
为什么进行软硬件联合设计
近期刚好项目提炼创新点有提到软硬件联合设计(co-design)。本篇文章也是基于FPGA的对Yolov2网络进行加速,使用了软硬件联合设计,现在分析下为什么进行联合设计:
- 结合硬件架构更好的对算法进行优化。平时算法在进行剪枝、量化等优化时只会考虑参数的显著性,不会考虑硬件的负载和带宽,这样会造成优化的算法虽然精度较高,在一种平台上可能运行快了,但是在另外一种平台会受到硬件资源限制,速度更慢。因此基于硬件架构对神经网络进行剪枝、量化可以让优化的算法更适用;
- 结合软件特性设计硬件加速方案。算法结构会影响硬件的工作效率,结合软件的特性、根据软件运行特点,将不同任务交到不同的处理器进行计算,同时根据任务量大小制定对应数量的处理加速器,以及根据算法的特点定义硬件存取数据的方式可以最大化利用硬件资源,提高硬件计算效率;
- 软硬件联合优化。结合软件的参数、计算方式、计算量等和硬件的资源、带宽对两者进行合理的开发,同时保证算法的运算精度、计算速度与硬件的带宽承受、运行效率。例如根据Roofline-model理论,算法强度较低会陷入内存限制区域,带宽会决定斜率,算法强度较强会陷入性能上限,算力就决定了高度。那么如何平衡带宽和算力,通过合理联合优化软硬件可以让各类资源最优化利用。
软硬件联合设计是必要的、也是非常有挑战的,目前衡量硬件算力的单位是OPS(Operations Per Second),一些硬件已经达到了100TOPS甚至1000TOPS,但是实际应用中硬件的算力远远达不到这么高,甚至有些硬件实际应用只能达到理论算力的十分之一。其中很大一个原因就是他们的硬件是通用平台,对一些算法不能最优化利用,因此利用率只有十分之一。可见软硬件联合设计是可以提升运行速度、运行效率、节省资源、降低功耗的。
标签:Co,Accelerator,FPGA,卷积,硬件,算法,内存,加速器 来源: https://blog.csdn.net/qq_41663008/article/details/116197519