基于FPGA的卷积神经网络加速器_余子健

基于FPGA的卷积神经网络加速 --余子健 特征图并行:由细粒度到粗粒度 (1)卷积窗口内部,3*3卷积 (2)同一特征图上,卷积窗口的滑动 (3)不同卷积窗口对应的不同特征图 (4)不同个数的卷积通道对应输入的特征图 (1)窗口内部卷积实现 来一个时钟周期,输入一个数据X。 解析第一行输出,1个时钟周期后,输出X(n,0)*W02无效。3个时钟周期后,第三级流水线得到X(n, 2)*W02+ X(n, 1)*W01+ X(n, 0)*W00,第一级流水线得X(n, 2)*W00,第二级流水线得X... 阅读详情
AI摘要

本文探讨了基于FPGA的卷积神经网络(CNN)加速器设计,深入分析了卷积层的并行计算策略,包括卷积窗口内部、特征图间及不同输出特征图的并行实现。同时,介绍了激活函数的多种实现方法,如泰勒级数展开、查找表、分段线性逼近和CORDIC算法,以及加速器的整体结构和卷积计算单元的设计。


这是浙大余子健的研究生毕业论文,也是我阅读的第一篇文献。

1. 神经网络计算模型

上图为典型的卷积神经网络的结构。在图中C层代表的是卷积层,S层是子采样层,F代表全连接层。C层与S层是交替出现的。卷积层即特征提取层,子采样层可以二次平均和局部提取。卷积层是FPGA要加速的重点。

上图是一个典型的卷积层,N个输入特征图,M个输出特征图,将会有N*M个卷积核 (Kernals)。这点我觉得很重要:不同的输入特征图,卷积核一定不同;不同的输出特征图,卷积核也一定不同。
具体的卷积和子采样计算过程不赘述。

2. 卷积计算并行性分析

这一部分是整个论文的核心。在该部分的讨论中,所有的并行情况都单独考虑,不设计多个组合的情况。

2.1 卷积窗口内部并行

即某一个卷积窗口的卷积计算的并行。通常在实现时会加入流水线技术,并行度为N时在单周期可完成N次乘累加。

一个小错误:上图中最左上角的X(n, 0)应该是X(n, 3)。
以第一行(行n)为例来说明该流水线是如何工作的,在第一个时钟周期,执行X(n, 0)*W00;第二个时钟周期,X(n, 1)*W01,并加上X(n, 0)*W00的计算结果, 此外,第一级流水线还会计算X(n, 1)*W00,即下一个卷积窗口的第一个计算值;第三个时钟周期,第三级流水线执行X(n, 2)*W02 + X(n, 1)*W01 + X(n, 0)*W00,第一级流水线执行X(n, 2)*W00,第二级流水线执行X(n, 1)*W00 + X(n, 2)*W01。以此类推。

2.2 相同特征图卷积窗口间并行实现分析

相同特征图内不同卷积窗口的并行,易理解如下图。

2.3 不同输入特征图卷积窗口并行

如上图所示为不同输入特征图的同一卷积窗口的并行,原理很好理解。

2.4 不同输出特征图并行

原理与不同输入特征图的并行基本相同。
到这里为止,四种由小到大,由细到粗的并行结构就结束了,这四种并行结构可以进行组合,在数据带宽和运行效率之间做出平衡。

3. 激活函数的实现

神经元的缴活函数实现是一个重要的环节,其导数的变化范围影响网络的收敛速度和学习速度。常用的激活函数有sigmoid,双曲正切等。激活函数的数字电路实现方式主要有以下方式:

  1. 泰勒级数展开
    可通过求激活函数的五阶泰勒级数来实现。这种方法精度损失小,占用很少存储器空间,但需要比较多的计算单元,并且通用性差。
  2. 简单的查找表
    通过传统的查找表方式将所有结果保存在存储器中来实现。这种方法具有较高的灵活性,精度可任意调整,消耗运算资源少,但随着精度要求的提升,存储器资源的负担也指数增长。例如一个16位输入,16位输出的查找表,其消耗的存储器大小为128KB。
  3. 分段线性逼近
    分段线化(PWL)逼近的基本思想是用一系列折线来逼近激活函数。在实现的时候,可将分段函数的断点存入查找表,断点间的区间用线化函数来得到中间值。这种方式占用存储器资源少于查找表,消耗计算单元也小于泰勒展开。
    PWL实现方式如下:在函数f(x)上选择一个线性区,并设定最大允许误差。比较线性区原函数与线性函数之间的误差,直至到达最大误差时,从该点开始一个新的线性区。重复上述操作直至函数定义域内所有区域均已遍历。
  4. CORDIC算法
    CORDIC算法本质是利用一组常数的角度基底去逼近任意一个旋转角度,通过多次迭代可得到任意分辨率输入数据的结果,消耗一定的运算资源,适合精度要求较高的实现场合。
