昇腾学院 | Atlas性能调优之编解码
一般的推理业务中,对于视频流或者图片,如果使用软件解码,耗时较长,消耗大量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
Vdec解码输出HFBC数据(即压缩格式,为了降低写内存带宽),为什么要输出这么一个中间格式呢?直接出原图不好么?因为解压缩HFBC数据是VPC模块功能,和VDEC是两个独立模块。
HBFC什么时候可以发挥业务性优势?
用户可以从VDEC获取到HFBC数据后,通过调用VPC做resize/crop操作,一次性完成想要的输出结果。比如获取到1920x1080 HFBC数据,调用VPC一次性输出224x224 YUV数据。其中的resize/crop操作是需要用户配置相应参数的,用户可以获取到HFBC数据并随意配置参数调用VPC得到想要的结果,因此暴露了HFBC数据给用户,比较灵活,而且只要一次VPC,性能高(流程图的虚线部分(2))。但是如果用户必须需要原图,那就暂时发挥不了HBFC的最大优势。
JPEGD & PNGD
下载Sample DvppImagePerformance(https://developer.huaweicloud.com/techfield/ascend.htmlzh/developer/mindx-sdk/applicationDetails/60172215?fromPage=2)参考README.md,对代码进行编译。
分别测试下不同线程下JPEGD解码性能,如下图所示
可以看出,在线程数设置为3~4时,JPEGD解码1080p图片的性能基本达到最大值。
同样,PNGD在线程数设置为6时性能最佳。
注意,该Sample里面是通过创建多个解码Engine、线程数设置为1来实现多线程的,和创建一个解码Engine,修改线程数设置效果一样,减少Engine数量还能减少内存消耗。
VPC
前面提到过,昇腾310处理器上面有各种硬件,VDEC、JPEGD负责解码,AI Cpu和AICore负责推理,Ctrl Cpu负责device侧的通用计算,而VPC主要用于处理媒体图像转换,包括放大、缩小、色域转换、降bit数处理、格式转换、区块切割。
对于常见的视频图片推理业务,VPC起串联作用,接收解码的数据,按照要求抠图缩放后送给推理Engine。这里强烈推荐使用VPC的批量抠图功能。比如说,在目标检测完成后,需要依据检测出来的框抠出不同位置、不同大小的图片送到不同的模型进行下一步推理,这里就可以使用VPC的1抠N功能,可以减少硬件调用次数,提高效率。
总体来说,编解码这块性能比较固定,可以调优的地方不多,按照建议开发代码即可。
- 点赞
- 收藏
- 关注作者
评论(0)