主要内容

网络性能改善

这个例子展示了如何提高部署的深入学习网络的性能,通过识别瓶颈层从分析器的结果。

先决条件

  • Xilinx®ZCU102 SoC开发工具包。

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

  • 深度学习工具箱™

  • 深度学习HDL工具箱™

加载Pretrained SeriesNetwork

加载pretrained系列数字网络,输入:

snet = getDigitsNetwork ();%的查看层pretrained系列网络,输入:snet.Layers
ans = 15×1层阵列层:1“imageinput”图像输入28××28日1图片2”zerocenter“正常化”conv_1卷积8 3×3×1的隆起与步幅[1]和填充“相同”3“batchnorm_1”批量标准化批量标准化8通道4的relu_1 ReLU ReLU 5“maxpool_1”马克斯池2×2马克斯池步(2 - 2)和填充[0 0 0 0]6‘conv_2卷积16 3×3×8旋转步[1]和填充“相同”7”batchnorm_2批量标准化批量标准化与16通道8 ' relu_2 ReLU ReLU 9“maxpool_2”马克斯池2×2马克斯池步(2 - 2)和填充[0 0 0 0]10 conv_3的卷积32 3×3×16步[1]和填充的卷积‘相同’11“batchnorm_3”批量标准化批量标准化32通道12“relu_3”ReLU ReLU 13 fc的完全连接10完全连接层14的softmax softmax softmax 15“classoutput”分类输出crossentropyex与其他“0”和9类

创建目标对象

创建一个目标对象,有一个自定义名称为你的目标设备和一个接口来连接你的目标主机设备。JTAG接口选项和以太网。以太网接口,输入:

hTarget = dlhdl.Target (“Xilinx”,“界面”,“以太网”);

使用JTAG接口,安装Xilinx™Vivado™2019.2设计套件。设置安装路径Xilinx Vivado执行如果尚未设置。例如,设置路径,输入:

% hdlsetuptoolpath (“ToolName”、“Xilinx Vivado”、“路径”,“C: \ Xilinx \ Vivado \ 2019.2 \ bin \ vivado.bat ');

JTAG接口,输入:

% hTarget = dlhdl.Target (“Xilinx”、“接口”,“JTAG”);

创建工作流对象

创建一个对象dlhdl.Workflow类。当您创建对象,指定网络和比特流的名字。指定保存的pretrained数字神经网络、snet网络。确保比特流名称匹配的数据类型和FPGA板你的目标。在这个例子中,目标FPGA板Xilinx ZCU102 SOC。比特流使用一个数据类型。

hW = dlhdl.Workflow (“网络”snet,“比特流”,“zcu102_single”,“目标”,hTarget);%%如果运行在Xilinx ZC706板,而不是上面的命令,%取消下面的命令。%% hW = dlhdl。snet工作流(“网络”,“比特流”、“zc706_single”,“目标”,hTarget);

编译MNIST系列网络

编译MNIST系列网络运行的编译功能dlhdl.Workflow对象。

dn = hW.compile;
# # #系列优化网络:融合“nnet.cnn.layer.BatchNormalizationLayer”到“nnet.cnn.layer.Convolution2DLayer”offset_name offset_address allocated_space ___________ _______________________ * * *“InputDataOffset”“0 x00000000”“4.0 MB”“OutputResultOffset”“0 x00400000”“4.0 MB”“SystemBufferOffset”“0 x00800000”“28.0 MB”“InstructionDataOffset”“0 x02400000”“4.0 MB”“ConvWeightDataOffset”“0 x02800000”“4.0 MB”“FCWeightDataOffset”“0 x02c00000”“4.0 MB”“EndOffset”“0 x03000000”“总:48.0 MB”

程序比特流到FPGA和下载网络权重

部署网络在Xilinx ZCU102 SoC硬件,运行部署的功能dlhdl.Workflow对象。这个函数使用编译函数程序的输出FPGA板通过编程文件。它也可以下载网络权重和偏见。

hW.deploy;
# # #编程的FPGA比特流使用以太……下载目标FPGA在以太网设备配置SD卡……# / tmp / hdlcoder_rd复制到/ mnt / hdlcoder_rd # hdlcoder_system拷贝比特流。位/ mnt / hdlcoder_rd #集hdlcoder_rd / hdlcoder_system比特流。位#复制Devicetree devicetree_dlhdl。dtb / mnt / hdlcoder_rd #集Devicetree hdlcoder_rd / devicetree_dlhdl。dtb #为参考设计设置引导:“AXI-Stream DDR内存访问:3-AXIM”下载目标FPGA在以太网设备配置SD卡。系统现在将重启持久更改生效。系统重启,。。# # #编程的FPGA比特流已成功完成。# # #装载重量FC的处理器。# # # FC重量加载。 Current time is 28-Jun-2020 12:24:21

加载示例图片

加载示例图像。

inputImg = imread (“five_28x28.pgm”);

运行预测

执行的预测功能dlhdl.Workflow对象,有配置文件选项设置为“上”显示延迟和吞吐量结果。

[~,速度]= hW.predict(单(inputImg),“配置文件”,“上”);
# # #写完输入激活。# # #运行单个输入激活。深度学习处理器分析器性能结果LastLayerLatency(周期)LastLayerLatency总延迟(秒)FramesNum帧/ s - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -网络73231 0.00033 6618 0.00003 73273 3002.5 conv_module 26847 0.00012 conv_1 maxpool_1 0.00002 4823 0.00002 conv_2 4876 0.00002 3551年maxpool_2 conv_3 7039 0.00021 0.00021 0.00003 fc_module 46384 fc 46384 * DL处理器的时钟频率是:220 mhz

识别和显示瓶颈层

删除NumFrames,总延迟,帧/秒从分析器的结果表。这包括移除模块级和网络级性能分析结果。仅保留网络层分析器的结果。一旦确定了瓶颈层显示瓶颈层指标,运行时间,和信息。

速度(“网络”:)= [];速度(“____conv_module”:)= [];速度(“____fc_module”:)= [];速度= removevars(速度,{“NumFrames”,的总延迟时间(周期),帧/秒的});%然后分析器的结果排序在降序排序速度= sortrows(速度,的延迟时间(周期),“下”);%概要表中的第一行是瓶颈层。因此,%以下:layerSpeed =速度(1);layerName =地带(layerSpeed.Properties.RowNames {1},“_”);idx = 1:长度(snet.Layers) currLayer = snet.Layers (idx);如果比较字符串(currLayer。名字,layerName) bottleNeckLayer = currLayer;打破;结束结束%显示瓶颈层指数dnnfpga.disp ([“瓶颈层指数”num2str (idx),“。”]);
# # #瓶颈层指数是13岁。
%显示瓶颈层运行时间的百分比% = layerSpeed。(“延迟(周期)”)/笔(速度。“延迟(周期)”))* 100;dispStr = sprintf (这约占% 0.2 f总运行时间的百分比。,%);dnnfpga.disp (dispStr);
# # #它约占63.29%的总运行时间。
%显示瓶颈层信息dnnfpga.disp (的瓶颈层信息:);
# # #瓶颈层信息:
disp (currLayer);
FullyConnectedLayer属性:名称:“俱乐部”Hyperparameters InputSize: 1568 OutputSize: 10可学的参数权重:(10×1568单)偏见:(10×1个)显示所有属性