基于FPGA设计的CNN硬件加速器,由于FPGA拥有丰富的CLB可编程逻辑功能块,在进行CNN硬件加速设计中,可以利用FPGA平台搭建CNN模型,实现CNN推理阶段的并行加速,甚至达到GPU实现的效果,并且具有更低的功耗,更短的开发周期和更少的成本。
在硬件加速方面,搭建卷积加速硬件结构,并通过常用的CNN硬件加速手段如循环展开,结构优化,字长选择,资源复用,并行流水等方法对模型进行优化,以提高模型运算速度和能效,降低模型资源消耗。
模型优化设计
结构优化
Lenet-5,模型参数总个数为44190,数据类型为Float32,模型的参数总量为44190x4B,在不减少模型预测准确度的前提下,通过降低全连接层的数量实现模型优化。
通过减少全连接层的数目,只保留一层全连接层,输出10个输出节点。
参数整型化
CNN模型权重通常是Float32类型,取模型真值的高16位。
CNN并行运算研究
卷积运算可以看作矩阵的点乘运算,部分运算中的数据相互独立,可以进行并行计算。
使用c语言实现CNN算法模拟器,通过算法实现CNN中各层的运算。
为了实现卷积运算的并行设计,将卷积运算的并行设计分为滑窗内并行,多通道并行,多卷积核并行三个层次。
卷积运算的三级并行结构。
滑窗内并行,滑窗内并行主要实现卷积核和滑窗内数据的并行乘加运算。乘单元的输入为输入数据和卷积核权重,各乘运算间数据相互独立,加单元的输入是乘单元的输出,因此它的并行性取决于乘单元。在进行硬件设计时,首先进行并行乘运算,之后将乘积结果并行送入加运算单元,实现乘加并行。
多通道并行,多通道并行是输入数据的各个通道和卷积核的各个通道并行进行卷积运算,最后将各层卷积结果累加。
多卷积核并行,多卷积核并行是指多个卷积核和同一个输入进行卷积运算,多卷积核共同用一个输入数据,为提高数据的复用性,在硬件设计中,可以只读取一次输入数据,同时和对个卷积核进行并行计算。
池化层展开分析
池化层运算目的是在不改变输出结果特征的前提下,减小特征图输出大小。只改变输入的大小,不改变输入的维度。
池化滑窗内并行,池化滑窗内并行找出滑窗内数据的最大值,池化滑窗内并行的输入数据为池化滑窗,滑窗内数据相互独立,在比较滑窗内数据大小时,根据滑窗的大小,将滑窗内数据两两比较,之后将前一次运算结果再次进行比较。
层间并行,各通道内数据相互独立。可以实现池化运算的多通道并行。
全连接层展开分析
1 乘累加运算串行进行,输入和权重的乘积加之前累加的结果,消耗较少的硬件资源,但速度慢。
2 将输入和权重进行并行乘运算,之后送入加法树进行累加,速度快,资源消耗多。
所以第一层循环使用串行乘累加方式,第二层循环使用多输入和权重进行乘累加,并行乘加运算。
FPGA硬件加速
并行结构优化
卷积: 乘法树: 并行加速结构 乘法树-加法树
乘法树是基本的运算加速结构,通过串行乘累加运算分级并行从而实现运算加速,乘法树结构由乘运算单元PE和加运算单元adder组成,输入为输入数据和权重数据,输出为乘加运算结果。
根据乘法树的运算性质,通常来实现卷积运算的滑窗内并行,在CLK1时钟上升沿到来时,将窗内4个输入和卷积核4个权重分别送入各PE单元进行乘运算,CLK2时钟上升沿到来时,将乘运算结果送入加法树 ,最终输出卷积运算结果。
由乘法树结构和功能可知,它只能实现卷积运算的滑窗内并行。 并行效率不高。
资源复用
模型中相同层的叠加会占用大量额外硬件资源。 采用资源复用策略,两层卷积共用同一个硬件加速结构。 卷积运算共同用一个乘加单元,
MAC单元字长选择
MAC单元即乘累加运算单元,主要用于全连接层运算,实现输入数据和权重么那个的乘累加运算。 对乘累加单元输入和运算结构化进行两次字长选择,实现卷积层和全连接层的优化加速。两次字长选择分别为输入数据字长选择和乘累加结果字长选择。
数据字长选择将模型参数优化为INT16类型数据。将参数精度选择为INT9与INT16模型参数运算结果对比。 全连接层参数位数为Int11。
并行流水
对于无数据相关并行运算,为提高模型的运算效率,本文采用流水线结构提高模型的运算效率。 卷积运算的乘加单元在设计时采用乘加树,乘加树分为三级流水。刘谁信啊装满后,每个clk得到一个加运算结果。
网络硬件架构设计
1 控制器,控制系统数据流动
2 数据寄存器,BRAM,存储模型的输入数据和权重数据。
3 移位寄存器,实现输入数据的串入并出
4 权重寄存器 存放卷积运算权重
5 乘加单元,实现卷积运算
6 池化单元,实现池化运算
7 平压单元
8 全连接单元,实现全连接运算
9 缓冲池,存储运算过程产生的中间结果
为了能够用硬件获取卷积运算的滑动窗口,输入数据为9位。使用4个28x9bit shift ram结构。将输入数据送入移位寄存器,在4个移位寄存器装满后,将移位寄存器的输出。
行缓存加移位寄存器。
卷积运算加速设计
乘单元硬件实现
做一些特殊性的处理,特殊情况的判断
卷积运算硬件实现
1 clk1 水平方向将5x5输入数据送入25个并行乘法单元,和权重进行乘运算,将运算结果送入加法树,竖直方向上输入数据向下移动,送入下一行并形乘单元。
2 clk2 将25个乘运算结果以及bias送入加法树第一层13个加法器,并将13个加法器,并将13个结果存入寄存器。
3 clk3 将寄存器中13个运算结果送入加法树第二层6个加法器,将6个结果送入寄存器,
4 clk4 将寄存器中6 个运算结果送入加法树第三层三个加法器,并将3个结果送入寄存器
4 clk5 将寄存器中3 个运算结果与clk2中mul与bias的加运算结果送入加法器,并将2个运算结果存入寄存器
5 clk6 将寄存器中2个运算结果送入加法器,输出累加运算结果
6 clk7 将Conv模块的乘加结果进行字长选择,保留累加结果的高11位作为卷积运算结果。
7 clk将流水线填满,之后每一个clk,都会输出一个运算结果。
conv并行设计
单个conv模块。多个conv模块并行设计采用 资源复用策略对conv并行设计进行优化。
并行优化结构中多卷积核并行策略。
conv1 和conv2 共用一个硬件实现。 conv并行度为16.
池化层硬件加速
池化滑窗内并行和多通道并行
在获取滑窗后,将滑窗内数据通过比较器。通过三次两两比较就可以得到2x2滑窗内的最大值。
池化运算同样采用流水线方式。3个时钟周期clk可以得到2x2滑窗的最大值,之后每个clk,输出一个池化运算结果。
多通道并行设计,池化运算各个通道内数据不相关,池化模块在进行硬件并行设计时,可以采用多通道并行的方式进行。
全连接层硬件加速
单个乘加单元的设计和多个乘单元并行设计。
性能评估
选择mnist测试集 对模型准确度进行测试。将像素值存入数组中,将数组中10进制的像素值转化为2位16进制字符串存入txt文本。