这是关于一篇使用FPGA动态可重构特性进行新型FPGA加速器体系结构设计的一篇论文, 在此将这篇文章的主要内容和细节梳理一下。

0.Abstract

现有的面向神经网络的基于FPGA的加速器,很多只使用FPGA的静态重配置特性。所谓静态可重构性指的就是我们日常意义上的对FPGA重复烧写的过程(板子必须停止工作,然后用新的比特流重新配置)。这篇文章(mproving HW/SW Adaptability for Accelerating CNNs on FPGAs Through A Dynamic/Static Co-Reconfiguration Approach, no.10.1109/TPDS.2020.3046762)。从现代FPGA的动态部分可重构技术(Dynamic Partial Reconfiguration, DPR)入手,提出了一种将FPGA静态可重构和静态可重构的方式相结合得出的新的加速器架构。然后分别使用静态设计空间探索(static design space exploration)和基于强化学习(reinforcement learning)的方法来分别确定最优的静态硬件配置和运行时重构策略。

有关动态部分可重构的工程细节参考,点击这里。

1.Introduction

CNNs作为深度学习领域最有代表性的算法之一,已经有很多基于ASIC方案的面向CNN的加速器诞生。但是因为深度学习算法还在不断发展和迭代,所以FPGA在当下因为可重构性和灵活性而具有独特的优势。原先的设计中FPGA被当作传统的固定电路,然后在此基础上通过静态设计空间探索(DSE)来确定最佳并行比,但是这样相对死板的一次性决策会使得CNN中的不同层次上性能存在显著差异。因为决策是不变的,它肯定不能很好的契合每一个层次的最优计算并行度、数据局部性和数据流调度,所以所谓基于静态设计空间探索得到的结果只是一个"折中方案"。

所以在这种大前提下,FPGA的DPR特性就可以给设计空间的探索带来更多可能性和灵活性。

这篇文章的主要贡献有:

  • 提出了一款新的加速器架构,它可以协同使用FPGA的静态和动态可重构性来提升CNN中的软硬件适应性。(软硬件适应性是本文作者提出的一个概念,它表示底层加速器架构和目标CNN模型的高级计算功能完全适应,从而实现片内资源和片外数据通信的最高效率。)

  • 基于提出的加速器体系结构,提出了一种基于分层聚类的网络映射方法,可以有效地降低运行时硬件重构的性能开销。

  • 针对给定的计算场景,提出了一种系统化的设计与优化方法,该方法采用静态设计空间探索过程和基于强化学习的决策方法来寻找最优的静态硬件配置和动态重构策略。

2.BACKGROUND AND MOTIVATION

首先,这部分介绍了卷积神经网络的基本运算模式:

以及将循环展开和循环分块技术施加到卷积层上的伪代码:

最后对传统的基于静态重构配置的FPGA加速器进行了有关软硬件适应性的分析,得出的结论是传统的静态重构FPGA加速器对于神经网络的加速而言是不够高效的。

3.ACCELERATION PARADIGM

3.1 Overall Architecture

这部分首先介绍了加速器的整体架构,整体架构图如下:

整个加速器可以分为两个部分,计算端和基于软件的控制端,这两部分分别实现在平台的可重配置逻辑部分和嵌入式处理器部分。计算端根据是否可以重配置被分为两部分,即固定部分(static core)和动态重配置部分(RP),这两部分在神经网络层级(layer-level)进行相互配合。

每个RP在加速器运行时可以选择Core Lib中提前准备好的配置文件来动态的配置RP中计算单元的架构。从通用性的角度出发。在本次工作中准备好的比特流文件都是具备独立内积计算单元和缓冲区,但是具有不同设计参数(计算并行度、缓冲区大小、数据流类型)的计算单元,它们共同组成了可重配置的功能模块,它们的基本架构如下:


