基于TensorRT的深度学习网络代码生成
使用GPU Coder™,您可以从deep learning Toolbox™生成用于预测各种经过训练的深度学习网络的优化代码。生成的代码通过使用您在输入中指定的架构、层和参数来实现深度卷积神经网络(CNN)SeriesNetwork
(深度学习工具箱)或DAGNetwork
(深度学习工具箱)对象。您可以配置代码生成器以利用NVIDIA®TensorRT™用于NVIDIA gpu的高性能推理库。TensorRT通过组合网络层和优化内核选择,提高了延迟、吞吐量和内存效率。您还可以配置代码生成器以利用TensorRT的精确模式(FP32、FP16或INT8)来进一步提高性能并减少内存需求。生成的代码可作为源代码、静态或动态库或可部署到各种NVIDIA GPU平台的可执行文件集成到项目中。
请注意
上不支持TensorRT工作流金宝appMATLAB®在线™.
使用以下方法之一为卷积网络生成代码:
标准的
codegen
生成CUDA的函数®代码从MATLAB的入口点函数。GPU编码器应用程序,从MATLAB入口点函数生成CUDA代码。
请注意
在以前的版本中,您可以使用cnncodegen
函数。从R2021a开始,cnncodegen
函数生成c++代码并生成仅用于ARM的文件®Mali GPU处理器。
使用GoogLeNet生成代码和分类图像
在这个例子中,您使用GPU Coder为预训练生成CUDA代码googlenet
(深度学习工具箱)深度卷积神经网络对图像进行分类。GoogLeNet已经在超过100万张图像上进行了训练,可以将图像分为1000个对象类别(例如键盘、咖啡杯、铅笔和动物)。该网络已经为广泛的图像学习了丰富的特征表示。该网络将图像作为输入,然后输出图像中对象的标签,其中包含每个对象类别的概率。方法为预训练的网络生成代码codegen
命令和GPU编码器应用程序。
这个例子使用32位浮点数(默认值)作为张量输入的精度。要了解关于对张量使用8位整数精度的更多信息,请参阅基于NVIDIA TensorRT库的深度学习预测的例子。
需求
要求
此示例生成具有以下附加需求的CUDA MEX。
深度学习工具箱。
GoogLeNet网络深度学习工具箱模型金宝app支持包。
用于深度学习库的GPU编码器接口金宝app支持包。
CUDA支持NVIDIA GPU和兼容的驱动程序。对于8位整数精度,CUDA GPU必须具有6.1、7.0或更高的计算能力。半精度要求CUDA GPU具有5.3、6.0、6.2或更高的最低计算能力。
可选
对于非mex构建,例如静态、动态库或可执行文件,此示例具有以下附加要求。
CUDA工具包,cuDNN和TensorRT库。有关编译器和库的受支持版本的信息,请参见金宝app安装必备产品下载188bet金宝搏.
编译器和库的环境变量。有关更多信息,请参见环境变量.
负荷预训练网络
加载预先训练好的GoogLeNet网络。您可以选择加载不同的预训练网络进行图像分类。如果您没有安装所需的支持包,该软件提供了下载链接。金宝app
Net = googlenet;
的对象
网
包含了DAGNetwork
对象。使用analyzeNetwork
(深度学习工具箱)功能,用于显示网络体系结构的交互式可视化,检测网络中的错误和问题,并显示有关网络层的详细信息。层信息包括层激活和可学习参数的大小,可学习参数的总数,循环层状态参数的大小。analyzeNetwork(净);
要分类的图像必须与网络的输入大小相同。对于GoogLeNet,大小
imageInputLayer
(深度学习工具箱)是224 - 224 - 3。的类
输出的属性classificationLayer
(深度学习工具箱)包含网络学习到的类的名称。从1000个类名中随机查看10个。classNames = net.Layers(end).Classes;numClasses = numel(classNames);disp(类名(randperm (numClasses 10)))
“快艇”、“纱窗”、“等足类动物”、“木勺”、“口红”、“公鸭”、“鬣狗”、“哑铃”、“草莓”、“蛋奶苹果”
有关更多信息,请参见深度学习层列表(深度学习工具箱).
创建入口点函数
在MATLAB中编写一个入口点函数:
使用
coder.loadDeepLearningNetwork
函数来加载深度学习模型,并构造和设置CNN类。有关更多信息,请参见为代码生成加载预训练的网络.调用
预测
(深度学习工具箱)来预测反应。
例如:
函数Out = googlenet_predict(in)% # codegen持续的mynet;如果mynet = code . loaddeeplearningnetwork (mynet)“googlenet”);结束输入合格率Out = predict(mynet,in);
持久对象
mynet
加载DAGNetwork
对象。在第一次调用入口点函数时,构造并设置持久对象。在对该函数的后续调用中,将重用相同的对象来调用预测
在输入时,避免重构和重新加载网络对象。请注意
代码生成需要将网络加载到持久对象中。
你也可以使用
激活
(深度学习工具箱)方法来为特定层进行网络激活。例如,下面这行代码返回中指定的层的网络激活layerIdx
.out =激活(mynet,in,layerIdx,'输出','通道');
你也可以使用
分类
(深度学习工具箱)方法来预测图像数据的类标签在
使用训练过的网络,mynet
.[out,scores] = category (mynet,in);
对于LSTM网络,还可以使用
predictAndUpdateState
(深度学习工具箱)而且resetState
(深度学习工具箱)方法。有关这些方法的使用注意事项和限制,请参见金宝app支持功能表格
使用代码生成codegen
要配置生成设置(如输出文件名、位置和类型),可以创建编码器配置对象。要创建对象,使用
coder.gpuConfig
函数。例如,在生成CUDA MEX时使用codegen
命令,使用cfg = code . gpuconfig ('mex');
其他可用的选项有:
cfg = code . gpuconfig ('lib');
,以创建用于的代码生成配置对象codegen
当生成CUDA C/ c++静态库时。cfg = code . gpuconfig ('dll');
,以创建用于的代码生成配置对象codegen
当生成CUDA C/ c++动态库时。cfg = code . gpuconfig ('exe');
,以创建用于的代码生成配置对象codegen
当生成CUDA C/ c++可执行文件时。
要指定TensorRT的代码生成参数,请设置
DeepLearningConfig
属性。编码器。TensorRTConfig
创建的对象编码器。DeepLearningConfig
.cfg = code . gpuconfig (墨西哥人的);cfg。TargetLang =“c++”;cfg。DeepLearningConfig =编码器。DeepLearningConfig (“tensorrt”);cfg.DeepLearningConfig.DataType =“fp32”;
方法指定受支持层中推理计算的精度金宝app
数据类型
财产。在32位浮点数中执行推理时,使用“fp32”
.对于半精度,使用“fp16”
.对于8位整数,使用“int8”
.默认值为“fp32”
.INT8
精度要求CUDA GPU具有6.1、7.0或更高的计算能力。FP16
精度要求CUDA GPU具有5.3、6.0、6.2或更高的计算能力。使用ComputeCapability
的属性GpuConfig
对象来设置适当的计算能力值。当你选择
“INT8”
选项,TensorRT将浮点数据量化为int8
.该校准是用简化的校准数据集进行的。所指定的图像数据位置必须显示校准数据DataPath公司
.在校准之前必须对图像进行预处理,并且在代码生成之前必须将预处理步骤包含在入口点文件中。通过使用NVIDIA TensorRT库和8位整数精度的推理计算来生成代码,支持这些额外的网络:金宝app
对象检测器网络,如YOLOv2和SSD。
回归和语义分割网络。对于语义分割网络,重新校准的图像必须采用支持的格式金宝app
imread
函数。
看到基于NVIDIA TensorRT库的深度学习预测例如,使用TensorRT对标识分类网络进行8位整数预测。
运行
codegen
命令。的codegen
命令生成CUDA代码googlenet_predict.m
MATLAB入口点函数。codegen配置cfggooglenet_predictarg游戏{1 (224224 3)}报告
的
报告
选项指示codegen
生成可用于调试MATLAB代码的代码生成报告。的
arg游戏
选项指示codegen
编译文件googlenet_predict.m
通过使用为输入指定的类、大小和复杂度在.的值(224224年,3)
对应于GoogLeNet网络的输入层大小。的
配置
选项指示codegen
使用指定的配置对象进行代码生成。
请注意
您可以为代码生成指定半精度输入。但是,代码生成器类型将输入强制转换为单精度。深度学习工具箱对MATLAB中的所有计算使用单精度浮点算法。类在代码生成期间,可以启用半精度(16位浮点)输入的推断
数据类型
的属性编码器。TensorRTConfig
作为“fp16”
.代码生成器默认使用列主布局。要使用行主布局传递
-rowmajor
选项。codegen
命令。控件配置行主布局的代码cfg。RowMajor
参数。当代码生成成功时,您可以通过单击查看结果代码生成报告查看报告在MATLAB命令窗口中。报表显示在“报表查看器”窗口中。如果代码生成器在代码生成过程中检测到错误或警告,则报告将描述问题并提供到有问题的MATLAB代码的链接。看到代码生成报告.
代码生成成功:查看报告
生成的代码
DAG网络生成为包含144个层类数组的c++类。类声明的片段googlenet_predict_types.h
文件显示。
的
设置()
方法设置句柄并为网络对象的每一层分配内存。的
预测()
方法调用对网络中144层中的每一层的预测。的
DeepLearningNetwork.cu
属性的对象函数的定义b_googlenet_0
类。
网络中有参数的层导出二进制文件,如全连接层和卷积层。例如,文件cnn_googlenet_conv * _w
而且cnn_googlenet_conv * _b
的权重和偏置参数对应卷积
网络中的层。代码生成器将这些二进制文件放在codegen
文件夹中。
默认情况下,生成的应用程序在codegen
文件夹中。如果要将生成的应用程序和权重文件重新定位到不同的位置,例如嵌入式板,则创建名为USER_DL_DATA_PATH
,它的值是重定位权重文件的位置。然后,生成的应用程序将在此位置查找权重文件。
请注意
在Windows上®系统中,一些防病毒软件,如Bit Defender,可以错误地识别一些权重文件被感染并删除它们。这些情况是假阳性,文件可以标记为安全在您的反病毒程序。
在生成的代码文件中googlenet_predict.cu
为入口点函数googlenet_predict ()
的静态对象b_googlenet_0类类型,并在此网络对象上调用setup和predict。
使用应用程序生成代码
要指定入口点函数和指定输入类型,请在应用程序中完成该过程代码生成使用GPU编码器应用程序.
在生成代码步骤:
设置
构建类型
来墨西哥人
.点击更多的设置.在深度学习窗格中,设置目标库来TensorRT.
关闭设置窗口。如需生成CUDA代码,请单击生成.
生成Makefile
为“自由”
,“dll”
,exe”
目标时,代码生成器将创建* _rtw.mk
在codegen
文件夹中。在此make文件中,生成的代码的位置通过使用START_DIR
变量中找到的宏
部分。默认情况下,此变量指向生成代码的当前工作文件夹的路径。如果您计划移动生成的文件并使用makefile进行构建,请替换生成的值START_DIR
使用适当的路径位置。
运行生成的MEX
要分类的图像必须与网络的输入大小相同。读取要分类的图像,并将其调整为网络的输入大小。这种调整会略微改变图像的纵横比。
Im = imread(“peppers.png”);inputLayerSize = net.Layers(1).InputSize;im = imresize(im,inputLayerSize(1:2));
调用GoogLeNet对输入图像进行预测。
Predict_scores = googlenet_predict_mex(im);
以直方图的形式显示前五个预测标签及其相关概率。由于网络将图像划分为如此多的对象类别,并且许多类别是相似的,因此在评估网络时,通常会考虑前五名的准确性。该网络以高概率将图像分类为灯笼椒。
[scores,indx] = sort(predict_scores,“下”);classNamesTop = classNames(indx(1:5));H =数字;h.位置(3)= 2*h.位置(3);Ax1 = subplot(1,2,1);Ax2 = subplot(1,2,2);图像(ax₁,im);barh (ax2,分数(5:1:1))包含(ax2,“概率”) yticklabels(ax2,classNamesTop(5:-1:1))YAxisLocation =“对”;sgtitle (“使用GoogLeNet的5大预测”)