《使用FPGA实现深度学习技术应用.docx》由会员分享,可在线阅读,更多相关《使用FPGA实现深度学习技术应用.docx(10页珍藏版)》请在第一文库网上搜索。
1、使用FPGA实现深度学习技术应用这是新的系列教程,在本教程中,我们将介绍使用EEGA实现深度学习的技术,深度学习是近年来人工智能领域的热门话题。在本教程中,旨在加深对深度学习和FPGA的理解。用CC+编写深度学习推理代码高级综合(H1S)将C/C+代码转换为硬件描述语言FPGA运行验证在上一篇文章中,我们在MNIST数据集上创建并训练了一个网络模型。从本文开始,为了在FPGA上运行推理处理,我们将首先用C编写推理处理代码。在这篇C+实现的第一篇文章中,我们开始针对卷积层的C+实现。具体内容是(D卷积层的实现,(2)运算校验(C验证,C/RT1协同验证)(就是H1S的流程)卷积层实现在上一篇文章
2、中,我解释了卷积层是对图像的过滤过程,但是并没有解释输入输出通道如何处理,过滤时图像的边缘处理等。由于本文旨在实现层面的理解,因此我将详细介绍这些要点。处理I/O通道在图像处理中,对RGB输入图像进行噪声去除等滤波处理,并频繁地进行RGB图像的处理。在这种情况下,卷积过程往往是针对每个通道(R/G/B)独立完成的,输入的G/B通道值不影响输出的R通道结果。每通道独立卷积另一方面,在卷积层中执行的卷积过程中,所有输入通道的值影响每个输出通道。因此,对于输出图像的每个像素(输出通道,Y坐标,X坐标),所有输入通道和周围的像素区域都会参与计算,导致计算量非常大。使用所有通道的卷积另外,如上所述每个通
3、道独立卷积的卷积层称为DePthWiSeConvo1utj.ono这通常用于减少计算量的网络模型,例如Mobi1eNet(https:/arxiv.org/abs/1704.04861)0图像边缘处理在对图像进行卷积处理时,图像边缘的处理往往是一个问题。由于卷积过程在计算某个像素时使用了周围像素,因此对于没有周围像素的像素,例如图像边缘的像素,就无法获取周围像素。卷积独幽络主要通过以下两种方式处理边缘像素。无填充:输出图像减少了输入图像的卷积区域。补零:将输入图像预先用卷积区域扩展,用零填充该区域,对原始输入图像进行卷积处理。没有填充的卷积的图形表示如下所示:在这种情况下,输出图像将是比输入图
4、像小一个滤波蛰尺寸的区域(橙色部分)。如果内核大小为3(中心像素+/-1),则输出图像大小在宽度和高度上都将为-2,因为图像之外的1个像素是无法进行卷积的区域。无填充卷积:输出图像缩小接下来,零填充的图形表示如下所示。在这个例子中,预先在输入图像的外部添加了一个值为O的区域(灰色区域),进行卷积,这样就不会出现图像缩小现象。如果内核大小为3,则带填充的输入图像大小在宽度和高度上均为+2,因为1像素将添加到屏幕外部且值为零。零填充卷积:输出图像大小保持不变在我们的模型中,我们在所有卷积层中使用零填充。C代码如果根据目前为止的解释用C语言实现卷积过程,它将类似于下面的代码。voidconv2d(c
5、onstf1oat*x,constf1oat*weight,constfIoat*bias,int32twidth,int32theight,int32tinchanne1s,int32_toutchanne15, int32tksize,f1oat*y)for(int32toch=O;ochoutchanne1s;+och)for(int32th=O;hheight;+h)for(int32tw=O;wwidth;+w)f1oatsum=O.f;for(int32_tich=O;ichin_channe1s;+ich)for(int32_tkh=O;khksize;+kh)(for(int3
6、2_tkw二O;kwksize;+kw)int32_tph=h+kh-ksize/2;int32_tpw-w/zeropadding+kw-ksize/2;pwOif(ph=width)Ph=heightcontinue;ph)anne1s*width+ich)int64_tpw;int64_t*ksize+kh)*pixidx=(ich*height+weight_idx=ksize+kw;(och*in_chsum+=xpix_idx*weightweight_idx;)/addbiassum=biasoch;y(och*height+h)*width+w=sum;)此函数的解释如下所示:
7、输入- -x:输入图像。shape=(inchanne1s,height,width)一weight:权重因子。shape=(out_channe1s,in_channe1s,ksize,ksize)一bias:偏置值。shape=(out_channe1s)输出- -y:输出图像。shape-(out_channe1s,height,width)参数:一width:输入/输出图像的宽度- height:输入/输出图像高度一inchanne1s:输入图像的通道数- -out_channe1s:输出图像的通道数一ksize:内核大小每个输入/输出的内存布局shape=(.)如表格所示,但f1oa
8、txin_channe1sheightwidth;将其视为定义为三维数组。卷积层的处理是一个6级循环。第一个三级循环确定输出图像上的位置,随后的三级循环对该位置执行卷积操作。零填充在第24-26行完成。由于实际创建零填充输入图像是低效的,所以零填充是通过在访问图像外部时不参与乘积之和来实现的。第31行是卷积过程中的积和运算部分,这个积和运算outchanne1s*height*width*in_channe1s*ksize*ksize进行了两次。这个卷积过程的操作数量非常大,足很多情况下,卷积层支配着卷积神经网络的执行时间。这就是为什么计算单元比强多的但组和FPGA更适合处理神经网络。第37行
9、是偏差处理部分。到目前为止,我还没有触及什么是偏差处理,但正如我在这里所写的那样,它是一个简单地对输出值进行偏移的过程。这种偏差处理在输入通道/内核大小(Y,X)循环之外,因此处理步骤的数量非常微不足道。运算检查作为对上一节创建的函数运行的确认,conv2d我们将比较结果是否足够接近在PyTorch的C+API(Iibtorch)上执行的卷积计算。每个测试包括以下两个步骤。C.验证C/RT1协同验证1、C验证类似于正常的软件开发,gcc只是用通用的编译器编译源代码并检查结果。2、C/RT1协同验证是使用AMD-Xi1inx提供的高阶综合工具VitisH1S进行验证。对于此验证,H1S首先将C源
10、代码转换为Veri1ogHD1等RT10然后在Vivado中对生成的RT1执行功能仿真。在这个逻辑仿真中,将一个类似于C验证的数据序列输入到创建的电路中,确认输出结果是否正确。本节以后的内容将以运行创建的源代码的形式进行说明。源代码将在后面发布。运行环境运行环境面向1inUX机器。不支持Windows/Mac操作系统。此外,由于预装gcc版本,该发行版针对Ubuntu18.04o难以自行准备运行环境的朋友,看看就行。需要以下工具。Vivado2023.2(2019.2)cmake=3.11Cmake比较麻烦,因为它需要的版本比apt等包管理器可以安装的版本高,但是可以王瑟预构建的二进制文件(c
11、make-1inux-x86_64.tar.gz)0C.验证测试代码/拴stsrcfCOnv2d.cc的使用,我不会在本文中详细介绍,但测试将是一个正常的随机测试。可以按照以下步骤构建代码。请将-也VAD(1H1S_R00T的值相应地替换为安装的Vivado的路径。$mkdir/bui1d$Cd/bui1d$cmake.-DVIVAD0_H1S_R00T=/1oo1s/Xi1inx/Vivado/2023.2$cmake-bui1d.使用以下命令进行测试:如果没有任何错误,那它就是成功的。$ctest-V-Rconv2d_refC/RT1协同验证运行以下命令以使用H1S启动C/RT1协同验证。
12、大约需要5分钟。$ctest-V-R,conv2dhisCoSinr当执行C/RT1协同验证时,会自动创建一个H1S项目文件,因此可以使用它来检查高级综合和RT1仿真波形的结果。要检查这一点,请使用以下命令启动H1S:$vitis_h1s&H1S打开后,单击“打开项目”,如下所示,导航到bui1dtestsh1sconv2dconv2dhiscosim目录并单击“确定。H1eEdi1PreVkHH1SWWcowPMXX1INXVITIS1NetJ)1sFI1XFPCAH1SesO2Viv4fo,h1s1NtJny.detectorH:FI1EJHSede-cany.(Jetectpredfe-
13、cnydetectrOPENRECENTVITISH1SRESOURCESTutoria1sCserGuideRe1easeNottsPROJECTCreateProjectOpenProjectC1oneExaap1s然后,H1S综合报告将显示如下屏幕所示。从此报告中,可以看到从PerformanceEstimates列创建的电路的估计性能,以及从Uti1izationEstimates看到在目标设备上实施时的估计资源使用情况。点击顶部红框包围的区域,可以看到仿真的波形。Fi1eEditProjectSo1utionWindowHe1p.。屈G窗检局UA叼田匐&同6rJSynthesis(s
14、o1ution1)(conv2dh1scsynth.rpt)汉Genera1InformationDate:Version:FriJuI1005:52:0520232019.2(Bui1d2698951onThuOct2419:15:34MDT2019)Project:So1ution:conv2dhiscosimSo1ution1Productfami1y:Virtexup1usTargetdevice:cu200-fsgd2104-2-ePerformanceEstimatesTimingBSummaryC1ockTargetEstimatedUncertaintyap_c1k5.00ns4.087ns0.62nsB1atencyBSummary1atency(cyc1es)1atency(abso1ute)Interva1(cyc1es)minmaxminmaxminmaxType?noneDetai1SInstanceAvai1ab1eAvai1ab1eS1RUti1ization(%)Uti1izationS1R(%)S1oopNameBRAM_18KDSP48EFF1UTURAMDSP-Expression-