主要内容

基于张sorrt的深度学习网络代码生成

使用GPU Coder™,您可以从deep learning Toolbox™生成用于预测各种训练过的深度学习网络的优化代码。生成的代码通过使用您在输入中指定的体系结构、层和参数来实现深度卷积神经网络(CNN)SeriesNetwork(深度学习工具箱)Dagnetwork.(深度学习工具箱)对象。您可以配置代码生成器以利用NVIDIA的优势®TensorRT™高性能推理库用于NVIDIA图形处理器。通过组合网络层和优化内核选择,TensorRT提供了改进的延迟、吞吐量和内存效率。您还可以配置代码生成器,以利用TensorRT的精度模式(FP32、FP16或INT8)来进一步提高性能并减少内存需求。生成的代码可以作为源代码、静态库或动态库或可执行文件集成到项目中,可以部署到各种NVIDIA GPU平台上。

请注意

Matlab不支持TensorR工作流程金宝app®网上。

使用其中一种方法生成卷积网络代码:

  • 标准Codegen.生成CUDA的功能®来自MATLAB入口点函数的代码。

  • GPU编码器应用程序,生成CUDA代码从MATLAB的入口点函数。

请注意

在以前的版本中,您可以使用的是统治图库cnncodegen.功能。从R2020B开始,建议使用Codegen.命令代替cnncodegen.功能因为在未来的释放中,cnncodegen.函数将生成C ++代码并仅为ARM构建静态库®Mali GPU处理器。

使用googlenet生成代码并对图像进行分类

在这个例子中,你使用GPU Coder为预训练生成CUDA代码googlenet.(深度学习工具箱)利用深度卷积神经网络对图像进行分类。GoogLeNet已经对超过100万张图片进行了训练,并可以将图片分类为1000个对象类别(如键盘、咖啡杯、铅笔和动物)。该网络为广泛的图像学习了丰富的特征表示。该网络以图像作为输入,然后输出图像中对象的标签,其中包含每个对象类别的概率。控件为预训练的网络生成代码Codegen.命令和GPU编码器应用程序。

此示例使用32位floats(默认值)作为张量输入的精度。要了解更多关于使用8位整数精度的张量,请参阅基于NVIDIA TensorRT的深度学习预测例子。

需求

必需的

这个例子生成了具有以下附加要求的CUDA MEX。

  1. 深度学习工具。

  2. Googlenet网络的深层学习工具箱模型金宝app支持包。

  3. 用于深度学习库的GPU编码器界面金宝app支持包。

  4. CUDA启用了NVIDIA GPU和兼容的驱动程序。对于8位整数精度,CUDA GPU必须具有6.1、6.3或更高的计算能力。半精度要求CUDA GPU的最低计算能力为7.0。

可选

对于非mex构建,如静态库、动态库或可执行文件,此示例具有以下附加需求。

  1. CUDA工具包,cudn和TensorRT库。有关受支持的编译器和库版本的信息,请参见金宝app安装先决品产品下载188bet金宝搏

  2. 编译器和库的环境变量。有关更多信息,请参见环境变量

负载净化网络

  1. 加载预制googlenet网络。您可以选择加载不同的预制网络以进行图像分类。如果未安装所需的支持软件包,则该软件提供了一个下载链接。金宝app

    net = googlenet;

  2. 物体包含Dagnetwork.对象。使用分析(深度学习工具箱)功能要显示网络架构的交互式可视化,以检测网络中的错误和问题,并显示有关网络层的详细信息。图层信息包括层激活和学习参数的大小,学习参数的总数,以及经常性层的状态参数的大小。

    分析(网);

  3. 要分类的图像的大小必须与网络的输入大小相同。对于googleet,大小imageInputlayer.(深度学习工具箱)是224×224-by-3。的班级输出属性分类层(深度学习工具箱)包含由网络学习的类的名称。查看总计1000的10个随机类名称。

    一会= net.Layers . class(结束);numClasses =元素个数(类名);disp(类名(randperm (numClasses 10)))
    “快艇”“窗纱”“等足”“木勺”“口红”“德雷克”“鬣狗”“哑铃”“草莓”“蛋奶苹果”

    有关更多信息,请参见深度学习层名单(深度学习工具箱)