4. 基于FPGA的加速器设计
4.1 整体结构

加速器的整体结构如上图所示。注意,要加速的过程是前向预测过程,反向训练以得到参数的过程是在主机上完成的。 主机把权值和图像以及指令传给FPGA,FPGA计算结束后将结果传回主机。

4.2 卷积计算单元

卷积运算是本次设计的优化重点,其实现决定了CNN计算单元的整体结构。由于CNN是一个前向传播结构,层间运算具有独立性且各层运算具有高度相似性,因此可通过复用单层运算资源来实现完整的CNN神经网络计算,在实现过程中只需实现单层的卷积计算结构。
在这里插入图片描述

上图是计算过程。在该实例中,有4副输入特征图,4副输出特征图,核的大小为3*3,上图中分左边阶段和右边阶段。采用并行性组合的方式,输出特征图之间的并行度为2,即同时计算两个输出特征图;输入特征图之间的并行度为2,即同时计算两个输入特征图;同一输入特征图不同卷积窗口的并行度为2,即同时计算两个卷积窗口。
如右阶段所示,把两输出特征图的计算完成后,接着计算剩下两副输出特征图的结果。

深度神经网络 FPGA 设计与现状 阅读详情

相关推荐

基于FPGA的卷积神经网络实现(一)简介

目录: 简介 框架 资源分配(1) 资源分配(2) 数据量化(1) 数据量化(2) 数据读写 卷积模块 池化、全连接与输出 事先声明,仅用于记录和讨论,有任何问题欢迎批评指正,只是觉得菜的大佬们请绕路,就不用在这里说大实话了,因为本身就是一个粗糙的demo。ISE的v文件在github,由于大家想要vivado工程,我就做了一个,有点大,传到了百度网盘。 链接:https://pan.baidu.com/s/1OEUPTEQ3miRcPFCaWy-3MA 提取码:bqit 提起把项目代码讲解一下的念头主

qq_38798425的博客 3万+

卷积详解和并行卷积

ps:在 TensorFlow Keras 中,构建 Sequential 模型的正确方式是将层作为列表传递,而不是作为一系列单独的参数。而不是model=models.Sequential(layers,layers)

h52013141的博客 5512

FPGA实现BP神经网络-原理

FPGA实现BP神经网络 激活函数 1.神经网络激励函数的选择和实现方法 下面将介绍BP神经网络常用的激活函数。 1.1 简单线性函数 神经元功能函数 f 连续取值,输入 x 由连接矩阵 W 加权产生输出,如图: 1.2 Sigmid函数 神经元的输出限制在[-1 :+1]之间的连续非减函数,此时称为双极性Sigmoid函数;同理,当此函数最小值向上平移1个单位长度后,神经元的输出限制在[0 :+1]之间的连续非减函数,此时成为单极性Sigmoid函数。我们生活中默认的S函数指的就是双极性Sigmoid

qianfengkui的博客 5845

HLS学习笔记——实现卷积层的加速计算

目录软件实现卷积的原理常用时间术语总结HLS实现代码实现(未优化)加速器架构添加约束条件(Directive)循环展开循环体流水化处理循环体顺序问题 软件实现卷积的原理 上图是卷积计算的原理图 首先说明一下图中的各个参数: CHin:输入特征图的通道数(channel depth) CHout:输出特征图的通道数 R:输出特征图的行数(Row) C:输出特征图的列数(Column) K:卷积核的大小(kennel size) S:步进步数(stride) 对于输出的特征图,其计算公式如下图所示

qq_36334929的博客 6482

基于FPGA的神经网络的预测过程的实现

本文的目的是在一个神经网络已经通过python或者MATLAB训练好的神经网络模型,将训练好的模型的权重和偏置文件以TXT文件格式导出,然后通过python程序将txt文件转化为coe文件,(coe文件是为了将其写入rom,网络中的权重和偏置通过读取ROM即可,后续需要修改输入其他特征值,只需要修改input的rom里面的coe文件即可)。

qq_48434158的博客 856

基于FPGA的一维卷积神经网络CNN的实现(一)框架

理论建立与效果展示 正在写。。。 环境:Vivado2019.2。 Part:xcku040-ffva1156-2-i,内嵌DSP个数 1920个,BRAM 600个也就是21.1Mb。 说明:通过识别加高斯白噪声的正弦波、余弦波、三角波较简单的实例来利用FPGA实现一维CNN网络,主要是实现CNN网络的搭建。 也就是将下列数据传输至FPGA,识别出下面哪些是正弦波、余弦波、三角波,通过简单实例实践,在融会贯通。 实现流程: 训练参数:通过pytorch对10000个训练集进行训练获得训练参数,反向计算不

