专栏名称: NVIDIA企业开发者社区
NVIDIA 英伟达开发者社区是NVIDIA GPU开发者交流平台,通过此平台可第一时间获取NVIDIA GPU 开发相关的新产品、新工具、线上/线下活动的资讯。
目录
相关文章推荐
蕨经  ·  我最终决定退出赴日癌症诊疗 ·  6 小时前  
肿瘤资讯  ·  乳腺癌腋窝手术医生意愿调研 ·  2 天前  
德大器械注册与临床  ·  【医美专栏】填充美容材料的发展和趋势 ·  3 天前  
蒲公英Ouryao  ·  新栏目上线!Paul's ... ·  3 天前  
保本生意  ·  shs科技100指数,以及中证a500指数, ·  3 天前  
保本生意  ·  shs科技100指数,以及中证a500指数, ·  3 天前  
51好读  ›  专栏  ›  NVIDIA企业开发者社区

不同的AI视频推理场景下,如何构建通用高效的抽帧工具?

NVIDIA企业开发者社区  · 公众号  ·  · 2021-03-19 10:00

正文

导读

AI算法在视频娱乐行业得到了广泛应用,在处理视频数据过程中最大瓶颈之一是视频抽帧延时,抽帧延时往往占据了整体服务的大部分时间。此外, 不同的AI算法应用于不同业务时,对视频抽帧需求也不同。


对此,本文介绍一种使用 NVIDIA GPU 的高性能视频编解码器和常规CPU的通用高效的抽帧工具,降低AI算法应用于视频服务的整体延时,并针对AI算法对视频抽帧的不同需求,在不同的使用场景下,提供通用化的功能。


本文源自爱奇艺技术产品团队智能加速组的项目实践,希望分享给广大开发者参考。


AI算法已经广泛应用于AI视频推理服务中,目前爱奇艺AI服务中与视频数据相关的服务多达数 百个,每个服务又由多个算法组成。 这些AI算法对输入视频数据的需求不同,部署硬件平台也不同,导致 AI算法在视频推理服务面临多方面的挑战。


例如: 以用户上传的短视频为主的视频审核业务而言,其主要挑战为: 为了提升用户体验,需要在 很短的时间内审核完成 用户上传的视频编码格式多样,需要视频抽帧工具能够 支持不同的编码格 视频审核业务需要对低俗、血腥、暴力、政治、儿童邪典等多方面进行审核,有的算法部署在GPU上,有的算法部署在CPU上,这需要抽帧工具无论是在 CPU 上还是在 GPU 上都能够 以很短的延时处理


而以长视频为主的词生产、转场点、行为识别、视频插帧等业务而言,其主要挑战为: 抽帧工具需要确保抽帧的结果精准, 即抽取的视频帧以及其时间戳与原视频完全吻合,此外长视频抽帧在高吞吐来提升资源利用率的使用场景下,也希望尽快处理完成,来提升不同业务线同学的工作效率。


一、整体服务延时大、硬件资源利用率低
由于视频往往数据量较大,以1小时、25FPS、1080P的视频为例,全抽帧后的图像总数将达到9万张,单个服务整体耗时很长,严重影响服务生产效率,导致整个业务效率低下。AI视频推理服务环节主要由几下几方面组成:下载、抽帧、预处理、AI算法处理、后处理、上传。其中视频抽帧和AI算法推理占据了大部分时间。例如: 1小时、H.264、1080P视频 使用4核 6148 CPU 抽帧存JPEG图像需要760秒。

当AI视频推理在预处理或者抽帧时使用CPU资源计算时,GPU资源没有被充分使用;或者单个算法模型对GPU硬件资源消耗较少,都有可能导致整体GPU资源利用率偏低。

二、算法需求差异较大、部署硬件资源不同
爱奇艺AI算法在视频图像领域蓬勃发展,不同的AI算法用在不同的业务时,对抽帧需求也不一致:每秒抽取的帧数,抽帧时是否需要保存不同格式的图像,抽帧时RGB数据是否直接存放内存或显存,对特定时间段抽帧,只对关键帧抽帧, 抽帧时缩放、裁剪图像,获取图像时间戳 等等。不同的需求导致很难通过某一套现有的方案来满足所有需求。

方案调研

目前视频解码的硬件平台主要有 CPU、GPU、FPGA 以及专业的编解码芯片,其中FPGA对AI算法支持不太完善,而专业解码芯片则功能太单一。因此较为常见的方案采用CPU和GPU作为服务侧常用的编解码硬件。CPU解码最常用的工具是使用FFmpeg,该工具能够较好的 满足目前AI算法不同的抽帧需求。 下文将分别从CPU与GPU两方面说明。

一、CPU抽帧应用于AI算法的通用方案
目前在CPU上使用FFmpeg抽帧运用于AI算法最常见的方法主要有以下两种:

1.FFmpeg将视频抽帧保存为图像后,AI算法调用:最传统的做法将视频下载后,使用FFmpeg解码并保存图像,AI算法读取图像,预处理后进行推理,后处理完成后将结果上传。这种传统的方式导致整体服务处理增加一些没必要的时间开销,具有主要的两个缺陷:

一、视频抽帧和算法推理处理延时太大,每个模块均为阻塞方式,需要前置步骤完全处理完成后,后续步骤才能够开始处理;

二、一张1080P的RGB无损原图保存需要6MB存储空间,1小时、1080P视频全部抽帧并保存原图将需要540G的存储空间,这将带来巨大的存储压力。

