使用TensorRT进行深度学习推理 下载: 666次
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 定义视频处理结构体
本文例程将本地存储的H.264视频文件进行解码、格式转换和渲染,为了使流程清晰,便于管控,定义context_t结构管理视频处理全部资源。如
表 1. Context_t结构主要成员
Table 1. Main members of Context_t structure
|
2 利用TRT_Context类进行加速推理
英伟达提供的TRT_Context类包含一系列接口来加载Caffe模型并执行推理。
表 2. TRT_Context类主要成员
Table 2. Main members of TRT_Context class
|
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],测试效果如
其运行性能如下:
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. 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.
[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.
[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.
[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.
Article Outline
周立君, 刘宇, 白璐, 刘飞, 王亚伟. 使用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.