Using TensorRT for deep learning and inference applications
-
摘要: TensorRT是一个高性能的深度学习推理平台。它包括一个深度学习推理优化器和运行时为深度学习推理应用程序提供低延迟和高吞吐量。给出了一个使用TensorRT快速构建计算管道的例子,实现通过TensorRT执行智能视频分析的典型应用。该示例演示了使用片上解码器进行解码、使用片上标量进行视频缩放和GPU计算的4个并发视频流。为了演示的简单性,只有一个通道使用NVIDIA TensorRT执行对象标识,并在标识的对象周围生成包围框。该示例还使用视频转换器函数进行各种格式转换,使用EGLImage来演示缓冲区共享和图像显示。最后采用GPU卡V100对ResNet网络进行TensorRT加速性能的实际测试,结果表明TensorRT能够使吞吐量提升大约15倍。Abstract: TensorRT is a high-performance deep learning and inference platform. It includes a deep learning and inference optimizer as well as runtime that provides low latency and high throughput for deep learning and inference applications. An example of using TensorRT to quickly build computational pipelines to implement a typical application for performing intelligent video analysis with TensorRT was presented. This example demonstrated four concurrent video streams that used an on-chip decoder for decoding, on-chip scalar for video scaling, and GPU computing. For simplicity of presentation, only one channel used NVIDIA TensorRT to perform object identification and generate bounding boxes around the identified objects. This example also used video converter functions for various format conversions, EGLImage to demonstrate buffer sharing and image display. Finally, the GPU card V100 was used to test the TensorRT acceleration performance of ResNet network. The results show that TensorRT can improve the throughput by about 15 times.
-
引言
英伟达TensorRT是一种高性能神经网络推理(Inference)引擎,是一个标准C++库。TensorRT只能用来做Inference(推理),不能用来进行训练,用于在生产环境中部署深度学习应用程序[1]。应用领域包括图像分类、分割和目标检测等,可提供最大的推理吞吐量和效率。TensorRT需要CUDA(compute unified device architecture)的支持,包含一个为优化生产环境中部署的深度学习模型而创建的库,可获取经过训练的神经网络(通常使用32位或16位数据),并针对降低精度的INT8运算来优化这些网络。借助CUDA的可编程性,TensorRT将能够应对深度神经网络日益多样化、复杂化的趋势。TensorRT在不断的改进过程中,在保证软件精度的同时,自动优化训练过的神经网络,不断提高速度。TensorRT能够支持Caffe等主流深度学习框架[2-3]。
本文实现了一个利用TensorRT执行智能视频分析的典型应用,演示了使用片上解码器进行解码,使用片上转换器进行视频缩放,利用TensorRT执行对象标识,利用OpenGL2和XWindow-11进行渲染,并在标识的对象周围生成包围框。此外,还使用视频转换器函数进行各种格式转换。使用EGLImage来演示缓冲区共享和图像显示。图1展示了使用TensorRT的流程细节[4-5]。
1 定义视频处理结构体
本文例程将本地存储的H.264视频文件进行解码、格式转换和渲染,为了使流程清晰,便于管控,定义context_t结构管理视频处理全部资源。如表1所示成员主要包括一个解码器类、一个转换器类、一个渲染器类、一个数据指针。解码器类NvVideoDecoder封装了用于视频解码的多媒体API函数,用于从H.264视频文件解码压缩的视频。转换器类NvVideoConverter封装了视频转换的相关函数,包括色彩空间变换、尺度变换以及软硬件缓存空间的变换。渲染器类NvEglRenderer类封装了图像渲染的相关函数以及XWindow-11以及OpenGL2的部分函数,使用EGL和OpenGL ES 2.0进行呈现。渲染器需要缓冲区的文件描述符(FD)作为输入,创建自己的X窗口。渲染速率(以帧/s为单位),窗口的宽度、高度、水平偏移量和垂直偏移量都是可配置的。所有EGL调用只能通过一个线程进行。该类在内部创建一个线程,该线程执行所有EGL/GL初始化,从FD获取EGLImage对象,然后反初始化所有EGL/GL结构[6-9]。
表 1 Context_t结构主要成员Table 1. Main members of Context_t structure成员 描述 NvVideoDecoder 包含视频解码相关的成员和函数 NvVideoConverter 包含视频格式转换相关的成员和函数 NvEglRenderer 包含EGL显示渲染相关函数 EGLImageKHR EGLImage图像数据指针,用于CUDA处理,这个类型来源于EGL开源库 2 利用TRT_Context类进行加速推理
英伟达提供的TRT_Context类包含一系列接口来加载Caffe模型并执行推理。表2描述了本示例中使用的关键TRT_Context成员。本文中使用buildTrtContext实现Caffe模型到TensorRT模型转换,它的输入参数包括caffe网络结构文件和模型参数文件。实际上也可借助转换工具实现Caffe模型到gie模型的转换。TRT_Context:: getNumTrtInstances用于获取加速上下文的实例。TRT_Context::doInference用转换好的模型利用TensorRT进行加速推理。此外,TRT_Context还实现了一些模型控制和剪裁的一些函数接口[10-13]。
表 2 TRT_Context类主要成员Table 2. Main members of TRT_Context classTRT_Context类成员 描述 TRT_Context::buildTrtContext 构建Tensorrt上下文 TRT_Context::getNumTrtInstances 获取TRT_context 实例. TRT_Context::doInference TensorRT 推理接口 3 主进程
主进程调用以上定义的类和结构实现整个处理流程,主要代码如下:
TRT_Context g_trt_context;
main(int argc, char *argv[])
{
//程序入口参数处理
context_t ctx[CHANNEL_NUM];
global_cfg cfg;
char **argp;
set_globalcfg_default(&cfg);
argp = argv;
parse_global(&cfg, argc, &argp);
parse_csv_args(&ctx[0], &g_trt_context, argc-cfg.channel_num-1, argp);
//设置g_trt_context参数
g_trt_context.setModelIndex(TRT_MODEL);
g_trt_context.buildTrtContext(cfg.deployfile, cfg.modelfile, true);
pthread_create(&TRT_Thread_handle, NULL, trt_thread, NULL);
// 获取EGL默认值
egl_display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
// EGL 初始化
eglInitialize(egl_display, NULL, NULL)
for (iterator = 0; iterator < cfg.channel_num; iterator++)
{
int ret = 0;
sem_init(&(ctx[iterator].dec_run_sem), 0, 0);
set_defaults(&ctx[iterator]);
char decname[512];
sprintf(decname, "dec%d", iterator);
ctx[iterator].channel = iterator;
ctx[iterator].in_file_path = cfg.in_file_path[iterator];
ctx[iterator].nvosd_context = nvosd_create_context();
//创建解码器
ctx[iterator].dec = NvVideoDecoder::createVideoDecoder(decname);
//设置输出面板格式
ctx[iterator].dec->setOutputPlaneFormat(ctx[iterator].decoder_pixfmt, CHUNK_SIZE);
//映射输出面板缓存
ctx[iterator].dec->output_plane.setupPlane(V4L2_MEMORY_MMAP, 10, true, false);
//创建渲染线程
pthread_create(&ctx[iterator].render_feed_handle, NULL, render_thread, &ctx[iterator]);
char convname[512];
// 创建BL到 PL转换器
ctx[iterator].conv = NvVideoConverter::createVideoConverter(convname);
ctx[iterator].conv->output_plane.setDQThreadCallback(conv_output_dqbuf_thread_callback);
ctx[iterator].conv->capture_plane.setDQThreadCallback(conv_capture_dqbuf_thread_callback);
if (ctx[iterator].cpu_occupation_option!= PARSER)
pthread_create(&ctx[iterator].dec_capture_loop, NULL, dec_capture_loop_fcn, &ctx[iterator]);
pthread_create(&ctx[iterator].dec_feed_handle, NULL, dec_feed_loop_fcn, &ctx[iterator]);
//等待解码器获取EOS
sem_wait(&(ctx[iterator].dec_run_sem));
//向渲染器发送命令
ctx[iterator].stop_render = 1;
pthread_cond_broadcast(&ctx[iterator].render_cond);
pthread_join(ctx[iterator].render_feed_handle, NULL);
}
}
4 测试与分析
在这个示例中,对象检测仅限于在960×540分辨率的视频流中识别汽车。该网络基于GoogleNet。推理是在逐帧的基础上进行的,不涉及任何对象跟踪,展示了如何使用TensorRT快速构建计算管道。示例使用训练过的GoogleNet网络,它是用NVIDIA深度学习GPU训练系统(DIGITS)训练的。训练是大约3 000帧从1.5 m(5英尺)~3 m(10英尺)的高度拍摄的。根据输入的视频样本,预计会有不同程度的检测精度。运行程序对H.264本地视频进行测试,TensorRT能够成功运行,实时识别目标图像[14-15],测试效果如图2所示。
其运行性能如下:
FP32 run:400 batches of size 100 starting at 100
........................................
Top1: 0.9904, Top5: 1
Processing 40000 images averaged 0.00157702 ms/image and 0.157702 ms/batch.
FP16 run:400 batches of size 100 starting at 100
Engine could not be created at this precision
INT8 run:400 batches of size 100 starting at 100
........................................
Top1: 0.9908, Top5: 1
Processing 40000 images averaged 0.00122583 ms/image and 0.122583 ms/batch.
可以看到这个例子中采用int8量化时,提速可以达到20%以上,对于大计算量的应用,提速效果更好。推理(Inference)可以使用低精度的技术,训练的时候因为要保证前后向传播,每次梯度的更新是很微小的,这个时候需要相对较高的精度,一般来说需要float型,如FP32,32位的浮点型来处理数据。但是在推理的时候,对精度的要求没有那么高,很多研究表明可以用低精度,如半长(16字节)的FP16,也可以用8位的整型INT8来做推理,结果没有特别大的精度损失。低精度计算的好处是一方面可以减少计算量,原来计算32位的单元处理FP16的时候,理论上可以达到2倍的速度,处理INT8的时候理论上可以达到4倍的速度。另一方面是模型需要的空间减少,不管是权值的存储还是中间值的存储,应用更低的精度,模型大小会相应减小。
TensorRT的运行效果与GPU的硬件性能和采用的网络结构直接相关,量化标准仅仅是其中一个影响因素,不同的硬件和网络结构也会带来不同程度的速度提升。为了对比上述例子的加速性能,图3展示了采用GPU卡V100对ResNet网络进行TensorRT加速的实际效果。
这是一个比较极端的例子,该例中使用的是先进的GPU卡V100,V100添加了专门针对深度学习优化的TensorCore,TensorCore可以完成4×4矩阵的半精度乘法,也就是可以完成一个4×4的FP16矩阵和另外一个4×4的FP16矩阵相乘,当然可以再加一个矩阵(FP16 或FP32),得到一个FP32或者FP16的矩阵的过程。TensorCore在V100上理论峰值可以达到120 Tflops。如果只是用CPU来做推理,首先它的吞吐只能达到140,也就是说每秒只能处理140张图片,同时整个处理过程需要有14 ms的延迟,也就是说用户提交请求后,推理阶段最快需要14 ms才能返回结果;如果使用V100,在TensorFlow中去做推理,大概是6.67 ms的延时,但是吞吐只能达到305;如果使用V100加TensorRT,在保证延迟不变的情况下,吞吐可以提高15倍,高达5 700张图片帧/s。可以看到随着GPU性能的提升,以及网络结构的复杂化,TensorRT对推理速度的提升非常明显,对于大数据应用是一个很好的选择。目标英伟达公司已经将TensorRT项目部分开源,这势必会使TensorRT得到更好的推广应用。
-
表 1 Context_t结构主要成员
Table 1 Main members of Context_t structure
成员 描述 NvVideoDecoder 包含视频解码相关的成员和函数 NvVideoConverter 包含视频格式转换相关的成员和函数 NvEglRenderer 包含EGL显示渲染相关函数 EGLImageKHR EGLImage图像数据指针,用于CUDA处理,这个类型来源于EGL开源库 表 2 TRT_Context类主要成员
Table 2 Main members of TRT_Context class
TRT_Context类成员 描述 TRT_Context::buildTrtContext 构建Tensorrt上下文 TRT_Context::getNumTrtInstances 获取TRT_context 实例. TRT_Context::doInference TensorRT 推理接口 -
[1] NVIDIA. NVIDIA Deep learning SDK[DB/OL]. [2019-11-27] https://docs.nvidia.com/deeplearning/sdk/index.html.
[2] HINTON G E. Where do features come from?[J]. Cognitive Science,2014,38(6):1078-1101. doi: 10.1111/cogs.12049
[3] BISHOP C.Neutal networks for pattern recognition[M]. London: Oxford University Press, 1995.
[4] LECUN Y, BOTTOU L, BENGIO Y, et al. Gradient-based learning applied to document recognition[J]. Proceedings of the IEEE, 1998, 86:2278-2324.
[5] RICHARD S, CHRISTOPHER M, ANDREW N. Learning continuous phrase representations and syntactic parsing with recursive neural networks[C]//Taboe Nevada: MPS Neural Information Processing System, 2010: 1-9.
[6] CHEN Y, CHEN T, X UZ, et al. Diannao family: energy-efficient hardware accelerators for machine learning[J]. Communications of the ACM,2016,59(11):105-112. doi: 10.1145/2996864
[7] SUN F, WANG C, GONG L, et al. A power-efficient accelerator for convolutional neural networks[C]//2017 IEEE International Conference on Cluster Computering (CLUSTER). Washington: IEEE, 2017: 631-632.
[8] LUO T, LIU S, LI L, et al. Dadiannao: a neural network supercomputer[J]. IEEE Transactions on Computers,2017,66(1):73-88. doi: 10.1109/TC.2016.2574353
[9] GOKEN E, ERASLAN Z A, JULIEN G, et al. Deep learning: new computational modelling techniques for genomics[J]. Nature Reviews Genetics, 2019, 20(7): 389-403.
[10] AGARWAL A, DUCHI J C. Distributed delayed stochastic optimization[C]//Nevada: MIPS, Neural Information Processing Systems, 2011: 873-881.
[11] YOU Y, ZHANG Z, HSIEH CJ, et al. Imagenet training in minutes [C]//Proceedings of the 47th International Conference on Parallel Processing. New York: NY ACM, 2018: 1-10.
[12] SILVER D, SCHRITTWIESER J, SIMONYAN K, et al. Mastering the game of go without human knowledge[J]. Nature,2017,550(7676):354. doi: 10.1038/nature24270
[13] LONG J, SHELHAMER E, DARRELL T. Fully convolutional networks for semantic segmentation[C]//Proceeedings of 2015 IEEE Conference on Computer Vision and Pattern Recongnition. Boston, Washington: IEEE, 2015: 3411-3440.
[14] NG Y H, HAUSKNECHT M, VIJAYANARASIMHAN S, et al. Beyond short snippets: deep networks for video classification[J]. IEEE,2015,16(4):4694-4702.
[15] YANG Z, NEVATIA R. A multi-scale cascade fully convolutional network face detector[C]//Pattern Recognition(ICPR), 2016 23rd International Conference on IEEE. Washington: IEEE, 2016: 633-638.
-
期刊类型引用(24)
1. 陈俊杰,洪心皓. 面向嵌入式平台的智能巡视点位校正系统研究. 福建电脑. 2025(02): 88-92 . 百度学术
2. 孙晨,邓宽. 基于嵌入式AI设备的光伏电池片缺陷智能检测系统. 电子设计工程. 2024(04): 129-134 . 百度学术
3. 杨海斌. 基于改进YOLOv5S算法的铝型材表面缺陷检测. 电脑知识与技术. 2024(06): 47-51 . 百度学术
4. 陈炀,周雁,王庆娟,张馨元,谌业恒. 融合图像处理技术的红树林鸟类鸣声识别算法. 现代计算机. 2024(21): 38-42+48 . 百度学术
5. 程强,张友兵,周奎. 基于改进YOLOX的动态视觉SLAM方法. 电子测量技术. 2024(23): 123-133 . 百度学术
6. 马泉,张欣怡,李洪波,石广洋,郝斌,张飞. 胜利煤矿智能环境监测系统研究与设计. 中国煤炭. 2023(01): 77-82 . 百度学术
7. 郭奕裕,周箩鱼. 安全帽佩戴检测网络模型的轻量化设计. 计算机工程. 2023(04): 312-320 . 百度学术
8. 胡天鑫,邓超,马俊杰,刘旺. 方程式赛车ROS平台下基于TensorRT的YOLOv5算法改进. 农业装备与车辆工程. 2023(05): 14-19 . 百度学术
9. 程绳,葛雄,肖非,朱传刚,吴军,肖海涛,李嗣,楚江平,袁雨薇. 基于多任务学习的输电线路小金具缺失推理加速算法. 计算机测量与控制. 2023(07): 251-257 . 百度学术
10. 顾成伟,丁勇,李登华. 基于计算机视觉的工业厂区人员安全警戒系统. 计算机与现代化. 2023(09): 20-26 . 百度学术
11. 张宇昂,李琦. 基于Jetson TX2的路面病害检测应用. 信息技术与信息化. 2023(09): 112-115 . 百度学术
12. 刘一呈,赵建敏,赵宇飞. 基于机器视觉和TX2的牛生长参数测量系统设计. 信息技术与信息化. 2023(10): 13-18 . 百度学术
13. 范亚龙,李琦,于令君. 基于深度学习的冶炼工人安全着装监测系统. 科学技术与工程. 2023(31): 13626-13631 . 百度学术
14. 张宇昂,李琦,薛芳芳,于令君. 基于Jetson TX2的路面裂缝检测系统设计. 公路. 2023(12): 337-344 . 百度学术
15. 郭智超,徐君明,刘爱东. 基于嵌入式平台与优化YOLOv3的航拍目标检测方法. 兵工自动化. 2022(03): 10-15+20 . 百度学术
16. 徐丁天,李海峰,徐良. 基于人眼跟踪的360°悬浮显示系统及其畸变校正方法. 光学学报. 2022(09): 232-240 . 百度学术
17. 贾云飞,郑红木,刘闪亮. 基于YOLOv5s的金属制品表面缺陷的轻量化算法研究. 郑州大学学报(工学版). 2022(05): 31-38 . 百度学术
18. 何曦,李良福,王娇颖,王洁,卢晓燕,钱钧,杨一洲,刘培桢. 基于NPU的实时深度学习跟踪算法实现. 应用光学. 2022(04): 682-692 . 本站查看
19. 王昀,刘泓,叶珺,刘亚璇,吴小莉. 一种基于YoloV4-tiny算法的智能电子秤设计. 长江信息通信. 2022(10): 37-41 . 百度学术
20. 刘之禹,李述,王英鹤. 基于ZYNQ的深度学习卷积神经网络加速平台设计. 计算机测量与控制. 2022(12): 264-269 . 百度学术
21. 刘智文,刘全,宋玮,赵天成. 基于共享主干网络的人物属性识别推理加速算法. 智能物联技术. 2022(06): 4-10 . 百度学术
22. 钟昊,陈博,李占文,杨永成. 面向铁路安全的智能视觉PaaS平台研究. 中国铁路. 2021(08): 128-132 . 百度学术
23. 李良熹,荣进国. 基于深度学习的智能烘培类商品识别系统研究. 信息与电脑(理论版). 2021(13): 156-158 . 百度学术
24. 柴荣轩,赵津发,吴航,张文昌,张广,陈炜. 基于IPPG的非接触式血氧饱和度检测技术研究. 医疗卫生装备. 2021(12): 23-28 . 百度学术
其他类型引用(79)