CANN开发实践:4个DVPP内存问题的典型案例解读

摘要:由于DVPP媒体数据处理功能对存放输入、输出数据的内存有更高的要求(例如,内存首地址128字节对齐),因此需调用专用的内存申请接口,那么本期就分享几个关于DVPP内存问题的典型案例,并给出原因分析及解决方法。

本文分享自华为云社区《FAQ_DVPP内存问题案例》,作者:昇腾CANN。

DVPP是昇腾AI处理器内置的图像处理单元,通过AscendCL媒体数据处理接口提供强大的媒体处理硬加速能力,主要功能包括图像编解码、视频编解码、图像抠图缩放等。

由于媒体数据处理功能对存放输入、输出数据的内存有更高的要求(例如,内存首地址128字节对齐),因此需调用专用的内存申请接口,那么本期就分享几个关于DVPP内存问题的典型案例,并给出原因分析及解决方法:

  1. 使用错误的DVPP内存申请接口,导致应用程序报错并退出
  2. 内存大小不符合DVPP的要求,导致应用程序报错并退出
  3. DVPP内存被提前释放,导致视频流解码输出的图像异常
  4. DVPP读/写内存地址无效,导致应用程序异常中断

01 使用错误的DVPP内存申请接口,导致应用程序报错并退出

现象描述

从日志存放路径(默认为“$HOME/ascend/log”)下获取运行应用程序的日志,日志中的报错示例如下:

device:0 chn 0, input buffer is invalid, make sure it has been allocated with hi_mpi_dvpp_malloc or acldvppMalloc.

 

device:0 chn 0, output buffer is invalid, make sure it has been allocated with hi_mpi_dvpp_malloc or acldvppMalloc.

可能原因

根据日志提示,是因为没有使用指定的接口申请内存,导致内存地址校验出错。

由于DVPP媒体数据处理功能对存放输入、输出数据的内存有更高的要求(例如,内存首地址128字节对齐),因此需调用专用的内存申请接口,如下:

  • 调用媒体数据处理V1版本的接口对图片进行抠图、缩放等操作时,调用acldvppMalloc接口申请内存。
  • 调用媒体数据处理V2版本的接口对图片进行抠图、缩放等操作时,调用hi_mpi_dvpp_malloc接口申请内存。

处理步骤

检查代码,确认在DVPP媒体数据处理的各功能中,是否使用acldvppMalloc接口/ hi_mpi_dvpp_malloc接口申请存放输入或输出数据的Device内存。

但需注意:

  • 可将DVPP媒体数据处理的输出作为模型推理的输入,从性能角度,减少拷贝,实现内存复用。
  • 由于DVPP媒体数据处理访问的专用地址空间有限,为确保媒体数据处理时内存足够,除媒体数据处理功能外,其它使用Device内存的功能,建议调用aclrtMalloc接口申请内存。

02 内存大小不符合DVPP的要求,导致应用程序报错并退出

现象描述

从日志存放路径(默认为“$HOME/ascend/log”)下获取运行应用程序的日志,日志中的报错示例如下:

buffer size(3110400) is smaller than need buffer size(4147200) when format is 3.

 

device 0, vpc end address is illegal, check allocated buffer size: configured buffer size: 3110400, current pic: format 3 width_stride 1920 height_stride 1080.

可能原因

虽然使用了正确的DVPP内存申请接口,但:

  • 代码中申请的内存大小小于该格式所需的输入或输出内存大小;
  • 或者传入接口的内存大小正常,与输入格式也匹配,但是超出了实际申请的内存大小,所以校验出来结束地址非法。

处理步骤

