前言:CANN 訓(xùn)練營(yíng)的Ascend?C算子課程墅拭,以在線(xiàn)課程的方式提供了一個(gè)沙箱實(shí)驗(yàn)環(huán)境。這將有助于幫助開(kāi)發(fā)者了解Ascend?C算子開(kāi)發(fā)的軟、硬件環(huán)境;熟悉自定義Ascend C算子的開(kāi)發(fā)流程和關(guān)鍵代碼艰额;同時(shí)也可以了解到自定義算子包的部署路徑及部署后的各類(lèi)文件。
在線(xiàn)試驗(yàn)地址:在線(xiàn)實(shí)驗(yàn)>基于昇騰CANN的Ascend C算子開(kāi)發(fā)
https://www.hiascend.com/zh/edu/experiment/operation/Tik_xl
配套課程地址:CANN訓(xùn)練營(yíng)2023年第一季_TIK C++算子開(kāi)發(fā)入門(mén)
https://www.hiascend.com/zh/developer/courses/detail/1627494761683783682
一椒涯、系統(tǒng)環(huán)境
1柄沮、硬件芯片:昇騰910A
2、CANN版本
3废岂、算子開(kāi)發(fā)包
二祖搓、算子實(shí)現(xiàn)分析
????沙箱實(shí)驗(yàn),實(shí)現(xiàn)的是動(dòng)態(tài)shape的add的Ascend?C算子湖苞。
一)配置環(huán)境
二)下載代碼包
樣例工程關(guān)鍵目錄和文件的用途如下所示:
三)代碼分析及補(bǔ)全
1拯欧、kernel側(cè)代碼
????????實(shí)現(xiàn)代碼在算子工程的/ai_core/op_kernel/add_tik2.cpp中。
?1)算子類(lèi)——init()
???2)算子類(lèi)——process()及3個(gè)基本任務(wù)CopyIn财骨,Compute哈扮,CopyOut
????????基于矢量編程范式,將核函數(shù)的實(shí)現(xiàn)分為3個(gè)基本任務(wù):CopyIn蚓再,Compute,CopyOut包各。Process函數(shù)中通過(guò)如下方式調(diào)用這三個(gè)函數(shù)摘仅。
????CopyIn:使用DataCopy接口將GlobalTensor數(shù)據(jù)拷貝到LocalTensor;使用EnQue將LocalTensor放入VecIn的Queue中问畅。
?Compute:使用DeQue從VecIn中取出LocalTensor娃属;使用Ascend C算子接口Add(2級(jí)接口)完成矢量計(jì)算;使用EnQue將計(jì)算結(jié)果LocalTensor放入到VecOut的Queue中护姆。
????CopyOut:使用DeQue接口從VecOut的Queue中取出LocalTensor注祖;使用DataCopy接口將LocalTensor拷貝到GlobalTensor上熊泵。
2、host側(cè)代碼
????host側(cè)算子實(shí)現(xiàn)開(kāi)發(fā),包括算子原型注冊(cè)烙荷、Shape推導(dǎo)等函數(shù)實(shí)現(xiàn)與注冊(cè)、Tiling實(shí)現(xiàn)與注冊(cè)和信息庫(kù)配置敬肚。實(shí)現(xiàn)代碼在算子工程的/ai_core/op_host/add_tik2.cpp中菜循。
????????1)算子原型注冊(cè):
????2)Shape推導(dǎo)等函數(shù)實(shí)現(xiàn)與注冊(cè):
????3)Tiling實(shí)現(xiàn)與注冊(cè):
????????4)信息庫(kù)配置及算子注冊(cè):
四)UT測(cè)試
???????UT的本質(zhì)是使用內(nèi)核調(diào)用符測(cè)試CPU模式下的Ascend C算子的用例,在算子工程UT測(cè)試目錄下的add_tik2_ut.cc文件添祸,增加CPU側(cè)算子調(diào)用代碼如下:
????????運(yùn)行指令:
????????????cd $HOME/cann_op_contrib/ ./build.sh -u tikcpp
????????運(yùn)行結(jié)果:
五)編譯部署
1滚粟、算子包打包
????進(jìn)入cann_op_contrib算子工程目錄,執(zhí)行算子包打包腳本刃泌,命令如下:
????????cd $HOME/cann_op_contrib/
????????./pack.sh
????????打包成功后凡壤,會(huì)在當(dāng)前目錄下創(chuàng)建output目錄署尤,并在output目錄下生成自定義算子安裝包CANN_OP_CONTRIB_linux-aarch64.run。
2.?自定義算子安裝包部署
????????以運(yùn)行用戶(hù)執(zhí)行如下命令亚侠,安裝自定義算子包曹体。
????????cd $HOME/cann_op_contrib/output
????????./CANN_OP_CONTRIB_linux-aarch64.run --install
????????命令執(zhí)行成功后,自定義算子包中的相關(guān)文件會(huì)部署當(dāng)前環(huán)境中盖奈。默認(rèn)安裝路徑是tool-kit的“opp/vendors/”目錄下混坞,沙箱中的路徑為:
/usr/local/Ascend/ascend-toolkit/latest/opp/vendors
? ? ????目錄結(jié)構(gòu)與自定義TBE算子基本一致,在算子實(shí)現(xiàn)代碼部分钢坦,多了cpp格式的實(shí)現(xiàn)代碼究孕。
六)ST測(cè)試
????????ST的本質(zhì)是創(chuàng)建ACL應(yīng)用程序測(cè)試NPU模式下的Ascend C算子用例,將開(kāi)發(fā)好的算子爹凹,編譯好后厨诸,打包成自定義算子包,部署到系統(tǒng)中禾酱。
????通過(guò)msopst工具微酬,將用戶(hù)定義的ST測(cè)試配置的*.json生成單算子的om文件,使用AscendCL接口加載單算子模型文件并執(zhí)行單算子om文件颤陶,驗(yàn)證算子執(zhí)行結(jié)果的正確性颗管。
1、在算子工程ST測(cè)試目錄下的add_tik2.json增加測(cè)試用例
2滓走、配置ST測(cè)試用例編譯所需環(huán)境變量
ST測(cè)試的實(shí)質(zhì)是垦江,使用AscendCL接口加載單算子模型文件并執(zhí)行,所以生成并編譯ST測(cè)試用例前需要配置AscendCL應(yīng)用編譯所需的環(huán)境變量搅方,如下所示:
export?DDK_PATH=/usr/local/Ascend/ascend-toolkit/latest
export?NPU_HOST_LIB=/usr/local/Ascend/ascend-toolkit/latest/runtime/lib64/stub
3比吭、使用msopst工具,生成并執(zhí)行ST測(cè)試用例
cd /usr/local/Ascend/ascend-toolkit/latest/python/site-packages/bin/
./msopst run -i $HOME/cann_op_contrib/community/tests/add_tik2/st/add_tik2.json -soc Ascend910A -out $HOME/out
執(zhí)行結(jié)果: