文档

通过使用TensorRT代码生成深度学习网络

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

请注意

在MATLAB TensorRT工作流程不受支持金宝app®网上。

生成代码的卷积网络使用的方法之一:

  • 标准的codegen函数生成CUDA®从MATLAB代码入口点函数。

  • cnncodegen命令生成CUDA代码并构建一个静态库指定网络对象。

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

当你为神经网络通过使用生成代码codegen或GPU编码器应用程序,生成的代码使用阵列数据列为主的布局。匹配行布局深度学习图书馆使用,代码生成器必须插入操作将列为主的布局行布局。这些转换操作可以降解生成的代码的性能。代码生成的深度学习神经网络不支持编码器行选项,如金宝appRowMajor配置参数。

通过使用GoogLeNet生成代码并对图像进行分类

在本例中,您使用GPU编码器生成CUDA pretrained的代码googlenet深卷积神经网络和图像进行分类。GoogLeNet已经在超过一百万个图像和训练可以分类图像到1000年对象类别(如键盘、咖啡杯、铅笔和动物)。网络已经学会丰富广泛的图像特征表示。网络需要一个图像作为输入,然后输出一个标签图像中的对象的概率为每个对象的类别。这个例子向您展示了如何为pretrained网络通过使用生成代码codegen命令,cnncodegen命令,GPU编码器应用。

这个示例使用32位浮点数(默认值)张量的精确输入。了解更多关于使用8位整数为张量精度,看到使用NVIDIA TensorRT深度学习的预测的例子。

需求

  1. 深度学习工具。

  2. 深度学习工具箱GoogLeNet网络模型金宝app支持包。

  3. 为深度学习GPU编码器接口库金宝app支持包。安装包的支持,选择从MATLA金宝appB支持包附加组件菜单。

  4. CUDA工具包,cuDNN TensorRT库。信息的支持版本的编译器和库,明白了金宝app安装必备产品下载188bet金宝搏

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

负载Pretrained网络

  1. 加载pretrained GoogLeNet网络。你可以选择加载不同pretrained网络图像分类。如果您没有所需的支持包安装,软件提供了一个下载链接。金宝app

    网= googlenet;

  2. 的对象包含了DAGNetwork对象。使用analyzeNetwork函数显示一个交互式可视化的网络架构,来检测网络中的错误和问题,并显示详细信息网络层。层信息包括层激活的大小和可学的参数,可学的参数的总数,复发性层的状态参数的大小。

    analyzeNetwork(净);

  3. 你要分类的图像必须有相同的大小作为输入网络的大小。GoogLeNet的大小imageInputLayer是224 - 224 - 3。的输出的属性classificationLayer包含类的名称由网络学习。10个随机类名的共有1000人。

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

    有关更多信息,请参见深度学习层的列表(深度学习工具箱)。

创建一个入口点函数

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

    1. 使用coder.loadDeepLearningNetwork函数加载一个深度学习模型和构造和设置一个CNN类。有关更多信息,请参见负载Pretrained网络代码生成

    2. 调用预测预测的响应。

  2. 例如:

    函数= googlenet_predict(中)% # codegen持续的mynet;如果isempty (mynet) mynet = coder.loadDeepLearningNetwork (“googlenet”);结束%通过输入=预测(mynet,);

    一个持久化对象mynet加载DAGNetwork对象。在第一次调用的入口点函数,构造持久对象和设置。在随后的调用函数,要调用相同的对象被重复使用预测在输入,避免重建并重新加载网络对象。

  3. 您还可以使用激活网络激活特定层的方法。例如,下面的代码行返回指定的层的网络激活layerIdx。使用笔记和局限性的激活的方法,请参阅相应的条目金宝app支持功能表。

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