Crazzy_M的博客 2万+

深度学习的硬件实现与优化技术研究_林楗军

这是哈尔滨工业大学林楗军的硕士毕业论文。 与上一篇博文《基于FPGA的卷积神经网络加速器_余子健》一样,本文首先就卷积神经网络的并行性做了介绍,内容大致相同,且都是应用于卷积神经网络的前向加速过程。对于一些相同的部分,不在此赘述。 1. 卷积神经网络模型基础 首先根据文章内容继续补充一些基础。 激活函数 为了模拟生物神经元具有的被激活的特性,增强网络的表达能力,引入了连续非线性激活函数。在传统...

Setul 2082

基于FPGA的BP神经网络

本系统设计代码说明: 看了你的资料,你将32-4-32的神经网络简化为4-2-4了,因此,我们这里设计的代码是4-2-4代码。 ·这里FIFO我们采用移位寄存器来替换。其仿真波形如下所示: A05-34 ......

FPGA/MATLAB学习教程/源码/项目合作开发 4529

终极指南:如何在FPGA上快速实现卷积神经网络(CNN)模块

本项目是基于Verilog语言开发的FPGA CNN模块,为硬件加速神经网络提供完整解决方案。通过全并行设计实现卷积神经网络的核心功能,支持图像识别、分类等AI应用场景,为FPGA开发者提供高效、可配置的神经网络硬件加速方案。 ## 核心功能亮点 ### Conv2d二维卷积模块 **Conv2d模块**是项目的核心组件,支持多种配置参数的二维卷积运算: - **多卷积核支持**:可配置**

gitblog_00664的博客 1142

STM32F407 步进电机S形曲线加减速

步进电机

smallerlang的博客 1591

Qt跨平台CAN通信实战:Vector、PCAN与周立功设备统一接口设计

本文针对Qt开发中常见的多品牌CAN设备兼容难题,提出了一套统一的跨平台CAN通信接口设计方案。通过抽象层封装,实现了对Vector、PCAN和周立功设备的统一操作,上层业务代码无需修改即可在不同硬件间切换,有效解决了驱动API差异、环境配置复杂和维护成本高等痛点,显著提升了代码复用率和开发效率。

weixin_29161785的博客 329

ZYNQ之卷积循环优化

这段时间一直在看fpga如何实现卷积。看了很多文献资料,由于FPGA片上存储资源也就是BRAM十分有限,那么就不能将一整幅特征图和权重都换成到BRAM上,这是不现实的。大部分的策略都是采取循环分块测试。其中主要分为三个复用方法:1、权重复用;2、特征图复用;3、权重特征图复用。

qq_54652430的博客 602

FOC项目知识点总结三 | 完全搞懂 Clarke 与 Park 变换(附动图,仿真文件以及详细讲解数学推导过程)

本文目的,最终可以完整推算两种变换 Clarke 变换 首先先看我们需要用到的两种坐标系 1. 自然坐标系 abcabcabc 我们知道,通过三相逆变电路,我们可以画出一个自然坐标系 abcabcabc ,即三相电压的坐标系,通入的电流在这三轴坐标系中变化: 将三个矢量相加合并在一起就如下图所展现: 使用三个坐标轴来表示十分的麻烦与不直观,因为其是非正交的,于是乎我们想要将其转化成使用两个正交的坐标轴来表示,于是乎便有了 Clarke变换。 Clarke 变换的作用: 将基于三轴二维的定子静止坐标系的各

Wilson Huang的博客 3万+

FPGA多通道卷积加速器:从零构建手写识别的硬件引擎

本文是FPGA部署CNN手写识别系列的第二篇章,聚焦卷积神经网络的核心运算单元——多通道并行卷积模块的硬件实现。通过参数化Verilog设计,创新性地解决了输入数据展平解包、跨通道累加优化、动态位宽饱和处理等关键问题。模块支持3×3/5×5等任意卷积核尺寸,提供完备的测试验证方案(100%通过15项压力测试),已开源全部代码。跟随本设计,您将掌握:CNN卷积层的硬件架构思维、FPGA并行计算优化技巧、以及工业级验证方法

JInx299的博客 1328

记一次Nacos线程数飙升排查

Nacos线程飙升问题排查

叭嘣的博客 2631

灰色预测GM(1,n)模型_python

灰色系统理论及其应用系列博文: 一、灰色关联度分析法(GRA)_python 二、灰色预测模型GM(1,1) 文章目录一、GM(1,n)算法二、示例2.1 数据:2.2 代码_使用GM(1,n)城市用水总量2.3 结果分析 一、GM(1,n)算法 二、示例 注:数据均来自论文《基于灰色系统理论的贵阳市城市用水总量预测》 2.1 数据: data.csv 年份,城区人口,建成区面积,供水总量,用水人口,人口综合用水指标,城市用水总量 2002, 191.85, 98.00, 26396.00,

