摘要:由於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]昇騰論壇