代码生成通过使用codegen

  1. 等配置构建设置输出文件名称、位置和类型,您将创建编码器配置对象。创建对象,使用coder.gpuConfig函数。例如,当生成CUDA墨西哥人使用codegen命令,使用cfg = coder.gpuConfig(墨西哥人);

    其他可用的选项是:

    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属性到一个coder.TensorRTConfig使用您创建的对象coder.DeepLearningConfig

    cfg = coder.gpuConfig (墨西哥人的);cfg。TargetLang =“c++”;cfg。DeepLearningConfig = coder.DeepLearningConfig (“tensorrt”);cfg.DeepLearningConfig。数据类型=“fp32”;

    指定精度的张量数据类型的输入网络或层利用张量的输出数据类型财产。在32位浮点数进行推理时,使用“fp32”。对于half-precision,使用“fp16”。8位整数,使用“int8”。默认值是“FP32”INT8精度需要CUDA GPU与最低6.1的计算能力。FP16精度需要CUDA GPU与最低7.0的计算能力。使用ComputeCapability财产的GpuConfig对象设置适当的计算能力值。

    请注意

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

  3. 运行codegen命令。的codegen命令生成CUDA代码的googlenet_predict.mMATLAB入口点函数。

    codegen配置cfggooglenet_predictarg游戏{1 (224224 3)}报告

    1. 报告选项指示codegen生成的代码生成报告,可以使用它调试MATLAB代码。

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

    3. 配置选项指示codegen使用指定的配置对象代码生成。

  4. 当代码生成成功,您可以通过单击视图生成的代码生成报告查看报告在MATLAB命令窗口。该报告是在报告中查看器显示窗口。如果在代码生成代码生成器检测错误或警告,这份报告描述了问题和提供有问题的MATLAB代码的链接。看到代码生成报告(MATLAB编码器)。

    代码生成成功:查看报告

生成的代码

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

googlenet_predict_types.h文件

  • 设置()类的方法设置处理,为每一层的网络对象分配内存。

  • 预测()方法调用预测网络中为每个144层。

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

二进制文件导出为层参数完全连接和卷积等在网络层。例如,文件cnn_googlenet_conv * _wcnn_googlenet_conv * _b参数对应的重量和偏见卷积在网络层。代码生成器这些二进制文件的地方codegen文件夹中。

请注意

在Windows上®系统,一些杀毒软件如后卫可以正确识别一些重量文件感染和删除它们。这些病例是假阳性,文件可以标记为安全的防病毒程序。

在生成的代码文件中googlenet_predict.cu的入口点函数,googlenet_predict ()构造一个静态的对象b_googlenet_0类类型并调用设置和预测网络对象。

googlenet_predict.cu文件

通过使用应用程序生成代码

指定的入口点函数和指定的输入类型,完成应用程序的程序。通过使用GPU编码器应用代码生成

生成代码步骤:

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

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

  3. 关闭设置窗口。生成CUDA代码,点击生成

代码生成通过使用cnncodegen

与cuDNN库来生成代码,使用targetlib选择的cnncodegen命令。的cnncodegen命令生成CUDA代码并构建一个静态库SeriesNetworkDAGNetwork对象。

  1. 加载pretrained网络。有关更多信息,请参见负载Pretrained网络代码生成

  2. 调用cnncodegen“targetlib”指定为“tensorrt”。例如:

    网= googlenet;cnncodegen(净,“targetlib”,“tensorrt”);

    cnncodegen命令生成的代码,一个makefile,cnnbuild_rtw.mk,构建库文件cnnbuild。这地方的所有生成的文件codegen文件夹中。

生成的代码

DAG网络生成c++类(CnnMain144层类的)包含一个数组。类声明的一个片段cnn_exec.hpp文件显示。

cnn_exec.hpp文件

  • 设置()类的方法设置处理,为每一层的网络对象分配内存。

  • 预测()方法调用预测网络中为每个144层。

  • cnn_exec.cpp文件包含定义对象的函数CnnMain类。

二进制文件导出为层参数完全连接和卷积等在网络层。例如,文件cnn_CnnMain_conv * _wcnn_CnnMain_conv * _b参数对应的重量和偏见卷积在网络层。代码生成器这些二进制文件的地方codegen文件夹中。代码生成器建立库文件cnnbuild并将所有生成的文件codegen文件夹中。

生成Makefile

“自由”,“dll”,exe”目标,代码生成器创建* _rtw.mk使文件codegen文件夹中。在这个文件,生成的代码通过使用指定的位置START_DIR变量中部分。默认情况下,这个变量指向当前工作文件夹的路径生成的代码。如果您计划将生成的文件和使用makefile构建,取代生成的值START_DIR适当的路径位置。

运行生成的墨西哥人

  1. 你要分类的图像必须有相同的大小作为输入网络的大小。读到你想要的图片进行分类并调整输入网络的大小。这稍微调整图像的纵横比变化。

    我= imread (“peppers.png”);inputLayerSize = net.Layers (1) .InputSize;我= imresize(我inputLayerSize (1:2));
  2. 叫GoogLeNet预测输入图像。

    predict_scores = googlenet_predict_mex (im);
  3. 显示五大标签及其相关预测概率直方图。因为网络将图像分为很多对象类别,和许多类别相似,通常考虑五大精度在评估网络。网络分类甜椒和高概率的形象。

    [分数,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”)

另请参阅

|||

相关的话题