创建一个入口点函数

  1. 在MATLAB中编写一个入门点函数:

    1. 使用coder.loadDeepLearningNetwork函数来加载一个深度学习模型,并构造和建立一个CNN类。有关更多信息,请参见加载代码生成的预磨损网络

    2. 呼叫预测(深度学习工具箱)预测响应。

  2. 例如:

    函数OUT = GOOGLENET_PREDICT(IN)%#codegen.持续的mynet;如果mynet = code . loaddeeplearningnetwork ()“googlenet”);结束输入通入=预测(mynet,);

    一个持久化对象yeNet.加载Dagnetwork.对象。在第一次调用入口点函数时,将构造并设置持久对象。在对该函数的后续调用中,将重用相同的对象来调用预测在输入时,避免重构和重新加载网络对象。

    请注意

    代码生成需要将网络加载到持久对象中。

  3. 你也可以使用激活(深度学习工具箱)用于特定层的网络激活的方法。例如,以下代码行返回指定的图层的网络激活layerIdx

    出=激活(mynet layerIdx,“OutputAs”,“渠道”);

  4. 你也可以使用分类(深度学习工具箱)中预测图像数据的类标签的方法使用训练有素的网络,yeNet.

    [,分数]=分类(mynet,);

    对于LSTM网络,您还可以使用predictandanddatestate.(深度学习工具箱)重置静止(深度学习工具箱)方法。对于使用说明和这些方法的限制,请参阅相应的条目金宝app支持功能表格

使用代码生成Codegen.

  1. 要配置构建设置,例如输出文件名,位置和类型,可以创建编码器配置对象。要创建对象,请使用Coder.gpuconfig.功能。例如,在使用CUDA MEX时使用Codegen.命令,使用cfg = coder.gpuconfig('mex');

    其他可用选项是:

    1. cfg = coder.gpuConfig(“自由”);,创建一个代码生成配置对象以供使用Codegen.当生成一个CUDA C/ c++静态库时。

    2. cfg = coder.gpuconfig('dll');,创建一个代码生成配置对象以供使用Codegen.生成CUDA C / C ++动态库时。

    3. cfg = coder.gpuConfig (exe);,创建一个代码生成配置对象以供使用Codegen.生成CUDA C / C ++可执行文件时。

  2. 要为TensorRT指定代码生成参数,请设置DeeplearningConfig属性到一个编码器。TensorRTConfig使用使用的对象coder.deeplearningconfig

    cfg = coder.gpuConfig (墨西哥人的);cfg.targetlang ='c ++';cfg.deeplearningconfig = coder.deeplearningconfig(“tensorrt”);cfg.DeepLearningConfig.DataType =“fp32”;

    控件指定支持层中推理计算的精度金宝app数据类型财产。在32位浮点数中执行推理时,使用“fp32”。对于半精度,使用“fp16”。对于8位整数,使用'int8'。默认值是“fp32”INT8.精度要求CUDA GPU的最低计算能力为6.1。FP16精度需要CUDA GPU,最小计算能力为7.0。使用computEapability.财产的财产GpuConfig对象设置适当的计算能力值。

    当你选择“INT8”选项,规格量化浮点数据INT8.。重新校准是用一组简化的校准数据进行的。校准数据必须存在于图像数据指定的位置DataPath公司。在重新校准之前必须对图像进行预处理,并且在生成代码之前必须将预处理步骤包含在入口点文件中。

    请注意

    代码生成的INT8.数据类型不支持入口点函数中的多个深度学金宝app习网络。

    看看基于NVIDIA TensorRT的深度学习预测使用TensorRT对标志分类网络进行8位整数预测的例子。

  3. 跑过Codegen.命令。的Codegen.命令生成CUDA代码googlenet_predict.m.matlab入口点函数。

    Codegen.-Config.cfggooglenet_predictarg游戏{1 (224224 3)}-报告

    1. -报告选项指示Codegen.要生成用于调试MATLAB代码的代码生成报告。

    2. arg游戏选项指示Codegen.要编译该文件googlenet_predict.m.通过使用为输入指定的类,大小和复杂性。价值(224224年,3)对应googleet网络的输入层大小。

    3. -Config.选项指示Codegen.使用指定的配置对象进行代码生成。

    请注意

    您可以为代码生成指定半精度输入。但是,代码生成器类型将输入转换为单精度。深度学习工具箱使用单精度,浮点算法的所有计算在MATLAB。在代码生成期间,可以通过指定数据类型的属性编码器。TensorRTConfig作为“fp16”

    默认情况下,代码生成器使用列 - 主要布局。使用行主要布局通过-rowmajor可以选择的Codegen.命令。属性来配置主要行布局的代码cfg.rowmajor.参数。

  4. 代码生成成功后,您可以通过单击查看结果代码生成报告查看报告在MATLAB命令窗口。报表显示在“报表查看器”窗口中。如果代码生成器在代码生成过程中检测到错误或警告,该报告将描述问题并提供问题MATLAB代码的链接。看到代码生成报告

    代码成功:查看报告

