代码生成深学习网络利用TensorRT

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

注意

该TensorRT工作流程不支持MATLAB万博1manbetx®线上。

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

  • 标准代码生成功能,其生成CUDA®从MATLAB入口点函数的代码。

  • cnncodegen命令生成CUDA码并建立为指定网络对象的静态库。

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

利用GoogLeNet生成代码,图像分类

在这个例子中,你可以使用GPU编码器生成CUDA代码预训练googlenet深卷积神经网络和分类的图像。GoogLeNet已经培训了超过一万张图片,并可以将图像分为1000点对象的类别(如键盘,咖啡杯,铅笔,和动物)。网络已经学会了丰富的功能表示为各种图像。网络拍摄图像作为输入,并且然后输出一个标签用于与概率为每个对象类别的图像中的对象。这个例子告诉你如何使用,产生了预训练的网络代码代码生成命令时,cnncodegen命令,和GPU编码器应用程序。

此示例使用32位浮点数(缺省值)作为精度的张量输入。要了解更多关于使用8位整数精度为张量见通过使用NVIDIA TensorRT深度学习预测例。

要求

  1. 深度学习工具箱。

  2. 深度学习工具箱模型GoogLeNet网络万博1manbetx支持包。

  3. GPU编码器接口深度学习图书馆万博1manbetx支持包。要安装支持包,从MATLAB中万博1manbetx选择支持包加载项菜单。

  4. CUDA工具包,cuDNN和TensorRT库。有关编译器和库的支持版本的信息,请参阅万博1manbetx安装必备产品s manbetx 845

  5. 环境变量的编译器和库。欲了解更多信息,请参阅环境变量

加载预训练网络

  1. 加载预训练GoogLeNet网络。您可以选择加载图像分类的不同预训练网络。如果您没有安装必要的支持包做,该软件提供了下载链接。万博1manbetx

    净= googlenet;

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

    analyzeNetwork(净值);

  3. 要分类必须有大小与网络的输入大小相同的图像。对于GoogLeNet,的大小imageInputLayer是224-通过-224×3。该输出特性classificationLayer包含网络上了解到的类的名称。查看10名随机类名在总共1000。

    类名= net.Layers(结束).Classes;numClasses = numel(类名);DISP(类名(randperm(numClasses,10)))
    “快艇”“窗口画面”“等足”“木勺”“口红”“公鸭”“鬣狗”“哑铃”'草莓“释迦”

    欲了解更多信息,请参阅深度学习图层列表(深学习工具箱)。

创建一个入口点函数

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

    1. 采用coder.loadDeepLearningNetwork功能加载了深刻的学习模式,构建并成立了CNN类。欲了解更多信息,请参阅加载代码生成预训练网络

    2. 呼叫预测预测的反应。

  2. 例如:

    功能OUT = googlenet_predict(上)%#代码生成一贯我的网;如果的isEmpty(我的网)我的网= coder.loadDeepLearningNetwork('googlenet');结束%通过在输入OUT =预测(我的网,在);

    持久对象我的网负载DAGNetwork目的。在第一次调用入口点函数,持久对象被创建和设置。在随后调用的功能,同样的目标被重新调用预测上的输入,避免了重建和重装网络对象。

  3. 您也可以使用激活方法来激活网络用于特定层。例如,下面的代码线返回激活网络中指定的层layerIdx

    OUT =激活(我的网,在,layerIdx, 'OutputAs', '频道');

  4. 您也可以使用分类方法来预测类别标签用于在图像数据用训练网络,我的网

    [出来,分数] =分类(我的网,在);

    对于LSTM网络,你也可以使用predictAndUpdateStateresetState方法。有关使用说明和这些方法的限制,请参见相应的条目万博1manbetx支持的功能表。

