使用GPU Coder™,您可以从深度学习工具箱™生成用于预测各种训练有素的深度学习网络的优化代码。生成的代码通过使用您在输入中指定的架构、层和参数来实现深度卷积神经网络(CNN)SeriesNetwork
(深度学习工具箱)或DAGNetwork
(深度学习工具箱)对象。您可以配置代码生成器以利用NVIDIA®TensorRT™NVIDIA gpu高性能推理库。TensorRT通过结合网络层和优化内核选择,提供了改进的延迟、吞吐量和内存效率。您还可以配置代码生成器以利用TensorRT的精度模式(FP32、FP16或INT8)来进一步提高性能并减少内存需求。生成的代码可以集成到您的项目作为源代码,静态或动态库,或可部署到各种NVIDIA GPU平台的可执行文件。
请注意
张sorrt工作流程在MATLAB中不支持万博1manbetx®网上。
使用其中一种方法生成卷积网络代码:
标准的codegen
生成CUDA的函数®代码来自一个MATLAB入口点函数。
从MATLAB入口点函数生成CUDA代码的GPU编码器应用程序。
请注意
在以前的版本中,您可以使用TensorRT库cnncodegen
函数。从R2020b开始,建议使用codegen
命令代替cnncodegen
函数,因为在未来的版本中cnncodegen
函数将生成c++代码,并为ARM构建一个静态库®马里GPU处理器。
在这个例子中,你使用GPU编码器为预先训练的CUDA生成代码googlenet
(深度学习工具箱)深度卷积神经网络和分类图像。GoogLeNet已经训练了超过100万张图片,并可以将图片分类为1000个对象类别(如键盘、咖啡杯、铅笔和动物)。该网络学习了丰富的特征表示范围广泛的图像。该网络以一幅图像作为输入,然后输出图像中对象的标签,其中包含每个对象类别的概率。这个示例向您展示了如何使用codegen
命令和GPU编码器应用程序。
这个例子使用32位浮点数(默认值)作为张量输入的精度。要了解关于使用8位整数精度的张量的更多信息,请参阅使用NVIDIA TensorRT进行深度学习预测的例子。
本例生成的CUDA MEX具有以下附加要求。
深度学习工具。
google网络的深度学习工具箱模型万博1manbetx支持包。
深度学习库的GPU编码器接口万博1manbetx支持包。
CUDA支持NVIDIA GPU和一个兼容的驱动程序。对于8位整数精度,CUDA GPU必须具有6.1、6.3或更高的计算能力。半精度要求CUDA GPU的最低计算能力为7.0。
对于非mex构建,如静态、动态库或可执行文件,本例有以下附加要求。
CUDA工具包,cuDNN和TensorRT库。有关编译器和库支持的版本的信息,请参见万博1manbetx安装必备产品s manbetx 845.
编译器和库的环境变量。有关更多信息,请参见环境变量.
加载预先训练好的GoogLeNet网络。您可以选择加载一个不同的预先训练的网络来进行图像分类。如果您没有安装所需的支持包,该软件提供下载链接。万博1manbetx
网= googlenet;
的对象净
包含了DAGNetwork
对象。使用analyzeNetwork
(深度学习工具箱)显示网络架构的交互式可视化,检测网络中的错误和问题,并显示关于网络层的详细信息。层信息包括层激活和可学习参数的大小,可学习参数的总数,循环层的状态参数的大小。
analyzeNetwork(净);
您想要分类的图像必须与网络的输入大小相同。对于GoogLeNet来说,它的大小imageInputLayer
(深度学习工具箱)是224 - 224 - 3。的类
输出属性classificationLayer
(深度学习工具箱)包含网络所学习的类的名称。从1000个随机类名中查看10个。
一会= net.Layers . class(结束);numClasses =元素个数(类名);disp(类名(randperm (numClasses 10)))
“快艇”“纱窗”“等足动物”“木勺”“口红”“德雷克”“鬣狗”“哑铃”“草莓”“奶油苹果”
有关更多信息,请参见深度学习层列表(深度学习工具箱).
在MATLAB中编写一个入口点函数:
使用coder.loadDeepLearningNetwork
函数加载深度学习模型,并构建和建立CNN类。有关更多信息,请参见加载预训练网络以生成代码.
调用预测
(深度学习工具箱)来预测反应。
例如:
函数= googlenet_predict(中)% # codegen持续的mynet;如果isempty(mynet) mynet = code . loaddeeplearningnetwork (“googlenet”);结束输入通过率=预测(mynet,);
一个持久化对象mynet
加载DAGNetwork
对象。在第一次调用入口点函数时,构造并建立持久对象。在对该函数的后续调用中,将重用相同的对象来调用预测
在输入时,避免重构和重新加载网络对象。
请注意
代码生成需要将网络加载到持久对象中。
你也可以用the激活
(深度学习工具箱)方法来对特定层进行网络激活。例如,下面的代码行返回中指定的层的网络激活layerIdx
.
出=激活(mynet layerIdx,“OutputAs”,“渠道”);
你也可以用the分类
(深度学习工具箱)方法来预测中的图像数据的类标签在
利用训练有素的网络,mynet
.
[,分数]=分类(mynet,);
对于LSTM网络,也可以使用predictAndUpdateState
(深度学习工具箱)和resetState
(深度学习工具箱)方法。有关这些方法的使用注意事项和限制,请参阅万博1manbetx支持功能表格
codegen
要配置生成设置,如输出文件名、位置和类型,您需要创建编码器配置对象。要创建对象,请使用coder.gpuConfig
函数。例如,当使用codegen
命令,使用cfg = coder.gpuConfig(墨西哥人);
其他可选方案有:
cfg = coder.gpuConfig(“自由”);
,创建代码生成配置对象以使用codegen
当生成CUDA C/ c++静态库时。
cfg = coder.gpuConfig (dll);
,创建代码生成配置对象以使用codegen
在生成CUDA C/ c++动态库时。
cfg = coder.gpuConfig (exe);
,创建代码生成配置对象以使用codegen
当生成CUDA C/ c++可执行文件时。
要为TensorRT指定代码生成参数,请设置DeepLearningConfig
属性到一个编码器。TensorRTConfig
使用创建的编码器。DeepLearningConfig
.
cfg = coder.gpuConfig (墨西哥人的);cfg。TargetLang =“c++”;cfg。DeepLearningConfig =编码器。DeepLearningConfig (“tensorrt”);cfg.DeepLearningConfig.DataType =“fp32”;
的方法指定支撑层中推理计算的精度万博1manbetx数据类型
财产。在32位浮点数中执行推断时,使用“fp32”
.对于half-precision,使用“fp16”
.对于8位整数,使用“int8”
.默认值是“fp32”
.INT8
精度要求CUDA GPU最小计算能力为6.1。FP16
精度要求CUDA GPU的最低计算能力7.0。使用ComputeCapability
财产的GpuConfig
对象设置相应的计算能力值。
当你选择“INT8”
选项,TensorRT将浮点数据量化为int8
.用减少的校准数据集进行重新校准。校准数据必须出现在指定的图像数据位置DataPath公司
.在重新校准之前必须对图像进行预处理,并且在代码生成之前必须将预处理步骤包含在入口点文件中。
请注意
代码生成的INT8
数据类型在入口点函数中不支持多个深度学万博1manbetx习网络。
看到使用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中的所有计算。在代码生成期间,可以通过指定数据类型
的属性编码器。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
文件夹中。
请注意
在Windows上®系统,一些反病毒软件(如Bit Defender)可能会错误地识别出一些权重文件为受感染文件并删除它们。这些情况是假阳性和文件可以标记为安全在你的杀毒程序。
在生成的代码文件中googlenet_predict.cu
,入口点函数googlenet_predict ()
构造静态对象b_googlenet_0类类型并调用此网络对象上的设置和预测。
要指定入口点函数和指定输入类型,请在应用程序中完成该过程使用GPU编码器应用程序生成代码.
在生成代码步骤:
设置构建类型
来墨西哥人
.
点击更多的设置.在深度学习窗格中,设置目标库来TensorRT.
关闭设置窗口。要生成CUDA代码,请单击生成.
为“自由”
,“dll”
,exe”
目标时,代码生成器创建* _rtw.mk
在codegen
文件夹中。在这个make文件中,生成代码的位置通过使用START_DIR
变量宏
部分。默认情况下,该变量指向生成代码的当前工作文件夹的路径。如果您计划移动生成的文件并使用makefile进行构建,请替换生成的值START_DIR
使用适当的路径位置。
您想要分类的图像必须与网络的输入大小相同。读取要分类的图像,并将其调整为网络的输入大小。这个大小调整稍微改变了图像的宽高比。
我= imread (“peppers.png”);inputLayerSize = net.Layers (1) .InputSize;我= imresize (im, inputLayerSize (1:2));
调用GoogLeNet对输入图像进行预测。
predict_scores = googlenet_predict_mex (im);
以直方图的形式显示前5个预测标签及其相关的概率。由于网络将图像分类为如此多的对象类别,而且许多类别是相似的,因此在评估网络时,通常会考虑前五名的精度。该网络将图像分类为一个高概率的甜椒。
[分数,indx] =排序(predict_scores“下”);classNamesTop =一会(indx (1:5));h =图;h.Position (3) = 2 * h.Position (3);ax₁=情节(1、2、1);ax2 =情节(1、2、2);图像(ax₁,im);barh (ax2,分数(5:1:1))包含(ax2,“概率”) yticklabels (ax2 classNamesTop (5: 1:1)) ax2。YAxisLocation =“对”;sgtitle (“使用GoogLeNet的5大预测”)