生成的代码

DAG网络生成为一个包含144个层类的数组的c++类。的类声明的片段googlenet_predict_types.h文件显示。

googlenet_predict_types.h文件

  • 设置()该类的方法设置句柄并为网络对象的每层分配内存。

  • 预测()方法对网络中的144层中的每一层调用预测。

  • DeepLearningNetwork.cu文件包含对象函数的定义b_googlenet_0.班级。

二进制文件被导出为具有参数的层,如网络中的全连接层和卷积层。例如,文件cnn_googlenet_conv * _wcnn_googlenet_conv * _b对应的权重和偏置参数卷积网络中的图层。代码生成器将这些二进制文件放在其中Codegen.文件夹。

请注意

在Windows上®系统,某些防病毒软件,如Bit Defender可能错误地标识了感染和删除它们的一些权重文件。这些情况是误报,文件可以在防病毒程序中标记为安全。

在生成的代码文件中googlenet_predict.cu,入口点功能googlenet_predict()的静态对象b_googlenet_0.类类型,并在此网络对象上调用设置和预测。

googlenet_predict.cu文件

使用应用程序生成代码

要指定入口点函数并指定输入类型,请完成应用程序中的过程。看到使用GPU编码器应用程序的代码

生成代码步骤:

  1. 设定构建类型墨西哥人

  2. 点击更多的设置。在深度学习窗格中,设置目标库张力

  3. 关闭设置窗口。要生成CUDA代码,请单击产生

生成的makefile.

“自由”,'DLL','EXE文件'目标时,代码生成器将创建* _rtw.mkCodegen.文件夹。在此制作文件中,使用的代码的位置使用START_DIR部分。默认情况下,该变量指向生成代码的当前工作文件夹的路径。如果您计划移动生成的文件并使用makefile进行构建,则替换生成的值START_DIR使用适当的路径位置。

运行生成的MEX

  1. 要分类的图像的大小必须与网络的输入大小相同。读取要对其进行分类的图像并将其调整为网络的输入大小。该调整大小略微改变图像的纵横比。

    我= imread (“peppers.png”);InputLayerSize = Net.Layers(1).InputSize;IM = Imresize(IM,InputLayersize(1:2));
  2. 调用googlenet在输入图像上预测。

    predict_cometes = googlenet_predict_mex(IM);
  3. 以直方图的形式显示前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(“谷歌网的五大预测”)

另请参阅

功能

对象

相关话题