整个架构中,静态核的并行性始终保持不变,可变的只有可重配置模块RP。但值得注意的是,可重配置的动态模块换入换出的开销很大,所以不能指望主要的运算任务全部依靠切换动态核心来完成。所以为了保证计算能力的连续性,可以将大部分的硬件资源用于构建静态核心来保证性能,而用相对较少的资源来构建动态核心来保持灵活性。

加速器的软件部分分为控制模块(Control Module)和强化学习模块(RL)组成,前者用于协调整个加速过程,包括数据在各个模块之间的划分、启动DMA进行传输、执行动态模块的换入换出、以及持续对每个核心给定大小的输入数据保持分析。控制模块将分析结果反馈给RL模块,RL模块根据策略指导控制模块换入换出可重配置块。最后,RL模块的训练是在线下进行的,训练完成之后在运行时依照结果做出决策。

3.2 Collaborative Computing Schemes

工作还为提出的加速器定义了两种协同计算方案(),分别是LoopC-Major计算方案和LoopM-Major计算方案。这两种方案其实就是复用数据的模式不一样,示意图如下。

LoopC-Major方案就是沿着列方向将输出特征图切分开来并行计算,LoopM-Major方案就是沿着通道(纵深)方向将输出特征图切分开来并行计算。在这两种情况中Global Buffer存储的数据不一样,LoopM-Major存储的是输入特征图,LoopC-Major存储的是卷积核,分发在各个运算核心的并行计算的对象也不一样。

3.3 Network Mapping Method

这部分主要解释了如何将一个完整的CNN映射到我们设计的FPGA加速系统上。因为每次重新配置可重配置模块开销很大,一般开销通常在几十毫秒内,所以不可以在架构中频繁的进行逻辑块的换入换出。那么如何将重配置的开销降低到最小,一种方法就是使用批处理的手段来延长每一个计算层次中的计算时间来使其与重配置时的时间重叠(overlap),但是这样的开销也很大,因为重配置的时间太长了,批的大小得非常大才可以满足条件。

针对这样的问题,本文提出的方案是通过聚类算法将特征相似的层加以聚类,这样就可以大大减少动态重配置时的换入换出次数。那么如何定义层次的特征,本文给出的参考指标如下:

  • 如果不同层的M和N值很接近,那么在这些层的相同内积单元下,它往往能够实现较高的计算资源利用率。

  • 如果不同层的K和N值接近,则在这些层的缓冲相同的情况下,它往往能够实现高缓冲利用率。

  • 如果不同层输入特征图和的权重核之间的数据量比率接近,则在这些层的相同数据流调度下(相同循环顺序下),它往往能够实现较高的整体数据局部性。这个指标由以下的公式来衡量:

    这三个指标的公式化描述如下,将这三个指标综合起来得到Di,jD_{i,j}Di,j​作为不同层次之间差异性的度量。采用k_means聚类算法将神经网络的不同层次加以聚类,以此获取最小的换入换出次数来减少动态重配置的开销。

    这种基于层次聚类的方式只适用于二维卷积,三维卷积中的计算量本身就已经很大了,足以覆盖换入换出的延迟开销,所以没有必要采用层次聚类方式。聚类的簇数默认情况下是不同层次的种类数,但实际最优的聚类簇数需要通过设计空间探索(DSE)来进一步确定。

4.A CCELERATOR IMPLEMENTATION STRATEGY

据前所述,将一个给定的CNN模型部署到一款给定的FPGA平台上的流程如下所示,以下讨论的假定场景是二维的卷积运算。

4.1 Resource Partition and Floorplanning

这一步就是根据FPGA资源分布来对可重构模块在片上的布局进行手动的划分,这篇工作在这里提出了在划分时应该注意的几点约束:

1.每个RP的形状应该是规则的
2.分块之后的RP的数量不能超过FPGA片上时钟的数量
3.与I/O或者通信有关的硬核的所属的时钟信号不能分配给RP
4.FPGA上的资源分布不均匀,不同的RP应该包含一定数量的硬件资源来部署计算核心
5.每一个RP所包含的资源用量应该尽可能一致,这是为了兼容性而做的努力

