您的位置 首页 国产IC

根据FPGA的卷积层并行加快计划

卷积神经网络(Convolutional Neural Networks)是一种主要应用于图像处理领域的人工智能算法。尤其是在计算机视觉领域,CNN在包括识别(recognition)、检测(de

作者 / 肖昱 姚天尧 顾嘉盼 张延军 北京理工大学 信息与电子学院(北京 100081)

*榜首届(2016-2017)全国大学生集成电路立异创业大赛全国总决赛FPGA规划方向获奖作品

  卷积神经网络(Convolutional Neural Networks)是一种首要运用于图画处理范畴的人工智能算法。尤其是在核算机视觉范畴,CNN在包含辨认(recognition)、检测(detection)、切割(segmentation)等许多使命中占干流位置。

  卷积神经网络的根本元素:卷积层(convolutional layer)、池化层(pooling)、激活函数(activation)、全衔接层(fully-connected layer)。卷积神经网络(例如LeNet[3])关于神经网络(Neural Networks)最大的立异在于卷积层。卷积层在整幅图画上运用相对很小的卷积核(convolutional kernel)进行特征检测,完结了将原始图画直接输入神经网络而不会引发维数灾祸。克服了之前依据手艺特征和分类器的体系需求别离练习的缺陷,使得图画分类使命完结了端到端(end-to-end)。

  想要将卷积神经网络投入实践运用,例如在移动端运用服务器练习好的卷积核参数进行实时的物体或许人脸辨认,需求对CNN进行许多改善。其间,卷积层运算需求耗费很多核算资源,运用串行核算方法速度不快。因而,进步CNN卷积层的核算速度是CNN进行实践运用时需求处理的一个重要问题。

  1规划规范与束缚

  1.1规划问题

  “将上述算法在硬件平台上完结并优化,首要考虑总线带宽,内部缓存,Pipeline规划,核算单元等要素,给出不同缓存下,总线带宽核算公式和典型事例下的数据。”

  由赛题剖析,本规划计划首要分为两部分:完结计划、优化计划。完结计划触及体系架构的规划、核算单元的规划等;优化计划触及总线带宽和片上缓存在不同状况下的规划等。

  1.2规划规范

  竞赛题目中说到的规范:

  1)运算速率:100GMAC,每秒100G次乘加运算;

  2)输入图画数量:1024 channel,1024个输入feature map

  3)卷积核数量:1024,1024个输出feature map

  4)输入输出图画分辨率:150*150

  咱们对细节进行的假定:

  1)数据宽度:8位,像素点取值规划(0~255)

  2)卷积核尺度:3*3

  1.3束缚条件

  本规划计划依据Altera公司的Stratix IV EP4SGX230KF40C2,其有两项硬件资源束缚:

  1)硬件乘法器;

  2)片上RAM;

  本规划计划在规划时对不同DDR在不同数据总线带宽下给出相应的缓存计划,在完结中运用DDR2 SRAM。完结中的DDR2数据总线带宽经过试验测出,其他类型的DDR数据带宽经过查阅材料进行预算。图一列出了Micron公司不同DDR在FPGA平台上的参数,咱们将依据这些数据进行随后的核算。

  图0 不同DDR SRAM参数(Micron)

  2规划整体架构

  2.1硬件架构

  咱们会运用如下图中的整体架构:数据开端存放在DDR中;由DDR读写IP核将数据从DDR中读出;数据由DDR读写IP经过FIFO进行跨时钟域操作送给片上RAM缓存;再将数据由RAM中读出送给并行核算单元阵列进行卷积运算,得到运算成果;运算成果暂存在片上RAM中;再从RAM中将运算成果读出,经过FIFO送给DDR读写IP写回DDR中。

  图1 体系架构规划

  在规划的进程中,咱们将在核算单元和缓存中采纳两种不同层次的数据复用战略,以下降体系关于带宽资源的需求。

  2.2优化问题的数学模型

  咱们以为,对卷积运算进行加快的关键在于:在充分运用读写带宽的前提下,经过运用片上缓存和并行战略,尽量进步体系的并行度以到达规划规范。

  明显地,体系关于DDR的读写速度将远慢于并行运算的速度,所以最大化地运用读写带宽将是不行避免的。依据查询到的材料,以任何现有内存设备的读写速度,都是不能支撑100GMAC的串行卷积运算的。因而,并行地进行卷积运算也将是不行避免的。此刻,带宽资源还有或许缺乏,能够运用片上RAM缓存对已读取的数据进行复用以进一步减小关于带宽的需求。

  总而言之,咱们期望最大化地运用带宽资源,并运用并行规划和RAM缓存使体系到达100GMAC的规划规范。

  考虑到片上RAM本钱较高,现在的FPGA遍及不具备很大的片上RAM容量,所以在规划中咱们期望运用尽或许少的片上RAM资源。由此,能够用数学言语描绘本次规划中的优化问题:

  (界说复用率X:若一次读取的一个输入图画与若干数量的卷积核进行卷积运算,则此卷积核的数量占悉数卷积核数量的份额为X。)

  从以上问题中能够剖析得出,RAM资源需求是复用率X的线性函数;运算速率与X无关;数据速率是X的反份额函数。因而本优化问题是关于变量X的非线性优化问题。

  3规划细节剖析

  3.1核算单元规划:串行输入,并行核算

  3.1.1核算单元规划的方针:数据复用

  在卷积运算的核算单元中,咱们期望对数据进行复用,

  并行核算的或许性根植于卷积层的规划中。在全衔接的神经网络的每一层中,每一个输入和每一个输出之间都有一个权重(w),每一个输出都与悉数输入的信息相关;而在卷积神经网络中,存在着卷积核的共用(shared-weight),这使得每个输出图画都包含着一个卷积核关于一切输入图画中特征提取的信息。详细而言,每个卷积核会对一切输入图画的各个区域进行运算处理。所以这种卷积核在卷积核算进程中的重复运用,为并行核算供给了或许。假如咱们能够由这种重复运用的性质,尽量削减关于卷积核数据的读取次数,那么卷积运算的时刻将大大削减。

  输入图画在每一个点上的数据参加卷积运算的次数(乘法)是卷积核的尺度(3×3),不只卷积核的数据在串行核算的进程中被重复读取,输入图画的数据也在被重复读取。在串行核算中,卷积核算的滑动窗口(sliding window)在读取端,每一个点都被重复读取了相应的次数。咱们期望把经过设置一些寄存器,将滑动窗从数据的读取端移动到核算端,完结对输入图画的每一个点进行一次数据读取就完结其在滑动窗中所需进行的一切乘法运算(9次)。也就是说,咱们期望能够串行得从内存中读取数据,每一个点仅进行一次读取就足以完结其在卷积运算的滑动窗中所要进行的9次乘法。

  3.1.2核算单元的规划

  现在,咱们暂时假定从内存中读取来的数据是均匀的流(每个时钟周期读取一个像素点的数据);咱们也暂时假定卷积核是不替换的,也就是指仅有一个卷积核的景象。本节中,咱们关于数据是均匀的流以及只要一个卷积核的状况,规划一个高效的并行核算单元。

  在核算端设置一些缓存以完结卷积核数据和输入图画数据的复用是经过图2和图3中的规划完结的。

  图2 核算单元(processing element)的规划

  图3 核算子(processing unit)的规划

  3.1.3核算单元的作业原理

  卷积核的值直接被保存在核算子的寄存器中,而输入图画从由SRAM构成的移存器一端输入(一起送给第三行的寄存器)。由SRAM移存输出的图画数据也别离送向榜首行和第二行的寄存器。每行的核算子的寄存器之间也被规划为移存联系,数据由第三列送向第二列,再送向榜首列。

  在这种规划下,每一次核算单元在一个时钟周期能够完结9次乘加运算。由此,能够依据规划规范,在合理的时钟频率下得到体系所需求到达的并行度。经过归纳考虑,并行度n为64时能够确保时钟周期的合理且到达100GMAC的运算速率。能够求得所需的时钟周期:

  3.2优化缓存和带宽

  3.2.1运用缓存完结进一步数据复用

  在100GMAC的核算速度下,经过简略的核算能够得知,假如不对已读取的输入图画数据与多个卷积核进行运算,则不行满意带宽资源的需求。依据公式②和图画和卷积核的尺度以及运算速率得出这种状况下体系所需的最小数据速率:

  以上这个大约11G的带宽需求是难以满意的。因而,有必要下降体系关于带宽的需求,片上RAM供给了一种合理的途径。

  经过RAM下降带宽需求的主意如下:卷积核的尺度远小于输入图画的尺度,将很多的卷积核数据储存在片上的价值并不大。假如在读取完一个输入图画后,将其与若干个不同的卷积核进行运算,相当于将相同的数据复用了若干次,使得DDR读写IP有更多时刻进行下一幅输入图画数据的读取。这样就下降了体系关于带宽的要求。需求留意的是,同一幅输入图画与不同的卷积核进行运算的成果需求别离储存在片上,这就造成了关于片上RAM的需求。

  3.2.2不同复用率下的缓存和带宽需求

  正如之前所述,如安在带宽资源需求和片上RAM资源需求之间取舍是本次规划的要点。

  下面依据查询到的数据大致核算不同的复用战略下所需的最小片上RAM容量。

  表1 不同复用率下的缓存和带宽需求

  (*榜首列表明不同的并行战略,X表明每次读入一幅输入图画,与其进行卷积运算的卷积核数量占悉数卷积核数量(1024)的份额;第二列表明不同并行战略下所需的最小片上RAM空间;第三列表明不同战略下的最小数据读取速率)

  3.2.3不同数据带宽下的最小缓存需求

  下面依据DDR产品(以Micron公司为例)的用户阐明中的数据关于四种DDR在不同运转设置下的数据带宽进行核算,并估量最大复用率时所需的片上RAM容量:

  表2 不同DDR的最低缓存需求

  (*各列替换表明不同类型的DDR的读写速度和相应的最小片上RAM容量;各行表明各类DDR在不同作业状况下的不同状况:Long Max(16位宽数据总线,最大数据速率),Long Avr(16位宽数据总线,均匀数据速率),Short Max(8位数据总线,最大数据速率),Short Avr(8位宽数据总线,均匀数据速率))

  4完结结构

  4.1 DDR2的接口规划和测验

  “我是谁?我从哪里来?我要到哪里去?”这是哲学三大终极问题。关于数字体系架构规划,亦是如此:咱们不能只是重视数据的固有性质和体系的运算方法,更不能忽视数据的读写速度和体系的存储结构。

  在本体系中,输入图画、卷积核和运算成果都存储在DDR中,并且输入图画的规划和数据带宽是比较大的,因而DDR的传输速率必然会对整个体系的功率发生非常大的影响。所以规划DDR接口与体系总线并测验其传输速率对错常有必要的。

  在Altera FPGA中,运用Avalon总线接口能够简略高效的组件体系,Avalon总线接口适用于高速数据流,读写寄存器,存储器,以及操控片外设备。这些规范接口在Qsys中有用地规划到组件中,其架构示意图如图4所示。

  图4 Avalon总线示意图

  在此图中,NIOS II处理器运用Avalon-MM接口存取片内组件的操控寄存器和状况寄存器。涣散会集DMA运用Avalon-ST接口发送和接纳数据。四个组件包含运用软件运转在NIOS II处理器上的中止接口服务程序。PLL经过Avalon clock sink接口承受一个时钟,并供给两个时钟源。两个组件包含Avalon-TC接口存取片外存储器。最终,DDR操控器运用Avalon conduit接口存取外部DDR3存储器。

  DDR-SDRAM存储体选用突发传输形式[2]。在此形式下,把多个传递作为一个单元履行,不是独立地处理每个字。突发可进步从器材端口在一个时刻处理多个字时到达较大功率的才能。突发中的朴实效果是为了突发的继续而确定裁定。支撑读写突发的Avalon-MM接口,有必要都支撑读写突发。其读写时序规矩如图5和图6所示。

  图5 Avalon Burst形式 读时序

  时序图中的序号,表明随后的改变:

  1. 在CLK上升沿之后,主器材断语address(A0),burstcount,和read。从器材断语waitrequest,引起除beginbursttransfer之外的一切输入直到另一个时钟周期坚持不变。

  2. 在CLK上升沿从器材捕获A0和burstcount。鄙人一个周期可发动新的传递。

  3. 主器材B驱动address(A1),burstcount和read。从器材断语waitrequest,引起除beginbursttransfer之外的一切输入坚持不变。此刻,从器材最早从榜首个读恳求回来读数据。

  4. 从器材传送有用的readdata和断语readdatavalid,给主器材A传递数据的榜首个字。

  5. 给主器材A的第二个字现已传递。从器材免除readdatavalid暂停读突发。从器材端口可坚持免除readdatavalid恣意时钟周期数。

  6. 给主器材B的榜首个字现已回来。

  图6 Avalon Burst形式 写时序

  时序图中的序号,表明随后的改变:

  1. 主器材断语address,burstcount,write,并驱动writedata的榜首个单元。从器材当即断语waitrequest,表明其没有准备好进行传递。

  2. waitrequest为低电平。从器材捕获addr1,burstcount和writedata的榜首个单元。在传递随后的周期,address和burstcount都被疏忽。

  3. 在CLK时钟上升沿从器材捕获数据的第二个单元。

  4. 突发被暂停直到write被免除。

  5. 在CLK时钟上升沿从器材捕获数据的第三个单元。

  6. 从器材断语waitrequest。在呼应中,一切输出直到另一个时钟周期都坚持不变。

  7. 在CLK时钟上升沿从器材捕获数据的最终一个单元。从器材写突发完毕。

  依照以上规范规划DDR2接口[3],仿真成果如图7所示。

  图7 DDR读取的ModelSim-Altera仿真波形

  在图7中,能够看到读取6个Bank的64位数据需求16个时钟周期的时刻,因而能够核算DDR的读取速率为

  4.2体系完结规划结构图

  图7 体系完结规划结构

  (*IP READ/IP WRITE别离为读端和写端操控DDR IP的状况机,均经过AVALON规范总线与DDR IP相连;FIFO用于跨时钟域传输数据,DDR接口部分与卷积运算部分运用不同的时钟。)

  5试验

  5.1 MATLAB算法验证

  咱们完结关于卷积算法进行了MATLAB验证,并运用随机生成的卷积核对灰度图画进行了卷积运算,成果如图5所示。

  图8 卷积算法的MATLAB验证

  5.2核算单元规划的MATLAB验证

  为了证明卷积核算单元规划的可行性,咱们在MATLAB上编写了核算单元的代码,并运用MNIST数据会集的图片和随机生成的卷积核进行了试验。试验成果如图6所示。

  图9 核算单元规划的MATLAB验证

  参考文献:

  [1]中星微电子集团:深度学习——卷积神经网络(CNN)优化

  [2]Chen Zhang, Peng Li, Guangyu Sun, Yijin Guan, Bingjun Xiao, Jason Cong. Optimizing FPGA-based Accelerator Design for Deep Convolutional Neural Networks.

  [3] Y. Lecun, L. Bottou, Y. Bengio, and P. Haffner. Gradient-based learning applied to document recognition. Processing of the IEEE, 86(11):2278-2324, 1998.

  [4] Xilinx/Micron: Micron DRAM Memory Support for Xilinx Platforms

  附录

  附录A:卷积算法MATLAB验证代码:

 %small scale test for convolutional unit

  %fixed size: 224*300, image: 'bbtest.jpg', fixed number of channels: in:3, out:3

  %read image

  im = imread('bbtest.jpg');

  im_input = permute(im, [3, 1, 2]); %exchanging dimension

  %initialize kernel

  kernels = rand(3, 3, 3, 3) .* 0.005 %kernel size: 3*3, range: 1~0.005

  %initialize output figure

  output_fm = zeros(3, 300, 224);

  %image processing

  R = 300, C = 224, M = 3, N = 3, S = 1; %size of input image and input, output channels

  for row = 1:R-3

  for col = 1:C-3

  for to = 1:M

  for ti = 1:N

  for i = 1:3

  for j = 1:3

  output_fm(to, row, col) = output_fm(to, row, col)…

  + kernels(to, ti, i, j) * im_input(ti, S * row + i, S * col + j);

  end

  end

  end

  end

  end

  end

  %show the images

  output_fm;

  output_show = permute(output_fm, [2, 3, 1]);

  imshow(output_show);

  附录B:核算单元规划MATLAB验证代码:

  % testing the processing element

  % time: 13:40; 3.16.2017

  % initializing buffers

  procwin = zeros(3, 3);

  kernel = rand(3, 3) * 0.005;

  buffer1 = zeros(25);

  buffer2 = zeros(25);

  R_pixel = zeros(1,784); % cauculating result for single pixels

  % loading data

  data = ones(784);

  im = imread('test.jpg');

  data = reshape(im,1,784);

  % initializing data

  procwin(1, 🙂 = data(1: 3);

  buffer1 = data(4: 28);

  procwin(2, 🙂 = data(29: 31);

  buffer2 = data(32: 56);

  procwin(3, 🙂 = data(57: 59);

  %cauculating

  for i = 60:784

  % cauculating pixel level result

  for m = 1:3

  for n = 1:3

  R_pixel(i-59) = R_pixel(i-59) + procwin(m,n) * kernel(m,n);

  end

  end

  % moving data in processing window

  reg2 = procwin(2, 1); % preserve for moving into ram

  reg3 = procwin(3, 1); % preserve for moving inro ram

  for j = 1:2

  procwin(:, j) = procwin(:, j+1);

  end

  procwin(1, 3) = buffer1(1);

  procwin(2, 3) = buffer2(1);

  procwin(3, 3) = data(i);

  % moving data in ram

  for j = 1:24

  buffer1(j) = buffer2(j+1);

  buffer2(j) = buffer2(j+1);

  end

  buffer1(25) = reg2;

  buffer2(25) = reg3;

  end

  im_output = reshape(R_pixel,28,28);

  imshow(im_output);

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/ic/159477.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部