主要内容

使用NVIDIA TensorRT库进行深度学习预测

这个例子展示了如何使用NVIDIA®TensorRT™库为深度学习应用程序生成代码。此示例使用codegen命令生成一个MEX文件,该文件使用TensorRT与Logo识别分类网络进行预测。该示例还演示了如何使用codegen命令生成一个MEX文件,该文件执行8位整数和16位浮点预测。

第三方的先决条件

要求

本例生成CUDA®MEX,需要支持CUDA的NVIDIA GPU和兼容的驱动程序。对于8位整数和16位浮点精度模式,您必须具有特定的GPU计算能力,参见第三方硬件

可选

对于非mex构建,如静态、动态库或可执行文件,您还必须具备:

验证GPU环境

使用coder.checkGpuInstall函数来验证运行此示例所需的编译器和库是否已正确设置。

envCfg = coder.gpuEnvConfig (“主机”);envCfg。DeepLibTarget =“tensorrt”;envCfg。DeepCodegen = 1;envCfg。安静= 1;coder.checkGpuInstall (envCfg);

下载和加载预先训练的网络

本示例使用预先训练的标识识别网络对图像中的标识进行分类。下载pretrainedLogoNet并从MathWorks网站加载该文件。该网络是在MATLAB中开发的,大小约为42 MB。该网络可以在不同的照明条件和相机角度下识别32个logo。有关培训标识识别网络的信息,请参见标志识别网络

网= getLogonet;

的logonet_predict入口点函数

logonet_predict.m入口点函数接受一个图像输入,并使用保存在LogoNet.mat文件。函数从中加载网络对象LogoNet.mat转化为一个持久变量logonet并在后续的预测调用中重用持久变量。

