应用光学, 2020, 41 (2): 337, 网络出版: 2020-04-23   

使用TensorRT进行深度学习推理 下载: 666次

Using TensorRT for deep learning and inference applications
作者单位
1 西安应用光学研究所,陕西 西安 710065
2 西安北方光电科技防务有限公司,陕西 西安 710043
摘要
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.

1 引言

英伟达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. TensorRT processing flow

Fig. 1. TensorRT processing flow

下载图片 查看所有图片

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显示渲染相关函数
EGLImageKHREGLImage图像数据指针,用于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 class

TRT_Context类成员描述
TRT_Context::buildTrtContext构建Tensorrt上下文
TRT_Context::getNumTrtInstances获取TRT_context 实例.
TRT_Context::doInferenceTensorRT 推理接口

查看所有表

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.

图 2. Program test effect

Fig. 2. Program test effect

下载图片 查看所有图片

可以看到这个例子中采用int8量化时,提速可以达到20%以上,对于大计算量的应用,提速效果更好。推理(Inference)可以使用低精度的技术,训练的时候因为要保证前后向传播,每次梯度的更新是很微小的,这个时候需要相对较高的精度,一般来说需要float型,如FP32,32位的浮点型来处理数据。但是在推理的时候,对精度的要求没有那么高,很多研究表明可以用低精度,如半长(16字节)的FP16,也可以用8位的整型INT8来做推理,结果没有特别大的精度损失。低精度计算的好处是一方面可以减少计算量,原来计算32位的单元处理FP16的时候,理论上可以达到2倍的速度,处理INT8的时候理论上可以达到4倍的速度。另一方面是模型需要的空间减少,不管是权值的存储还是中间值的存储,应用更低的精度,模型大小会相应减小。

TensorRT的运行效果与GPU的硬件性能和采用的网络结构直接相关,量化标准仅仅是其中一个影响因素,不同的硬件和网络结构也会带来不同程度的速度提升。为了对比上述例子的加速性能,图3展示了采用GPU卡V100对ResNet网络进行TensorRT加速的实际效果。

图 3. Effect of TensorRT reasoning in V100 card+ResNet network

Fig. 3. Effect of TensorRT reasoning in V100 card+ResNet network

下载图片 查看所有图片

这是一个比较极端的例子,该例中使用的是先进的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] NVIDIA. NVIDIA Deep learning SDK[DBOL]. [20191127] https:docs.nvidia.comdeeplearningsdkindex.html.

[2] HINTON G E. Where do features come from?[J]. Cognitive Science, 2014, 38(6): 1078-1101.

[3] BISHOP C.Neutal wks f pattern recognition[M]. London: Oxfd University Press, 1995.

[4] LECUN Y, BOTTOU L, BENGIO Y, et al. Gradientbased learning applied to document recognition[J]. Proceedings of the IEEE, 1998, 86:22782324.

[5] RID S, CHRISTOPHER M, REW N. Learning continuous phrase representations syntactic parsing with recursive neural wks[C]Taboe Nevada: MPS Neural Infmation Processing System, 2010: 19.

[6] CHEN Y, CHEN T, X UZ. Diannao family: energy-efficient hardware accelerators for machine learning[J]. Communications of the ACM, 2016, 59(11): 105-112.

[7] SUN F, WANG C, GONG L, et al. A powerefficient accelerat f convolutional neural wks[C]2017 IEEE International Conference on Cluster Computering (CLUSTER). Washington: IEEE, 2017: 631632.

[8] LUO T, LIU S, LI L. Dadiannao: a neural network supercomputer[J]. IEEE Transactions on Computers, 2017, 66(1): 73-88.

[9] GOKEN E, ERASLAN Z A, JULIEN G, et al. Deep learning: new computational modelling techniques f genomics[J]. Nature Reviews Geics, 2019, 20(7): 389403.

[10] AGARWAL A, DUCHI J C. Distributed delayed stochastic optimization[C]Nevada: MIPS, Neural Infmation Processing Systems, 2011: 873881.

[11] YOU Y, ZHANG Z, HSIEH CJ, et al. Image training in minutes [C]Proceedings of the 47th International Conference on Parallel Processing. New Yk: NY ACM, 2018: 110.

[12] SILVER D, SCHRITTWIESER J, SIMONYAN K. Mastering the game of go without human knowledge[J]. Nature, 2017, 550(7676): 354.

[13] LONG J, SHELHAMER E, DARRELL T. Fully convolutional wks f semantic segmentation[C]Proceeedings of 2015 IEEE Conference on Computer Vision Pattern Recongnition. Boston, Washington: IEEE, 2015: 34113440.

[14] . Beyond short snippets: deep networks for video classification[J]. IEEE, 2015, 16(4): 4694-4702.

[15] YANG Z, NEVATIA R. A multiscale cade fully convolutional wk face detect[C]Pattern Recognition(ICPR), 2016 23rd International Conference on IEEE. Washington: IEEE, 2016: 633638.

周立君, 刘宇, 白璐, 刘飞, 王亚伟. 使用TensorRT进行深度学习推理[J]. 应用光学, 2020, 41(2): 337. Lijun ZHOU, Yu LIU, Lu BAI, Fei LIU, Yawei WANG. Using TensorRT for deep learning and inference applications[J]. Journal of Applied Optics, 2020, 41(2): 337.

本文已被 1 篇论文引用
被引统计数据来源于中国光学期刊网
引用该论文: TXT   |   EndNote

相关论文

加载中...

关于本站 Cookie 的使用提示

中国光学期刊网使用基于 cookie 的技术来更好地为您提供各项服务,点击此处了解我们的隐私策略。 如您需继续使用本网站,请您授权我们使用本地 cookie 来保存部分信息。
全站搜索
您最值得信赖的光电行业旗舰网络服务平台!