本文提出在现代FPGA的硬件资源下,结合上述的约束,RP的数量大约在4-6个。

在完成手动的划分之后,还需要对资源使用情况做一个大致的统计。这些数据包含DSP和BRAM块的数量,每一个RP核心和静态核心的BRAM容量,以及静态核心相对于所有RP所使用的DSP比例。这些在静态设计空间探索时都会用到。

4.2 Static Design Space Exploration

这部分就是静态设计空间探索(static DSE)所做的主要工作,就是获得上面所述的层聚类结果的最佳静态配置。算法主要流程如下所示:

可以看到DSE过程最终想要得到最佳的聚类中心点个数以及聚类结果,以及对应于每一个聚类核心的并行模式。算法中最核心的步骤就是Search,而Search也分为两个子步骤。

  1. 假设静态核独立工作,承担的计算量比例等同于它所占用的DSP资源比例,在此条件下完成静态核的并行模式的确定。层内的并行模式到底是采用LoopC-Major还是LoopM-Major也在这个子步骤中对每个聚簇进行确定。
  2. 在1的工作基础之上,完成对不同动态可配置核心的并行模式确定,所有被聚类在同一类的可重配置核心都具有相同的并行模式。

在1、2的步骤中,本文的工作提出了一种基于roofline model(屋顶线模型)的优化模型,来完成对最优并行模式的探索。这个模型由以下几个部分组成:

  1. 变量:包含了不同核心并行模式的硬件参数,形式化的表示如下:

  2. 目标函数:目标函数的的定义与屋顶线模型保持一致,都是为了找到一个变量组合来最大化加速器的性能值和片内计算/片外访存比率。

    在公式(10)和(11)中,参数相应的估算方法如下:
    计算量的估算大致这样进行:在第一个步骤中,计算量通过静态核心DSP所占比重来大致估算;在第二个步骤中,计算量通过将各个聚簇的层次加和来得到。

    计算时间的估算大致这样进行:总计算量除以总的计算并行度,计算并行度的估算方法是所有核心的∑Tm×Tn\sum{T_m \times T_n}∑Tm​×Tn​。

    访存量等于所有核心上输入输出特征图和卷积核的总和,访存量也和数据量化有关。

访存量可以使用下表来估计

  1. 约束条件:约束条件是用来限制每一个核心的取值和组合范围来使其符合硬件约束的。一共有以下几条约束:

DSPnum,BRAMnum,BRAMcapDSP_{num},BRAM_{num},BRAM_{cap}DSPnum​,BRAMnum​,BRAMcap​分别表示每个核心可以使用的DSP数量,BRAM数量和BRAM总容量,这三个量资源划分阶段确定下来的。
计算并行度(computing parallelism)的计算方法是Tm×TnT_m \times T_nTm​×Tn​再乘以每个MAC操作需要使用的DSP平均数量。

总缓冲端口宽度(total buffer port width)是核内输入缓冲区、输出缓冲区和权重缓冲区的占用的BRAM个数之和。

总缓冲尺寸(total buffer size)就是以上三部分缓冲区尺寸的加和,它和位宽的乘积应该小于BRAM的总容量。

4.计算方法:这两个子步骤中使用的优化模型可以通过穷举不同变量的值和组合来求解。

4.3 RL-Based Dynamic Reconfiguration Decision

这部分工作就是在之前静态工作状态已经确定的情况下,如何在加速过程中获得动态的状态转移序列。这篇文章采用了基于强化学习(Deep Q-Network)的方法来进行动态重配置序列的决策。整个模型的训练在线下进行,然后在线阶段根据确定的序列做出动态重构决策。

训练过程大致如下所示:

在这个过程中,加速器的配置被抽象成向量形式,输出相应的Q值作为每一个RP的行动决策。神经网络的全职W将根据训练结果进行更新,直至收敛到最优解。

