昇騰Mindstudio官方樣例源碼解讀分享---Resnet50推理
作為初學者,最近剛接觸Ascend200DK,按照官方的指導一步步搭建起了開發+運行環境,指導可以參考下面這個鏈接https://gitee.com/lovingascend/quick_start/blob/master/Atlas200DK_separate_MD/environment.md
運行的第一個樣例就是Mindstudio自帶的Resnet50網絡,對昇騰AI處理器的強大性能尤為印象深刻。個人習慣會去研究一下源碼,這里分享下心得體會,能力有限,水平一般,如果哪里寫的不對的,還請指正。
對于Mindstudio開發套件,個人理解作用是提供一個簡單方便的界面,讓代碼開發和調試更加順暢,
Mindstudio安裝在開發環境Ubuntu18.04系統,而我們最終編譯出來的二進制文件要跑在運行環境的CentOS上面,如果沒有Mindstudio的話,我們要不就是直接在運行環境上編譯,要不就得在開發環境上搭建交叉編譯環境,而使用Mindstudio在編譯的時候,直接就可以選定目標版本和ARM or X86架構,節省了不少時間。然后推理的依賴文件、輸出結果,Mindstudio工具可以進行方便的內部傳輸,不用手工再用scp或者sftp之類的操作互傳。另外還有profiling工具進行性能調優等功能強大的組件,暫時沒用到,后面再深入體會。
Resnet50樣例代碼的結構如下:
1、預處理
script/transferPic.py 這里是圖像的預處理,將jpg圖片轉成bin
om模型在推理時,需要輸入的是二進制的bin文件,所以這里要提前進行轉換,查看這個python的源碼:
這里使用了Pillow庫將圖片resize之后,圖像排列由rgb轉為bgr,然后減均值,最后保存成bin文件。
2、src/main.cpp
主函數,程序入口:
實例化類SampleProcess,這個類里面實現了acl的初始化和模型的推理,還有后處理即羅列top1~top5類別的置信度。
3、src/sampleprocess.cpp
Result SampleProcess::InitResource()
此處代碼實現acl的初始化、setDevice、創建Context和stream、設置runMode。
關于runMode,可以理解為我們最終的二進制文件需要在運行環境上執行時,是直接在Device側運行,還是在Host側運行,相應的一些acl接口應該存在差異,所以這里要區分一下。
Result SampleProcess::Process()
這里就是加載om模型和傳入輸入圖片bin文件,然后進行推理,后處理得到top1~top5分類置信度。
processModel.Execute(),這里就是模型執行推理的地方,如果想知道單純的芯片推理性能,可以在這個語句前后打點,然后計算耗時是多少ms得到。
4、src/model_process.cpp
這個cpp里面包含的都是模型的加載、卸載、輸入和輸出的初始化操作,包括內存分配與釋放。
這里通過aclrtMalloc接口申請內存的時候,注意紅框的地方,都是大頁內存優先,應該是性能更優。
5、src/utils.cpp
這個cpp里面放的是讀取bin文件的函數和獲取device側buffer,感覺好像沒用到,不太清楚干啥用的。
6、結語
acl接口的文檔可以參考下面這個鏈接:
https://support.huaweicloud.com/adevg-A200dk_3000/atlasdevelpment_01_0014.html
個人感覺ACL這一套接口很強大,可以很方便的調用硬件底層能力,這個文檔里面還有很多應用開發樣例可以參考,非常nice。
更多使用昇騰AI芯片推理&訓練案例
Ascend官方Modelzoo:
https://gitee.com/ascend/modelzoo
昇騰
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。