【2023 · CANN訓(xùn)練營(yíng)第一季】——Ascend C算子開發(fā)入門——第三次課
前言:昇騰AI處理器的算子開發(fā)增加了一種新的方式,稱之為TIK2,正式名稱是Ascend C算子開發(fā)。不同于采用Python的DSL和TIK方式,Ascend C算子使用C/C++作為前端語(yǔ)言的算子開發(fā)工具,通過(guò)四層接口抽象、并行編程范式、孿生調(diào)試等技術(shù),極大提高了算子的開發(fā)效率,助力AI開發(fā)者低成本完成算子開發(fā)和模型調(diào)優(yōu)部署。為了幫助開發(fā)者快速掌握這一新的技術(shù),2023 CANN訓(xùn)練營(yíng)第一季同步開設(shè)了相關(guān)課程,總共有三節(jié)課。
????????第三節(jié)課的主要內(nèi)容,是掌握端到端的Ascend C算子開發(fā)流程。掌握Ascend C矢量算子動(dòng)態(tài)shape輸入的實(shí)現(xiàn);掌握cpu模式下的算子調(diào)試技術(shù);掌握UT和ST的測(cè)試編碼方法;了解NPU模式下性能采集與分析。
課程地址:CANN訓(xùn)練營(yíng)2023年第一季_TIK2算子開發(fā)入門
https://www.hiascend.com/zh/developer/courses/detail/1627494761683783682
課程視頻:發(fā)布在B站“昇騰Ascend”:
第1次課:【2023? CANN訓(xùn)練營(yíng)第一季】-TIKC++算子開發(fā)入門(上)
https://www.bilibili.com/video/BV1ha4y1V7vK
第2次課:【2023? CANN訓(xùn)練營(yíng)第一季】-TIKC++算子開發(fā)入門(中)
https://www.bilibili.com/video/BV1Pa4y157RG/
第3次課:【2023? CANN訓(xùn)練營(yíng)第一季】-TIKC++算子開發(fā)入門(下)
https://www.bilibili.com/video/BV1yM411g7nw
技術(shù)文檔:“文檔首頁(yè)>CANN社區(qū)版>6.3.RC2.alpha001>算子開發(fā)>TIK C++算子開發(fā)>TIK C++簡(jiǎn)介”https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/63RC2alpha001/operatordevelopment/tik2opdevg/atlastik2_10_0001.html
????????本次課的內(nèi)容要點(diǎn)如下:

一、動(dòng)態(tài)shape算子——將第二次課固定shape的add算子改造成動(dòng)態(tài)shape的add算子。
一)概念? ? ????
????????動(dòng)態(tài)shape和固定shape是一對(duì)概念。固定shape是指,在編譯時(shí)指定shape大小,運(yùn)行時(shí)不需要指定shape大小。在開發(fā)固定shape算子過(guò)程中,一個(gè)算子源代碼可以支持多個(gè)固定shape,但需要在編譯時(shí)明確了shape的實(shí)際值。而動(dòng)態(tài)shape則是在編譯時(shí)不指定shape大小,在運(yùn)行時(shí)傳入實(shí)際的shape大小,算子編譯后的二進(jìn)制文件支持任意shape,或者是一個(gè)或多個(gè)shape范圍。

二)將固定shape算子改成動(dòng)態(tài)shape
????????課程的第二次課,講述是采用固定shape的加法示例,本次課講述,如何將固定shape改為動(dòng)態(tài)shape的算子。也就是,將控制形狀的BLOCK DIM,TOTAL LENGTH,TILE NUM這些變量做成tiling結(jié)構(gòu)體,作為參數(shù)傳給核函數(shù)。如下圖所示:

三)動(dòng)態(tài)shape算子的tiling結(jié)構(gòu)體
1、主要操作流程

2、tiling結(jié)構(gòu)體中的信息

3、動(dòng)態(tài)shape算子的tiling解析函數(shù)


?
4、固定與動(dòng)態(tài)shape對(duì)比——核函數(shù)

5、固定與動(dòng)態(tài)shape對(duì)比——kernelAdd類
????????主要差別有兩點(diǎn),如下圖所示:

6、固定與動(dòng)態(tài)shape對(duì)比——Init()函數(shù)

7、固定與動(dòng)態(tài)shape對(duì)比——真值生成腳本

