主要内容

开始深入学习Xilinx ZCU102 SoC上的FPGA部署

这个示例展示了如何创建、编译和部署dlhdl。工作流使用Xilinx FPGA和SoC的深度学习HDL工具箱™支持包,以一个手写字符检测系列网络作为网络对象。金宝app使用MATLAB®从目标设备检索预测结果。

先决条件

  • Xilinx ZCU102 SoC开发工具包。

  • 深度学习HDL工具箱™

  • 用于Xilinx FPGA和SoC的深度学习HDL工具金宝app箱™支持包

  • 深度学习工具箱™

加载预训练的串联网络

为了加载已经过国家技术标准研究所(MNIST)数据库训练的预先训练的系列网络,输入:

snet = getDigitsNetwork ();

要查看预先训练的系列网络的层,输入:

analyzeNetwork (snet)

创建目标对象

创建一个目标对象,该对象具有目标设备的自定义名称和连接目标设备到主机的接口。接口选项有JTAG和Ethernet。

hTarget = dlhdl。目标(“Xilinx”“接口”“以太网”
hTarget = Target with properties: Vendor: 'Xilinx' Interface: Ethernet IPAddress: '192.168.1.101' Username: 'root' Port: 22

创建工作流对象

对象的对象dlhdl。工作流类。在创建对象时指定网络和位流名称。指定保存的预先训练的MNIST神经网络snet作为网络。确保位流名称与您的目标数据类型和FPGA板匹配。在本例中,目标FPGA板为Xilinx ZCU102 SOC板,位流使用单一数据类型。

hW=dlhdl.Workflow(“网络”snet,“比特流”‘zcu102_单’“目标”,hTarget)
hW =带有属性的工作流:Network: [1×1 SeriesNetwork] Bitstream: 'zcu102_single' ProcessorConfig: [] Target: [1×1 dlhdl. hW = []目标]

编制MNIST系列网络

要编译MNIST系列网络,请运行dlhdl。工作流对象

dn = hW.compile;
###编译网络深度学习FPGA原型…### FPGA bitstream zcu102_single…###网络包括以下几层:1“imageinput”图像输入28××28日1图像“zerocenter”正常化(SW层)2的conv_1卷积8 3×3×1的隆起与步幅[1]和填充“相同”(HW层)3的batchnorm_1批量标准化批量标准化与8通道(HW层)4的relu_1 ReLU ReLU (HW层)5“maxpool_1”马克斯池2×2马克斯池步[22]和填充[0 0 0 0](HW层)6的conv_2卷积16 3×3×8旋转步[1]和填充“相同”(HW层)7“batchnorm_2”批量标准化批量标准化16通道(HW层)8“relu_2”ReLU ReLU (HW层)9“maxpool_2”马克斯池2×2马克斯池步(2 - 2)和填充[0 0 0 0](HW层)10“conv_3”卷积32 3×3×16旋转步[1]和填充“相同”(HW层)11的batchnorm_3批量标准化批量标准化与32通道(HW层)12的relu_3 ReLU ReLU (HW层)13 fc的完全连接10完全连接层(HW层)14的softmax softmax softmax(层)西南15 classoutput分类输出crossentropyex与'0'和9个其他类(SW层)创建3个内存区域。编译段:conv_1>>relu_3…###优化系列网络:融合' net.cnn. Layer . batchnormalizationlayer '到' net.cnn. Layer . convolution2dlayer '###注意:(图层10)类型为“net.cnn. Layer . regressionoutputlayer”的图层“output”是在软件中实现的。 Compiling leg: conv_1>>relu_3 ... complete. Compiling leg: fc ... ### Notice: (Layer 1) The layer 'data' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: (Layer 3) The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: fc ... complete. Skipping: softmax Skipping: classoutput Creating Schedule... ....... Creating Schedule...complete. Creating Status Table... ...... Creating Status Table...complete. Emitting Schedule... ...... Emitting Schedule...complete. Emitting Status Table... ........ Emitting Status Table...complete. ### Allocating external memory buffers: offset_name offset_address allocated_space _______________________ ______________ ________________ "InputDataOffset" "0x00000000" "4.0 MB" "OutputResultOffset" "0x00400000" "4.0 MB" "SchedulerDataOffset" "0x00800000" "4.0 MB" "SystemBufferOffset" "0x00c00000" "28.0 MB" "InstructionDataOffset" "0x02800000" "4.0 MB" "ConvWeightDataOffset" "0x02c00000" "4.0 MB" "FCWeightDataOffset" "0x03000000" "4.0 MB" "EndOffset" "0x03400000" "Total: 52.0 MB" ### Network compilation complete.

将比特流编程到FPGA上并下载网络权重

当需要在Xilinx ZCU102 SoC硬件上部署网络时,需要运行Xilinx的deploy功能dlhdl。工作流对象。此函数使用编译函数的输出通过编程文件对FPGA板进行编程。它还下载网络权重和偏差。部署函数开始对FPGA设备进行编程,显示进度消息以及部署网络所需的时间。

硬件部署
###使用以太网编程FPGA位流。。。通过以太网将目标FPGA设备配置下载到SD卡…#复制/tmp/hdlcoder\u rd到/mnt/hdlcoder\u rd#复制位流hdlcoder\u system.bit到/mnt/hdlcoder\u rd#设置位流到hdlcoder\u rd/hdlcoder\u system.bit#复制设备树设备树dlhdl.dtb到/mnt/hdlcoder\u rd#设置设备树到hdlcoder\u rd/Devicetree\u dlhdl.dtb#设置引导以供参考设计:“AXI内存访问:3”通过以太网将目标FPGA设备配置下载到SD卡完成。系统现在将重新启动以使持续更改生效。系统正在重新启动FPGA位流编程已成功完成将重量加载到Conv处理器。###已加载Conv砝码。当前时间为2020年12月30日15:13:03################将权重加载到FC处理器已加载FC权重。当前时间为2020年12月30日15:13:03

运行预测,例如图像

要加载示例图像,请执行dlhdl。工作流对象,然后显示FPGA结果,输入:

inputImg = imread (“five_28x28.pgm”); imshow(inputImg);

在配置文件“打开”的情况下运行预测,以查看延迟和吞吐量结果。

[prediction, speed] = hW.predict(single(inputImg),“配置文件”“上”);
###完成写入输入激活。###运行单输入激活。深度学习处理器Profiler性能结果LastFrameLatency(cycles) LastFrameLatency(seconds) FramesNum Total Latency Frames/s ------------- ------------- --------- --------- --------- Network 98117 0.00045 1 98117 2242.2 conv_1 6607 0.00003 maxpool_1 4716 0.00002 conv_2 4637 0.00002 maxpool_2 2977 0.00001 conv_3 6752 0.00003 fc 724280.00033 * DL处理器的时钟频率为:220MHz
[val, idx] = max(预测);流('预测结果为%d\n',idx-1);
预测结果为5

相关话题