【Atlas500】入门(七)——昇腾学院 | Atlas性能调优之编解码

转载自:昇腾学院 | Atlas性能调优之编解码, 作者:xiongoal

【摘要】 前面介绍了下瓶颈分析和流程编排,这期主要讲一下编解码。一般的推理业务中,对于视频流或者图片,如果使用软件解码,耗时较长,消耗大量CPU资源,解码出来的原图数据,转送到AI处理器上,传输速度比较慢,同时也会占用大量PCIE带宽。 将解码放到Device上,可以减少从Host到Device传输的数据量,同时降低数据传输时间开销和带宽压力 。昇腾310处理器带有DVPP硬件编解码模块,全称Davi…

前面介绍了下瓶颈分析和流程编排,这期主要讲一下编解码。

一般的推理业务中,对于视频流或者图片,如果使用软件解码,耗时较长,消耗大量CPU资源,解码出来的原图数据,转送到AI处理器上,传输速度比较慢,同时也会占用大量PCIE带宽。 将解码放到Device上,可以减少从Host到Device传输的数据量,同时降低数据传输时间开销和带宽压力 。

昇腾310处理器带有DVPP硬件编解码模块,全称Davinci Video Pre-Processor。使用Dvpp硬件编解码,可以将码流直接发送到处理器侧,在昇腾310处理器上完成解码、推理一整套流程。

DVPP
DVPP硬件编解码模块主要包括视频解码(VDEC)、视频编码(VENC)、JPEG编解码(JPEGD/E)、PNG解码(PNGD)、VPC。

VDEC
前面流程编排优化讲过,h264、h265视频解码,需要调用vdec硬件解码模块,昇腾310处理器有16路1080p解码能力。由于视频帧相互依赖,如果在一个Engine内,设置成多线程,代码处理起来比较麻烦。建议每路视频解码分成一个VdecEngine,线程数设置为1,这样每个VdecEngine只需要处理自己这路视频的数据即可。

Vdec解码输出HFBC数据(即压缩格式,为了降低写内存带宽),为什么要输出这么一个中间格式呢?直接出原图不好么?因为解压缩HFBC数据是VPC模块功能,和VDEC是两个独立模块。

HBFC什么时候可以发挥业务性优势?

【Atlas500】入门(七)——昇腾学院 | Atlas性能调优之编解码_第1张图片

用户可以从VDEC获取到HFBC数据后,通过调用VPC做resize/crop操作,一次性完成想要的输出结果。比如获取到1920x1080 HFBC数据,调用VPC一次性输出224x224 YUV数据。其中的resize/crop操作是需要用户配置相应参数的,用户可以获取到HFBC数据并随意配置参数调用VPC得到想要的结果,因此暴露了HFBC数据给用户,比较灵活,而且只要一次VPC,性能高(流程图的虚线部分(2))。但是如果用户必须需要原图,那就暂时发挥不了HBFC的最大优势。

JPEGD & PNGD
下载Sample DvppImagePerformance(https://www.huaweicloud.com/ascend/resources/CodeSamples)参考README.md,对代码进行编译。

分别测试下不同线程下JPEGD解码性能,如下图所示

spacer.gifjpegd_fps.PNG可以看出,在线程数设置为3~4时,JPEGD解码1080p图片的性能基本达到最大值。

同样,PNGD在线程数设置为6时性能最佳。spacer.gif

pngd_fps.PNG

注意,该Sample里面是通过创建多个解码Engine、线程数设置为1来实现多线程的,和创建一个解码Engine,修改线程数设置效果一样,减少Engine数量还能减少内存消耗。

VPC
前面提到过,昇腾310处理器上面有各种硬件,VDEC、JPEGD负责解码,AI Cpu和AICore负责推理,Ctrl Cpu负责device侧的通用计算,而VPC主要用于处理媒体图像转换,包括放大、缩小、色域转换、降bit数处理、格式转换、区块切割。

对于常见的视频图片推理业务,VPC起串联作用,接收解码的数据,按照要求抠图缩放后送给推理Engine。这里强烈推荐使用VPC的批量抠图功能。比如说,在目标检测完成后,需要依据检测出来的框抠出不同位置、不同大小的图片送到不同的模型进行下一步推理,这里就可以使用VPC的1抠N功能,可以减少硬件调用次数,提高效率。

总体来说,编解码这块性能比较固定,可以调优的地方不多,按照建议开发代码即可。

你可能感兴趣的:(嵌入式AI)