摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法,
本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN,
DVPP是昇騰AI處理器內置的影像處理單元,通過AscendCL媒體資料處理介面提供強大的媒體處理硬加速能力,主要功能包括影像編解碼、視頻編解碼、影像摳圖縮放等,
由于媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法:
- 使用錯誤的DVPP記憶體申請介面,導致應用程式報錯并退出
- 記憶體大小不符合DVPP的要求,導致應用程式報錯并退出
- DVPP記憶體被提前釋放,導致視頻流解碼輸出的影像例外
- 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每一幀視頻流正常,解碼程序無例外(無例外日志),僅輸出圖片有例外,
可能原因
解碼程序無例外,說明送入的視頻碼流不是例外碼流,僅輸出被破壞,可能由于:
- 輸出記憶體被復用、被踩或者被提前釋放;
- 解碼需要的輸出記憶體比實際申請的記憶體大,
處理步驟
- 對于DVPP記憶體申請介面,增加日志列印記憶體大小及地址,檢查VDEC輸出記憶體,檢查申請的記憶體大小是否與實際使用的一致,比如典型的錯誤場景,VDEC解碼輸出格式預期是RGB,實際仍按照YUV420SP申請記憶體,
- 在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.uj5u.com/qita/550566.html
標籤:其他
上一篇:msf學習