为此视频抽帧往往保存JPEG格式图像,JPEG图像具有极高的压缩率,1张1080P的JPEG图像往往 只需要0.1MB存储空间, 相比保存原图能够节约数十倍存储空间。但其缺陷为有损压缩,即JPEG保存后的图像读取后与原图相比存在一定的信息丢失,有可能导致AI算法推理时精度降低。此外AI算法读取图像时又需要将JPEG格式图像解码为 YUV格式 并将YUV格式图像转换为算法需要的RGB格式。由此可见,抽帧保存为JPEG图像提供给算法使用实为下策,然而有的服务中又确实需要将图像完全保存,故该方案还是在一些服务中被使用。

方案一 CPU抽帧落盘


2.鉴于上述方案的缺陷,目前CPU上使用FFmpeg抽帧提供给AI算法使用比较好的方案为:将视频解码YUV格式后,颜色空间转换为RGB格式,保存在内存中;AI算法 直接读取 内存中的 RGB图像数据, 并将每个环节进行流水线处理,使得每个环节都能够异步处理。其框架图为:

方案二 CPU抽帧不落盘


方案二相比方案一在延时上有较大的减少,且不再需要有损压缩图像,能够最大程度保留图像真实信息,避免AI算法精度降低。然而现今视频往往分辨率很高,对1080P、4K的视频抽帧时,即使是 不落盘方式 (不落盘:视频解码后,YUV格式转RGB数据,直接保存在内存或者显存中), 抽帧的延时都可能大于AI算法处理时长。尤其体现在AI算法经过图优化、算子优化以及定点量化后,整体服务延时大的主要瓶颈体现在使用CPU抽帧耗时长。使用不落盘方式1小时 H.264 1080P视频在CPU 6148需要350秒,而使用落盘方式(落盘:视频解码为YUV格式,将解码的YUV格式图像重新编码后保存在非易失存储上(如硬盘、SSD),通常保存为JPEG格式。),抽帧则需要760秒。此外,爱奇艺作为视频娱乐公司,AI算法在视频处理处理时,往往需要准确的时间戳来标定抽帧的图像精确对应的视频位置,而开源的 FFmpeg 抽帧时无法直接提供准确的时间戳。

二、GPU抽帧应用于AI算法的通用方案
NVIDIA提供的GPU抽帧相比CPU上使用 FFmpeg抽帧 能够大幅提升速度,在GPU V100上,H.264、1080P视频可达500 FPS以上,在GPU T4更是能够达到1000 FPS以上。故GPU抽帧相比CPU抽帧延时更小,其存在的主要缺陷为:


1. 相比FFmpeg提供的功能太少,没有1秒抽n帧、 只对关键帧抽帧 ,解码后保存JPEG图像等功能;


2. 解码 仅支持部分格式 无法满足所有情况;


3. GPU解码后的图像依然存放在显卡上,AI算法推理前往往需要对图像进行预处理,而视频GPU抽帧后的预处理仍在CPU计算上,存在数据传输耗时较大,导致不必要延时,这尤其体现在需要对视频每一帧的数据都需要处理的情形,两次 CPU-GPU之间 的数据拷贝耗时较大,无法完全在计算延时中掩盖。


最佳方式是将预处理使用CUDA函数直接在GPU上计算,然而服务太多,对每个算法的预处理进行CUDA优化需要消耗较多人力,使得该方案无法推广到所有服务。


4. 当前AI算法大多数由Python编写,也给直接使用GPU抽帧带来困难,虽然 NVIDIA提供了相关工具 来使得用Python调用GPU抽帧成为可能,但对安装环境有较多限制,有时与AI算法依赖环境冲突,使其无法满足大多数AI服务的要求。

方案3 GPU抽帧不落盘


通用高效抽帧在视频推理中的方案实施

基于以上的调研,本节将会详细阐述在CPU和GPU上的抽帧的优化和功能完善,增加Python接口,以及整体流程中抽帧工具和AI算法的 流水线优化

1. CPU抽帧的完善与优化
(1)准确获取抽帧图像时间戳:视频中的时间戳有显示时间戳PTS和解码时间戳DTS,DTS主要用来标识待解码视频帧送入解码器解码的顺序,而PTS指的是图像帧在视频中实际显示的时间点位,如果视频中没有B帧时,DTS和PTS顺序一样,但当时视频中存在B、P帧时,则 DTS PTS 的顺序不一样。AI服务中,使用的时间戳为PTS,对应视频帧在实际播放时的时间点位。抽帧的图像通过AI算法推理得到的结果需要与视频中的PTS时间点位完全一致,这就严格要求抽帧时获取的PTS必须完全准确。然而FFmpeg抽帧时无法直接返回该帧的PTS,本方案通过 优化FFMPEG输出控制逻辑, 来保证抽帧获取的PTS与原视频流中的点位一致。

(2)CPU抽帧在不落盘与落盘情况下加速优化:本方案采用资源换速度的方法,对于落盘的加速优化,使用 多线程分别抽取视频中的部分片段。 而不落盘的视频抽帧,使用多线程分片抽帧时,需要保证将抽帧结果顺序提供给算法使用,每个子线程负责多个小时间段,每个子线程抽取后获取的图像使用时间戳做顺序校准。确保每个子线程依次提供的数据能够与单线程抽取结果完全一致。

方案4 CPU抽帧不落盘抽帧优化







请到「今天看啥」查看全文