qq_34229228的博客 1万+

对比GPU,使用FPGA创建神经网络

介绍如何将一个具体的神经网络用于睡眠追踪,并将其映射到FPGA上。

u013643074的博客 2644

YOLOv11 改进入门篇 | 从原理到代码:CBAM 注意力模块的插入与涨点验证

本文介绍了如何在YOLOv11模型中插入CBAM注意力模块以提升检测性能。CBAM包含通道和空间注意力两个子模块,通过双池化操作和MLP学习特征权重。文章详细解析了CBAM原理,提供了PyTorch实现代码,并建议在YOLOv11的Stage-3和Stage-4之间插入CBAM。实验表明,该方法在COCO数据集上使nano和small模型的mAP提升1.7-2.3个百分点,参数量仅增加0.27%,推理延迟增加0.1ms。最后给出了插入位置选择、通道缩减比等调优建议,验证了CBAM作为轻量级注意力模块的有效性

shrgegrb的博客 1301

FPGA部署神经网络流程和方法

好的。 部署神经网络到FPGA的流程大致如下: 选择合适的FPGA芯片和开发板,确定所需的硬件资源。 在计算机上训练神经网络模型。 将训练好的模型转换为适用于FPGA的格式,通常使用High Level Synthesis(HLS)工具进行转换。 使用FPGA开发工具,如Xilinx Vivado或Intel Quartus,将转换后的代码编译为FPGA可以运行的硬件电路。 将编译好的电...

weixin_35756690的博客 3820

基于深度学习YOLOv8的PCB板缺陷检测系统

基于YOLOv8的PCB板缺陷检测系统,可以有效提高PCB生产过程中的检测效率。未来,我们可以进一步优化模型,结合更多的数据增强策略和先进的网络结构,以适应更复杂的生产环境。为了进行训练,理想的数据集应包含多种不同缺陷类型和不同背景的PCB图像。YOLOv8需要的数据格式为每个图像一个标签文件,每个标签文件包含缺陷的类别及其边界框坐标。运行该界面时,用户可以通过点击按钮选择图像,随后系统将自动检测图像中的PCB缺陷并显示结果。训练完成后,可以使用训练好的模型进行推理,检测新的PCB图像中的缺陷。

YOLO 1070

Cadence OrCAD Capture 原理图中创建差分对约束的两种常用方法

本文介绍在原理图设计阶段,添加差分对的方法。

fydar的博客 3930

fpga 神经网络

将神经网络转换为FPGA可用的格式:为了让FPGA能够理解神经网络,需要将神经网络转换为FPGA可用的格式。例如,您可以使用Python中的Keras或TensorFlow等深度学习框架来实现您的神经网络。生成FPGA位流文件:在将神经网络转换为FPGA可用的格式后,需要将其编译为FPGA位流文件。在FPGA上运行神经网络:一旦有了FPGA位流文件,就可以将其加载到FPGA并在FPGA上运行神经网络。设计硬件架构:首先需要设计FPGA的硬件架构,包括选择适当的FPGA芯片、设计电路板和布线等。

linzixiann的博客 1295

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

FPGA实现神经网络加速的Hello World

       听完很多大咖的观点,对于工程师,未来十年应该有两个技术可以做,一个是AI,提升生产力,一个是区块链,厘清生产关系。个人觉得还是AI好玩些,希望可以挤进去折腾下。对于AI应用落地,其实判断标准就两个,是否可以提升生产力(当然有时不是直接的,产生的数据可能在其他地方提高效率),一个是能否降低交易成本,把实惠给老百姓。        好像有点扯远了,我们还是聊技术吧。FPGA工程师如果想...

拾贝壳的大男孩 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

FPGA上部署神经网络

FPGA部署LeNet-5(Pycharm篇)

Shuikuoshanyao的博客 722

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

FPGA硬件加速原理性学习001----随手记一下

学习生涯需要仪式感-------以写博客的方式留作记录。 于2019年3月开始入门FPGA硬件加速方向,冲冲冲!~ 1、余同学的设计,初代目设计 参考了下面这篇博客 https://blog.youkuaiyun.com/Setul/article/details/83827980 先找篇博客看看浙大的余大佬是怎么做的 T T 首先看卷积部分的并行加速怎么来的 以第一行为例 第...

qq_674462612的博客 6416
上一篇: 写在前面
下一篇: 深度学习的硬件实现与优化技术研究_林楗军
隋边边
博客等级 码龄11年 304粉丝 91原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值