使用NVIDIA TensorRT库进行深度学习预测
这个例子展示了如何使用NVIDIA®TensorRT™库为深度学习应用程序生成代码。此示例使用codegen
命令生成一个MEX文件,该文件使用TensorRT与Logo识别分类网络进行预测。该示例还演示了如何使用codegen
命令生成一个MEX文件,该文件执行8位整数和16位浮点预测。
第三方的先决条件
要求
本例生成CUDA®MEX,需要支持CUDA的NVIDIA GPU和兼容的驱动程序。对于8位整数和16位浮点精度模式,您必须具有特定的GPU计算能力,参见第三方硬件.
可选
对于非mex构建,如静态、动态库或可执行文件,您还必须具备:
英伟达工具包。
NVIDIA cuDNN和tensort库。
编译器和库的环境变量。有关更多信息,请参见第三方硬件而且设置必备产品2022世界杯八强谁会赢?.
验证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
和校准数据设置的路径DeepLearningConfig
.logos_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内存。
清晰的墨西哥人;