每一个层中一批数据中的每一个样本开始处理的时间点都是制定决策(decision making point)的时间点。CNN的前馈过程一直持续到预定义的条件被满足时停止,这样的一轮训练叫做一个学习阶段(learning episode)。整个Deep-Q Network模型中的一些关键元素定义如下:

  1. 状态集合:本文中建立了描述加速器状态的状态向量s,向量中总共定义了25个维度,所有的状态向量的加在一起构成了状态集合。

  2. 行动集合:每一个RP都面临两种选择,一是不重配置,二是选择对应于下一个聚簇的核心进行重配置。所以向量的维度等于RP的数目,每个RP的取值只有两个,0(不配置)或者1(重新配置)。

  3. 终止条件:终止条件用来判断当前的学习阶段是否已经完成,判据如下所示:

    这个式子中ETrealET_{real}ETreal​和ETstaticET_{static}ETstatic​分别表达的是在静态DSE阶段得到的执行时间的真实值和执行时间的理想值。β\betaβ是一个逐渐递增但是小于1的值,初始值为0.7。上面这个式子就是CNN前馈过程完成的判据。

  4. 奖励函数:奖励函数的定义如下,它其实表达的是每一个动态重配置前后可以得到的时间收益。ParacurrentPara_{current}Paracurrent​和ParanextPara_{next}Paranext​表达的分别是当前核心和下一个核心所能获得的并行度,OP则表达的是计算量。

  1. DQN的训练采用了经验重放法来减小模型收敛到局部最优点的可能(experience replay method),并采用了ϵ\epsilonϵ-贪心策略来加强通用性。也就是说对于决策,有1−ϵ1-\epsilon1−ϵ的概率按照神经网络的输出进行动作,还有ϵ\epsilonϵ的概率进行随机动作。 值得注意的是,ϵ\epsilonϵ也是随着过程而不断变化的,训练过程采用基于SGD的反向传播算法来完成。


    整个对于DQN的训练算法如下所示:

    5.EXPERIMENTAL EVALUATION

    这部分的结论主要是,本次提出的含动态可重配置的加速器架构相比于之前的加速器工作,能实现更高的计算密度。这表明了本次提出的加速器架构能够更好的贴合CNN模型的计算特征,实现了更好的加速器软硬件适应性。

    实现在16位固定数据类型下平均可以实现683个GOP,在8位固定数据类型下平均可以实现1.37个TOP,与以前在同类FPGA平台上的实现相比,计算密度从1.1提高到1.91。