1. 进入昇腾文档中心(https://www.hiascend.com/zh/document),拖动到“推理”区域,通过API参考进入最新版本的文档(或者可以在左上方选择需要的版本),在媒体数据处理章节,根据DVPP各功能对内存大小的要求,检查代码中对应格式的内存大小是否正确;

2. 在代码中增加打印内存长度的日志,检查传入接口的内存大小是否与实际申请的内存大小一致。

03 DVPP内存被提前释放,导致视频流解码输出的图像异常

现象描述

原始H264/H265每一帧视频流正常,解码过程无异常(无异常日志),仅输出图片有异常。

可能原因

解码过程无异常,说明送入的视频码流不是异常码流,仅输出被破坏,可能由于:

  • 输出内存被复用、被踩或者被提前释放;
  • 解码需要的输出内存比实际申请的内存大。

处理步骤

  1. 对于DVPP内存申请接口,增加日志打印内存大小及地址,检查VDEC输出内存,检查申请的内存大小是否与实际使用的一致,比如典型的错误场景,VDEC解码输出格式预期是RGB,实际仍按照YUV420SP申请内存。
  2. 在DVPP内存释放接口处、以及hi_mpi_vdec_get_frame/aclvdecCallback/acldvppJpegDecodeAsync接口处,增加内存大小及地址的打印日志,确认内存释放时序,是否存在内存地址解码完成前被提前释放的情况。

04 DVPP读/写内存地址无效,导致应用程序异常中断

现象描述

从日志存放路径(默认为“$HOME/ascend/log”)下获取运行应用程序的日志,Device侧内核态日志报错图像处理模块异常,报错示例如下:

vpc get err int: vpc_cvdr_axi_rd_resp_err

 

vpc get err int: vpc_cvdr_axi_wr_resp_err

可能原因

  • cvdr_axi_rd_resp_err:表示读地址越界,可能申请的输入内存太小或内存地址无效,昇腾AI处理器执行读操作时访问到了无效地址。
  • cvdr_axi_wr_resp_err:表示写地址越界,可能申请的输出内存太小或内存地址无效,昇腾AI处理器执行写操作时访问到了无效地址。

处理步骤

1. 在申请DVPP内存的接口处、以及在异常任务接口处增加日志打印,检查申请的输入\输出内存大小与实际使用的输入\输出内存大小是否一致;

2. 在释放DVPP内存的接口处增加打印日志,检查任务完成之前是否存在内存被提前释放的情况。

05 更多介绍

[1]昇腾文档中心

[2]昇腾社区在线课程

[3]昇腾论坛

 

点击关注,第一时间了解华为云新鲜技术~

原文链接:https://www.cnblogs.com/huaweiyun/p/17333559.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:CANN开发实践:4个DVPP内存问题的典型案例解读 - Python技术站

(0)
上一篇 2023年4月19日
下一篇 2023年4月19日

相关文章

  • TensorFlow 循环神经网络RNN

    1.RNN 现实世界中,很多元素都是相互连接的,比如股票随时间的变化,小明说:我喜欢旅游,其中最喜欢的地方是云南,每当放假时我经常去______旅游.这里填空,人应该都知道是填“云南”。因为我们是根据上下文的内容推断出来的,但机器要做到这一步就相当得难了。因此,就有了现在的循环神经网络,他的本质是:像人一样拥有记忆的能力。因此,他的输出就依赖于当前的输入和记…

    2023年4月6日
    00
  • PM、GAN、InfoGAN、对抗自编码模型对比 – 那抹阳光1994

    PM、GAN、InfoGAN、对抗自编码模型对比 本文源自知乎,仅作为个人学习使用。 作者:郑华滨链接:https://zhuanlan.zhihu.com/p/27159510来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 前段时间我受极视角邀请,在斗鱼上直播分享有关GAN的话题。考虑到现在网上关于GAN的文章、视频都已经非…

    2023年4月6日
    00
  • 【599】keras.layers 里面 Multiply、multiply & Add、add 的区别

      再看 Attention U-Net 源码的时候,注意到了有 keras.layers 里面有 Multiply 和 multiply 两个方法   它们可以实现相同的效果,但是语法稍有不同 # 按照图层的模式处理 Multiply()([m1, m2]) # 相当于一个函数操作 multiply([m1, m2])   另外可以实现 broadcast…

    Keras 2023年4月7日
    00
  • pytorch 配置详细过程

    torch github 项目多方便,api好调用 cpu版本 装torch 安装最新版本的就可以。 torchvision 要版本对应算法:torchvision版本号=torch版本号第一个数字-1.torch版本号第二个数字+1.torch版本号第三个数字 所以我的就是: pip install torchvision==0.14.1 -i https…

    2023年4月6日
    00
  • 【项目实践】图像检索系统 Image Retrieval Engine Based on Keras(一)

    源代码:https://github.com/willard-yuan/flask-keras-cnn-image-retrieval.git 图像检索基础小项目,我用来入门。 实践步骤: 搭建环境 运行程序 啃代码 搭建环境下载Anaconda,根据官方指导修改内嵌python版本为3.6.8。用Anaconda创建虚拟环境v36,在v36下安装Thean…

    2023年4月8日
    00
  • pytorch和tensorflow的爱恨情仇之张量

    pytorch和tensorflow的爱恨情仇之基本数据类型:https://www.cnblogs.com/xiximayou/p/13759451.html pytorch版本:1.6.0 tensorflow版本:1.15.0 基本概念:标量、一维向量、二维矩阵、多维张量。 1、pytorch中的张量 (1)通过torch.Tensor()来建立常量 …

    2023年4月8日
    00
  • 循环神经网络RNN以及LSTM的推导和实现

    1. 从神经网络谈起 了解神经网络的都知道,神经网络作为一种非线性模型,在监督学习领域取得了state-of-art的效果,其中反向传播算法的提出居功至伟,到如今仍然是主流的优化神经网络参数的算法. 递归神经网络、卷积神经网络以及深度神经网络作为人工神经网络的”变种”,仍然延续了ANN的诸多特质,如权值连接,激励函数,以神经元为计算单元等,只不过因为应用场景…

    2023年4月8日
    00
  • 【火炉炼AI】机器学习016-如何知道SVM模型输出类别的置信度

    【火炉炼AI】机器学习016-如何知道SVM模型输出类别的置信度 (本文所使用的Python库和版本号: Python 3.5, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 ) 一般的,对于未知样本,我们通过模型预测出来属于某种类别,往往会给出是这种类别的概率。 比如通过AI模型识别某一种图片是“狗”的概率是9…

    机器学习 2023年4月11日
    00
合作推广
合作推广
分享本页
返回顶部