类型(“logonet_predict.m”
The MathWorks, Inc. %持久化对象logonet用于加载网络对象。第一次调用此函数时,将构造持久对象并设置%。当该函数随后被调用时,相同的对象%被重用以在输入上调用predict,从而避免重构和%重新加载网络对象。持久logonet;if isempty(logonet) logonet = code . loaddeeplearningnetwork (' logonet .mat','logonet');End out = logonet.predict(in);结束

运行MEX代码生成

生成CUDA代码logonet_predict入口点函数,为MEX目标创建一个GPU代码配置对象,并将目标语言设置为c++。使用编码器。DeepLearningConfig函数来创建一个TensorRT深度学习配置对象,并将其分配给DeepLearningConfig属性的图形处理器代码配置对象。运行codegen命令时指定输入大小为227 × 227 × 3。该值对应Logo识别网络的输入层大小。默认情况下,生成TensorRT代码在32位浮点中运行推理。

cfg = coder.gpuConfig (墨西哥人的);cfg。TargetLang =“c++”;cfg。DeepLearningConfig =编码器。DeepLearningConfig (“tensorrt”);codegen配置cfglogonet_predictarg游戏{coder.typeof(单(0)(227 227 3])}报告
代码生成成功:查看报告

对测试图像进行预测

加载一个输入图像。调用logonet_predict_mex在输入图像上。

我= imread (“gpucoder_tensorrt_test.png”);Im = imresize(Im, [227,227]);predict_scores = logonet_predict_mex(单(im));%得到前5个概率分数和他们的标签[val, indx] =排序(predict_scores,“下”);成绩=瓦尔(1:5)* 100;一会= net.Layers .ClassNames(结束);top5labels =一会(indx (1:5));

显示前5个分类标签。

outputImage = 0(227400年3“uint8”);k = 1:3 outputImage(:,174:end,k) = im(:,:,k);结束scol = 1;srow = 20;k = 1:5 outputImage = insertText(outputImage, [scl, srow],...(char (top5labels (k)),' 'num2str(分数(k),' % 2.2 f '),“%”],...“输入TextColor”' w '“字形大小”15岁的“BoxColor”“黑”);麻雀=麻雀+ 20;结束imshow (outputImage);

移除已加载的MEX函数,释放GPU内存。

清晰的墨西哥人

生成8位整数预测的张量排序码

生成运行int8精度推理的TensorRT代码。

使用NVIDIA TensorRT库和8位整数精度的推理计算生成的代码支持这些额外的网络:

  • 对象检测网络,如YOLOv2、SSD等

  • 回归和语义分割网络

TensorRT需要一个校准数据集来校准用浮点训练的网络,以计算8位整数精度的推理。设置数据类型为int8和校准数据设置的路径DeepLearningConfiglogos_dataset是一个子文件夹,其中包含按分类标签分组的图像。为int8支持,GPU计算能力必须为6.1、7.0及以上。

注意,对于语义分割网络,校准数据图像的格式必须是imread函数。

解压缩(“logos_dataset.zip”);cfg = coder.gpuConfig (墨西哥人的);cfg。TargetLang =“c++”;cfg.GpuConfig.ComputeCapability =“6.1”;cfg。DeepLearningConfig =编码器。DeepLearningConfig (“tensorrt”);cfg.DeepLearningConfig.DataType =“int8”;cfg.DeepLearningConfig.DataPath =“logos_dataset”;cfg.DeepLearningConfig.NumCalibrationBatches = 50;codegen配置cfglogonet_predictarg游戏{coder.typeof (int8 (0) (227 227 3])}报告
代码生成成功:查看报告

在测试图像上运行INT8预测

加载一个输入图像。调用logonet_predict_mex在输入图像上。

我= imread (“gpucoder_tensorrt_test.png”);Im = imresize(Im, [227,227]);predict_scores = logonet_predict_mex (int8 (im));%得到前5个概率分数和他们的标签[val, indx] =排序(predict_scores,“下”);成绩=瓦尔(1:5)* 100;一会= net.Layers .ClassNames(结束);top5labels =一会(indx (1:5));

显示前5个分类标签。

outputImage = 0(227400年3“uint8”);k = 1:3 outputImage(:,174:end,k) = im(:,:,k);结束scol = 1;srow = 20;k = 1:5 outputImage = insertText(outputImage, [scl, srow],...(char (top5labels (k)),' 'num2str(分数(k),' % 2.2 f '),“%”],...“输入TextColor”' w '“字形大小”15岁的“BoxColor”“黑”);麻雀=麻雀+ 20;结束imshow (outputImage);

移除已加载的MEX函数,释放GPU内存。

清晰的墨西哥人

生成16位浮点预测的张量排序代码

生成运行推理的TensorRT代码fp16精度。为fp16支持,GPU计算能力必须是5.3,6.0,6.2或更高。

注意,在单精度累积运算并将其转换为半精度时,会出现量化误差。有关更多信息,请参见深度神经网络的量化

cfg = coder.gpuConfig (墨西哥人的);cfg。TargetLang =“c++”;cfg.GpuConfig.ComputeCapability =“5.3”;cfg。DeepLearningConfig =编码器。DeepLearningConfig (“tensorrt”);cfg.DeepLearningConfig.DataType =“fp16”;codegen配置cfglogonet_predictarg游戏{coder.typeof(一半(0)(227 227 3])}报告
代码生成成功:查看报告

在测试图像上运行FP16预测

加载一个输入图像。调用logonet_predict_mex在输入图像上。

我= imread (“gpucoder_tensorrt_test.png”);Im = imresize(Im, [227,227]);predict_scores = logonet_predict_mex(一半(im));%得到前5个概率分数和他们的标签[val, indx] =排序(predict_scores,“下”);成绩=瓦尔(1:5)* 100;一会= net.Layers .ClassNames(结束);top5labels =一会(indx (1:5));

显示前5个分类标签。

outputImage = 0(227400年3“uint8”);k = 1:3 outputImage(:,174:end,k) = im(:,:,k);结束scol = 1;srow = 20;k = 1:5 outputImage = insertText(outputImage, [scl, srow],...(char (top5labels (k)),' 'num2str(分数(k),' % 2.2 f '),“%”],...“输入TextColor”' w '“字形大小”15岁的“BoxColor”“黑”);麻雀=麻雀+ 20;结束imshow (outputImage);

移除已加载的MEX函数,释放GPU内存。

清晰的墨西哥人

另请参阅

功能

对象

相关的话题

Baidu
map