Reading Note(3)——基于FPGA的动态可重构特性探索新型加速器架构相关推荐

  1. 浅析FPGA局部动态可重构技术

    浅析FPGA局部动态可重构技术 所谓FPGA动态可重构技术,就是要对基于SRAM编程技术的FPGA实现全部或部分逻辑资源的动态功能变换.根据实现重构的面积不同,动态可重构技术又可分为全局重构和局部重构 ...

  2. oracle+sga+pga用途,Oracle9i 动态SGA,PGA特性探索

    Oracle9i 动态SGA,PGA特性探索 更新时间:2009年03月03日 23:23:54   作者: 虽然Oracle9i中的内存管理仍然需要很多的手工操作,不过大部分的Oracle管理员可以 ...

  3. planahead 动态重构_部分动态可重构

    摘要:针对调制样式在不同环境下的变化,采用了FPGA部分动态可重构的新方法,通过对不同调制样式信号的解调模块的动态加载,来实现了不同环境下针对不同调制样式的解调这种方式比传统的设计方式具有更高的灵活性 ...

  4. skew算法_一种基于FPGA的多通道高速输入信号自动de‑skew算法的制作方法

    本发明涉及高速数据采集技术,更具体的涉及一种基于FPGA的多通道高速输入信号自动de-skew算法. 背景技术: 随着对精度和速率要求越来越高,目前数据采集系统向着多通道和超高速两个方向发展.多通道高 ...

  5. 基于fpga的数码管动态扫描电路设计_【至简设计案例系列】基于FPGA的密码锁设计(altera版)...

    秦红凯 明德扬FPGA科教 一.项目背景概述 随着生活质量的不断提高,加强家庭防盗安全变得非常重要,但传统机械锁的构造过于简单,很容易被打开,从而降低了安全性.数字密码锁因为它的保密性很高,安全系数也 ...

  6. 实验三 基于FPGA的数码管动态扫描电路设计 quartus/数码管/电路模块设计

    实验三 基于FPGA的数码管动态扫描电路设计 源文件的链接放在最后啦 实验目的: (1) 熟悉7段数码管显示译码电路的设计. (2) 掌握数码管显示原理及静态.动态扫描电路的设计. 实验任务: (1) ...

  7. 基于FPGA的数码管动态扫描显示(含代码)

    数码管的显示有静态显示和动态扫描显示.一个数码管通常有8个段码,当要控制数码管的数量在两个及以上时,动态扫描无疑是一个最好的选择,可以大量节约IO资源. 静态显示很好理解,8个段码拼成了数字8.,当我 ...

  8. 基于FPGA的SDRAM控制器设计(1)

    基于FPGA的SDRAM初始化配置 SDRAM简述 SDRAM的引脚及作用 SDRAM初始化时序控制 SDRAM上电时序代码 SDRAM测试模块的代码 仿真测试结果 参考文献 总结 SDRAM简述 S ...

  9. CASE_02 基于FPGA的数字钟万年历

             该系类博客序言和资源简介可浏览该博客:PREFACE FPGA经典案例序言 快速了解该系列博客的内容与可用 资源. 目录 1 简介 2 数字钟计数方案 2.1 计数方案一 2.2 计 ...

  10. Reading Note(8) ——GNN for DSE Optimization

    这篇博客是一篇论文阅读札记,这篇论文的主题是使用GNN来优化加速器设计中的设计空间探索耗时过长的问题. 这篇文章的标题是<Enabling Automated FPGA Accelerator ...

最新文章

  1. 麦块我的世界怎么用java_麦块我的世界怎么玩啊?
  2. Linux安装mysql学习
  3. django1.11.6+nginx1.12.2+uwsgi2.0.15 部署
  4. 常用设计模式之抽象工厂模式
  5. 进程隐藏与进程保护(SSDT Hook 实现)(三)
  6. java项目打jar包
  7. android 语音助手官网,breeno语音助手最新版
  8. tf.clip_by_value()
  9. linux后台执行脚本(产生日志和不产生日志)(大神请留言)
  10. python数据容器专题
  11. Redis设计与实现 - chapter7 压缩列表
  12. Solr优化案例分析
  13. 论文笔记(1) B4: Experience with a Globally-Deployed Software Defined WAN
  14. matlab 非支配排序,NSGA-II快速非支配排序算法理解
  15. Kent Beck揭秘Facebook开发部署流程
  16. 今天,IT女神们是怎么度过的(文末送礼品)
  17. 微信小程序 RangeError: WebAssembly.Memory(): could not allocate memory
  18. 生产环境RedisCPU飙高怎么办
  19. 【行业云说直播间】-云数底座赋能基层治理现代化正式上线
  20. 【SLAM】VINS-MONO解析——回环检测和重定位

热门文章

  1. 一起来学PCB-0.4-STM32F072C8T6最小核心板原理图设计
  2. IDEA Jsp乱码大全
  3. 微信小程序开发的基本流程__BaiMoci
  4. JAVA——电子商城三级分类目录查询-递归树形数据结构
  5. 苹果开发——设置iTunesnbsp;Connec…
  6. python做3d相册_简单3D翻页相册制作教程(示例代码)
  7. Off World Live 插件:广播UE4内部的音频信号到NDI
  8. 飞桨paddlepaddle论文复现——BigGAN论文翻译解读
  9. Web项目:校园社团管理系统
  10. php特效表白代码,js爱心表白动画特效代码