0 项目背景
见《AI视频行为分析系统项目复盘——技术篇1》
https://blog.csdn.net/weixin_42118657/article/details/118105545?spm=1001.2014.3001.5501
1 为什么不使用CPU解码?
原因提炼如下:
- CPU利用率冲顶,而GPU利用率低:视频流的解码工作,一般视频处理函数库由于历史原因,默认使用CPU解码视频流,但如果要实时解码多路视频流,CPU的计算资源将耗费非常严重。这种情况下,服务器内的CPU会经常感觉不够用成为瓶颈,但是与此同时,GPU的利用率通常还很低。导致GPU利用率低原因如下:
- DL工程一般数据流如下:CPU解码视频(费时间)→ CPU各种预处理图片(费时间)→图片从内存拷贝到GPU显存中(费时间)→GPU推理图片(一般的DL模型任务,速度非常快),即便采用数据缓冲池等操作,但很多时候再昂贵的CPU也赶不上GPU推理图片速度。
- GPU近些年来的硬件能力进步速度远超过CPU,而且相关GPU推理加速优化方法也进展迅速。两者任务量不变的情况下,GPU相对CPU经常大大超前完成任务。
- GPU相对CPU天生更擅长解码工作:虽然CPU内也有核显,但相对GPU还是小了点。
2 GPU解码当前主流方案有哪些?
本文等下说的是PC机内DL开发中的主要方法,其他情况下需要更多的跟踪调研,比如手机芯片中,有非常专用的视频解码单元、音频解码单元等等。
通常的方法如下:
- OpenCV中的硬解码:由cv::gpu::VideoReader_GPU完成。(当前不支持RTSP视频流解码)
- ffmpeg + CUVID:FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源程序。CUVID是基于CUDA的视频解码库。FFmpeg编码库可以使用GPU加速。
- deepstream方案:NVIDIA推出的一整套工具,包含解码、预处理和推理,一般推荐直接用这个。但是其灵活性在某些场景可能目前还不够,具体参考:《深兰科技|硬编解码技术的AI应用》
3 GPU硬解码的一个全过程Demo实现
略。
4 CPU解码和GPU解码的性能对比
注意:GPU解码在深度学习工程项目中主要在两个环节应用,即解码视频流 + 图像预处理(主要是颜色空间转换和resize)。
参考1:(公司内部人员测试)
视频流解码对比:3倍
CPU上解码:
- CPU占用率:538.5%
- 总帧数: 18514
- 耗时:30591.02 ms
- 平均每帧耗时:1.652318 ms
GPU上解码:
- CPU占用率:30.3%
- GPU占用率:3%
- 显存占用:215MB
- 总帧数: 18514
- 耗时:9699.89 ms
- 平均每帧耗时: 0.52392189 ms
视频流解码 + cvtColor 对比:预估10倍
参考2:https://www.cnblogs.com/ahfuzhang/p/10855762.html
视频大小:1168856 字节
画面尺寸:480*848
帧数:275
opencv + cuvid 方案:tesla P4(性能类似于GTX 1070)解码性能:1426.84 fps
ffmpeg 4.0 API 方案:[Intel(R) Xeon(R) Gold 6133 CPU @ 2.50GHz]解码性能:206.46 fps
GPU解码是CPU解码的6.9倍。
注意:
1. GPU解码丢了两帧;
2. 如果使用cuda stream流水线技术,理论上性能还会再提升。