利用代码生成代码生成

  1. 配置生成设置,如输出文件的名称,位置和类型,为您打造编码器配置对象。要创建对象,请使用coder.gpuConfig功能。例如,通过使用生成CUDA MEX时代码生成命令,使用CFG = coder.gpuConfig( 'MEX');

    其他可用的选项有:

    1. CFG = coder.gpuConfig( 'LIB');,以创建用于在使用码生成配置对象代码生成生成CUDA C / C ++静态库时。

    2. CFG = coder.gpuConfig( 'DLL');,以创建用于在使用码生成配置对象代码生成生成CUDA C / C ++动态库时。

    3. CFG = coder.gpuConfig( 'EXE');,以创建用于在使用码生成配置对象代码生成生成CUDA C / C ++时可执行文件。

  2. 要为TensorRT指定代码生成参数,设置DeepLearningConfig属性添加到coder.TensorRTConfig对象,您使用创建coder.DeepLearningConfig

    CFG = coder.gpuConfig('MEX');cfg.TargetLang ='C ++';cfg.DeepLearningConfig = coder.DeepLearningConfig('tensorrt');cfg.DeepLearningConfig.DataType ='FP32';

    指定张量数据类型的输入的精确度到网络或通过使用张量输出一个层的数据类型属性。当执行32位浮点数推断,使用'FP32'。对于半精度,使用'FP16'。对于8位整数,使用'INT8'。默认值是'FP32'INT8精度要求CUDA GPU与6.1最低计算能力。FP16精度要求CUDA GPU与7.0最低计算能力。使用ComputeCapability财产GpuConfig对象来设置适当的计算能力的值。

    注意

    代码生成INT8数据类型不支持在入口点函数多深的学习网万博1manbetx络。

    查看通过使用NVIDIA TensorRT深度学习预测例如,对于8位整数预测用于通过使用TensorRT标志分类网络。

  3. 跑过代码生成命令。该代码生成命令,从生成码CUDAgooglenet_predict.mMATLAB入口点函数。

    代码生成-configCFGgooglenet_predict-args{酮(224,224,3)}-报告

    1. -报告选项指示代码生成生成一个代码生成报告,您可以用它来调试你的MATLAB代码。

    2. -args选项指示代码生成编译文件googlenet_predict.m通过使用类,大小,和用于指定输入复杂。价值(224,224,3)对应于GoogLeNet网络的输入层的大小。

    3. -config选项指示代码生成用于代码生成指定的配置对象。

    注意

    您可以指定代码生成半精度输入。但是,代码发生器的类型转换的输入的单精度。深学习工具箱使用单精度浮点运算的MATLAB中的所有计算。在代码生成期间,可以使能与推理半精度(16位浮点)通过指定的输入数据类型财产coder.TensorRTConfig'FP16'

    代码生成器默认使用列优先布局。要使用行主要布局传递-rowmajor选择到代码生成命令。另外,通过修改配置您的代码行的主要布局cfg.RowMajor参数在代码生成配置对象。

  4. 当代码生成是成功的,你可以查看一下生成的代码生成报告查看报告在MATLAB命令窗口。该报告显示在报表查看器窗口。如果代码生成器代码生成过程中检测到错误或警告,报告中描述的问题,并提供链接到有问题的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对应于权重和偏置参数为卷积层中的网络。代码生成器放置在这些二进制文件代码生成夹。

注意

在Windows®系统,一些杀毒软件,如位后卫能够正确识别一些体重为感染的文件并将其删除。这些案件都是误报的文件可以被标记为您的防病毒程序的安全。

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

googlenet_predict.cu文件

生成代码通过使用App

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

在里面生成代码步:

  1. 设置构建类型MEX

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

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

利用代码生成cnncodegen

为了产生与cuDNN库代码,使用targetlib的选择cnncodegen命令。该cnncodegen命令生成CUDA代码,并建立一个静态库的SeriesNetwork要么DAGNetwork目的。

  1. 加载预训练网络。欲了解更多信息,请参阅加载代码生成预训练网络

  2. 呼叫cnncodegen'targetlib'指定为'tensorrt'。例如:

    净= googlenet;cnncodegen(净值,'targetlib''tensorrt');

    cnncodegen命令生成代码,生成文件,cnnbuild_rtw.mk,并建立档案库cnnbuild。它把在所有生成的文件代码生成夹。

生成的代码

DAG网络作为一个C ++类生成(CnnMain)含有144个类的数组。类声明的一个片段,从cnn_exec.hpp文件显示。

cnn_exec.hpp文件

  • 建立()类设置手柄和分配存储器,用于所述网络对象的每一层的方法。

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

  • cnn_exec.cpp文件包含了目标函数的定义CnnMain类。

二进制文件导出用于层用参数,例如网络中的完全连接和卷积层。例如,文件cnn_CnnMain_conv * _Wcnn_CnnMain_conv * _b对应于权重和偏置参数为卷积层中的网络。代码生成器放置在这些二进制文件代码生成夹。代码生成器生成库文件cnnbuild和场所中的所有生成的文件代码生成夹。

生成的Makefile

对于'LIB''DLL''可执行程序'目标代码生成器创建* _rtw.mk在make文件代码生成夹。在此make文件,生成的代码的位置是通过使用指定的START_DIR在变量中找到部分。默认情况下,该变量指向被生成的代码的当前工作文件夹的路径。如果您计划移动生成的文件和使用Makefile构建,更换的生成值START_DIR用适当的路径位置。

运行生成的MEX

  1. 要分类必须有大小与网络的输入大小相同的图像。读取的图像要进行分类,并将其调整到网络的输入大小。此调整大小稍有改变图像的高宽比。

    IM = imread(“peppers.png”);inputLayerSize = net.Layers(1).InputSize;IM = imresize(I,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);AX1 =副区(1,2,1);AX2 =副区(1,2,2);图像(AX1,IM);BARH(AX2,分数(5:-1:1))xlabel(AX2,'可能性')yticklabels(AX2,classNamesTop(5:-1:1))= ax2.YAxisLocation'对';sgtitle(“使用GoogLeNet五大预测”

也可以看看

|||

相关话题