【5G科普】華為碼chine姐姐聊5G 第6期:NSA&SA是個啥
963
2022-05-30
剛剛結束的CANN訓練營第四期,大毛老師第三課的大作業題目如下:
1.在昇騰算子庫中選一個算子實現單算子調用(om方式),并且功能正常,結果正確;10分
加分項
1.與原始框架算子做了精度對比分析; ? ?5分
2.與原始框架算子做了性能對比分析; ? ?5分
3.單算子調用用aclcompileandexecute方式實現并且功能正常,結果正確 ? ?5分
4.將單算子調用應用到了實際應用場景中,形成了一個完整的應用案例; ?5分
5.發現問題后提issue到samples倉并最終被確認為版本問題; ?5分
?注意點:
1.不得與社區樣例代碼相同或與其他參與者的代碼相同,一經發現,提交時間較晚的ID直接記0分
2.不可執行的代碼不給分
3.作業最終得分會綜合代碼質量、README質量(README十分重要,如果按照README進行操作,過程不夠絲滑,或者有步驟缺失,可能會扣分甚至沒分的哦)
4.如果在做作業的過程中有疑問或者發現一些版本問題,鼓勵大家在samples倉提issue,如果發現有版本問題阻塞你完成作業,可以提issue并換一個算子嘗試,鼓勵大家幫忙發現版本問題。
我們來看看怎么做這個題目。
首先,張小白在 張小白教你在AI1S云服務器上安裝昇騰CANN5.0.4 https://bbs.huaweicloud.com/blogs/320903
這篇博客里面介紹了如何安裝CANN 5.0.4的版本,現在我們就基于這個版本, 來看看如何在推理服務器AI1S上完成單算子的調用。
(所謂的推理服務器這里指的是基于昇騰Ascend310的云服務器)
一、跑通樣例工程 om+aclopExecuteV2 (conv2d算子)
首先,使用MobaXTerm登陸 前面鏈接安裝好CANN 5.0.4的云服務器
下載樣例代碼:
wget https://obs-book.obs.cn-east-2.myhuaweicloud.com/aclopsamples/aclop_samples.tar.gz
解壓:tar -zxvf aclop_samples.tar.gz
。。。
解壓后有兩個目錄:
conv2d_aclopExecuteV2是使用om模型+aclopExecuteV2的方式完成單算子計算;
conv2d_aclopCompileAndExecute是直接使用aclopCompileAndExecute的方式完成單算子計算。
我們先跑通第一個樣例:
cd conv2d_aclopExecuteV2/out
執行單算子代碼:test.sh
它會自動下載和安裝tensorflow1.15.
這里首先報了個找不到libmsprof.so的錯,這個應該是profiling腳本對應的路徑不對,待會兒再說。
但是這個下載的速度往往會很慢,所以可以暫停掉這個腳本,手工指定pip源安裝tensorflow1.15.
pip3 install tensorflow==1.15.0 --user? -i https://pypi.tuna.tsinghua.edu.cn/simple
但是這個結果有很大的問題。矩陣的結果應該是全0才對。
經過咨詢CANN的大毛老師和句號老師,確認在CANN 5.0.4環境裝完之后,變量存在問題,需要把~/.bashrc文件中 setenv.sh后面的環境變量都注釋掉方可正常運行:
另外,前面提到的msprof.py找不到的問題,我們來找一下:
所以,需要把 /home/HwHiAiUser/aclop_samples/conv2d_aclopExecuteV2/out 目錄下的 parse_profiling.sh代碼做對應的修改:
(當然后面會發現,這樣的修改還是不夠的。但是至少現在跑能把代碼跑通)
張小白在這里簡單的介紹一下的大致流程:
1.隨機產生2個輸入數據和1個輸出數據(貌似輸出數據沒用),并將輸入數據和輸出數據寫入文件
2.使用src/main.cpp編譯好的 out/main代碼完成單算子的可執行代碼
3.執行Tensorflow 1.15同樣的conv算子代碼computebytf.py,這個代碼中會比較兩個結果的異同。如果結果相同,那么就會顯示全0(故而前面算出一大堆非0數據就說明算子計算的結果不一致)
4.處理profiling文件供性能分析。
我們還需要修改一下src/CMakeList.txt文件:
將生成文件的目錄改為 ../out
將include的路徑加上 ?/home/HwHiAiUser/Ascend/ascend-toolkit/latest/x86_64-linux/fwkacllib/include/
將libpath的路徑加上 /home/HwHiAiUser/Ascend/ascend-toolkit/latest/x86_64-linux/fwkacllib/lib64/stub/
如下所示:
先來編譯
cmake .
make clean
make
我們來運行一下:
cd /home/HwHiAiUser/aclop_samples/conv2d_aclopExecuteV2/out
bash test.sh
結果是全0,表示昇騰算子跟tensorflow算子算出的是一樣的。
當然,最后一句還是錯誤的。
經過句號老師的解釋,5.0.4版本的msprof,必須寫PROF開頭的目錄名稱。而不能寫 .(當前目錄)作為參數名稱。
根據前面生成的目錄名稱:
修改如下:
再單獨執行一下:
但是其實這個shell是有問題的。因為每次執行bash test.sh之后,都會生成一個新的PROF開頭的目錄,而這個shell不能反復地去修改這個目錄名稱吧?所以我們只好暫時把問題放到一邊。
二、跑通樣例工程 aclopCompileAndExecute (conv2d算子)
再看看第二種:conv2d_aclopCompileAndExecute的用法:
cd /home/HwHiAiUser/aclop_samples/conv2d_aclopCompileAndExecute/out
先把代碼清理下:
rm -rf PROF*
rm -rf *.in *.out
rm -f main main_om
cd ../src
將CMakeList.txt做同樣的修改。
cmake .
make clean
make
cd /home/HwHiAiUser/aclop_samples/conv2d_aclopCompileAndExecute/out
執行單算子代碼:
除了之后解析profiling的問題,前面都是OK的。
當然,也可以像上面一樣修正下 parse_profiling.sh:
然后手工執行一次:
這個profiling以后再說。
從現象上看,樣例代碼都跑完了。
三、跑通作業 om+aclopExecuteV2 (sub算子)
那么,這個作業到底怎么做呢?我們來找一個 Ascend和TF都有的算子做作業吧.
打開
https://support.huaweicloud.com/oplist-cann504alpha3infer/atlas_11_operatorlist_0001.html
查看CANN的310算子清單:
下載后是個chm文件(HTML幫助文件).這么老的格式貌似已經不容易打開了:
打開 https://support.huaweicloud.com/oplist-cann504alpha3infer/operatorlist_0070.html
找到支持TF1.15的算子清單
挑一個樣例工程中沒有的.
找一個Maxinum吧.
前面那個CHM文檔看不到右邊具體內容,經姐夫丁大大提醒,,需要右鍵屬性->解鎖..
于是打開了相關的算子介紹頁面:
當然,張小白感覺到Maxinum算子可能有點難度,就選擇了比較簡單的sub算子,對應TF里面是subtract算子。
怎么做呢?其實就是個依葫蘆畫瓢的過程:
先將conv2d_aclopExecuteV2 代碼復制一份,更名為sub_aclopExecuteV2
cp -r conv2d_aclopExecuteV2 sub_aclopExecuteV2
用om轉為離線模型,調用(atc-》加載aclopSetMdelDir/aclopLoad->執行aclopExecuteV2 這種方法做一下
先進入model目錄,清理下:
然后將op_list.json改為以下內容:
先用小的shape試一下.
從原理上說,
Sub(x,y)=x-y
Sub的算法是支持float16, float32和int32三種數據類型.
輸入時2個參數,輸出1個參數
算子輸入支持所有shape,輸出shape與輸入shape相同
算子輸入支持的format為:NCHW,NC1HWC0,NHWC,ND。
我們就用float16做一個轉換試試:
atc --singleop=./op_list.json --output=./ --soc_version=Ascend310
單算子om文件已經生成(文件名挺長的)
再切換到 /home/HwHiAiUser/aclop_samples/sub_aclopExecuteV2/ 目錄
make clean
rm cmake_install.cmake CMakeCache.txt
rm -rf CMakeFiles
切換到 /home/HwHiAiUser/aclop_samples/sub_aclopExecuteV2/src 目錄
make clean
rm cmake_install.cmake CMakeCache.txt
rm -rf CMakeFiles
這里的目的是將conv2d的代碼編譯的結果清理下.
我們開始修改下main.cpp代碼.
主要原則是將conv2d的代碼改為sub的代碼.
都是2個輸入,1個輸出.就是shape不一樣,而且沒有attr,其實也比較好改:
然后我們開始編譯目標代碼:
cmake .
make clean
make
將out目錄也清理一下:
rm -rf PROF*
rm -f *.in
將test代碼加上一些計時處理,并將生成隨機數的shape按照main.cpp對應的shape調整一下:
同理修改parse_profiling文件(以后不再贅述)
執行一下看看:
從前面的代碼可以看出,SUB(X-Y)是tensorflow算子算出的結果,C是昇騰算子計算后保存到文件再讀出來的結果,兩個是一模一樣的。
這就順利跑完了 om+aclopExecuteV2的例子。
四、跑通作業 aclopCompileAndExecute (sub算子)
同樣先修改主程序main.cpp
cd /home/HwHiAiUser/aclop_samples/sub_aclopCompileAndExecute/src
vi main.cpp
像上個例子一樣的方式清理環境之后,開始編譯:
切換到out目錄:
cd /home/HwHiAiUser/aclop_samples/sub_aclopCompileAndExecute/out
同樣修改test.sh
這回簡單點,不加計時的語句了:
開始驗證:
除了profiling處理,執行是沒有問題的。
這其實就已經把作業大致完成了。
對于profiling的問題,其實可以提一個issue。以前版本可以解析當前目錄下的相關記錄,生成profiling分析數據,現在需要寫死目錄名方可。這確實是一種退步,也不知道CANN團隊是怎么想的。。因為每次生成的目錄名都在變,我這個shell怎么寫才能捕捉每次的變化目錄名?
好吧。先這樣吧。張小白先大體上完成這個作業,還有其他的事情要做呢。
(全文完,謝謝閱讀)
Ubuntu 昇騰
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。