8、固定與動(dòng)態(tài)shape對(duì)比——main.cpp
????????差異在于動(dòng)態(tài)shape,需要根據(jù)輸入的tiling計(jì)算出實(shí)際的數(shù)據(jù)大小。

? ?????????綜上,固定shape和動(dòng)態(tài)shape代碼文件的差別如下:

四)運(yùn)行結(jié)果

二、功能調(diào)試
cpu模式下的算子功能調(diào)試。TIK C++提供孿生調(diào)試方法,即在cpu側(cè)創(chuàng)建一個(gè)npu的模型并模擬它的計(jì)算行為,用來(lái)進(jìn)行業(yè)務(wù)功能調(diào)試。以此進(jìn)行業(yè)務(wù)功能的調(diào)試。相同的算子代碼可以在CPU莫斯下進(jìn)行精度調(diào)試,然后無(wú)縫切換到NPU模式下運(yùn)行,主要有兩種方法:
1、使用GDB進(jìn)行調(diào)試

2、使用printf后者std::cout
????????在CPU代碼側(cè)直接插入c/C++的打印命令,如printf、std:.cout,但注意NPU模式下不支持打印語(yǔ)句,所以需要添加內(nèi)置宏__CCE KT TEST__ 予以區(qū)分。
三、測(cè)試驗(yàn)證
單元測(cè)試和集成測(cè)試
一)環(huán)境安裝
????????需要安裝CANN開發(fā)環(huán)境和算子開發(fā)包。以root用戶為例,默認(rèn)安裝路徑:
toolkit:/usr/local/Ascend/ascend-toolkit/latest;
算子開發(fā)包:/usr/local/Ascend/ascend-toolkit/latest/opensdk

二)UT測(cè)試
????????UT的本質(zhì)是使用內(nèi)核調(diào)用符測(cè)試CPU模式下的TIK C++算子用例。
????????UT測(cè)試的步驟:

????????為Ascend C自定義算子添加UT測(cè)試步驟:

三)ST測(cè)試
????????ST的本質(zhì)是創(chuàng)建ACL應(yīng)用程序測(cè)試NPU模式下的TIK C++算子用例,將開發(fā)好的算子,編譯好后,打包成自定義算子包,部署到系統(tǒng)中。

為TIK C++自定義算子添加ST測(cè)試步驟:

一)op_host/add_tik2_tiling.h

二)?op_host/add_tik2.cpp
????????host側(cè)算子實(shí)現(xiàn)開發(fā),包括算子原型注冊(cè)、Shape推導(dǎo)等函數(shù)實(shí)現(xiàn)與注冊(cè)、Tiling實(shí)現(xiàn)與注冊(cè)和信息庫(kù)配置.
1、算子原型注冊(cè)
????????算子原型描述了算子的輸入輸出,屬性等信息,算子原型注冊(cè)用于將算子注冊(cè)到算子原型庫(kù)中。

2、Shape推導(dǎo)等函數(shù)實(shí)現(xiàn)與注冊(cè)
????????根據(jù)算子的輸入張量描述、算子邏輯及算子屬性,推理出算子的輸出張量描述,包括張量的Shape,數(shù)據(jù)類型及數(shù)據(jù)排布格式等信息。這樣算子構(gòu)圖準(zhǔn)備階段就可以為所有的張量靜態(tài)分配內(nèi)存,避免動(dòng)態(tài)內(nèi)存分配帶來(lái)的開銷。

3、Tiling實(shí)現(xiàn)與注冊(cè)
????????計(jì)算數(shù)據(jù)切分過(guò)程相關(guān)的參數(shù),比如每次計(jì)算的數(shù)據(jù)量大小。

4、信息庫(kù)配置(根據(jù)運(yùn)行平臺(tái)進(jìn)行配置)
????????算子開發(fā)者需要通過(guò)配置算子信息庫(kù)文件,將算子在異騰A處理器上相關(guān)實(shí)現(xiàn)信息注冊(cè)到算子信息庫(kù)中。

三)run_case.sh與test_add_tik2_data.py

四)生成測(cè)試用例與報(bào)告st report.json

四、性能采集——msprof
????????當(dāng)使用內(nèi)核調(diào)用符時(shí),會(huì)生成相應(yīng)的二進(jìn)制可執(zhí)行文件,可以使用性能采集工具運(yùn)行NPU模式下生成的可執(zhí)行文件從而采集Ascend C算子在昇騰平臺(tái)上執(zhí)行的性能數(shù)據(jù)。
