【2023 · CANN訓(xùn)練營(yíng)第一季】課堂筆記3-算子的開(kāi)發(fā)及驗(yàn)證
【2023 · CANN訓(xùn)練營(yíng)第一季】課堂筆記3-算子的開(kāi)發(fā)及驗(yàn)證
一、動(dòng)態(tài)shape算子與固定shape算子
引入動(dòng)態(tài)shape算子的背景條件:
當(dāng)算子shape固定時(shí),開(kāi)發(fā)者使用不同shape時(shí)需要重新對(duì)算子進(jìn)行編譯,帶來(lái)大量的算子二進(jìn)制文件。
動(dòng)態(tài)shape的算子可以將形狀通過(guò)核函數(shù)的入?yún)魅牒撕瘮?shù)內(nèi),參與內(nèi)部邏輯計(jì)算,從而符合不同shape下的使用場(chǎng)景。
二者對(duì)比:

對(duì)固定算子的修改:
之前的固定算子,按照上節(jié)課的例子,是把數(shù)據(jù)分別分給8個(gè)核進(jìn)行計(jì)算

而轉(zhuǎn)換為動(dòng)態(tài)算子,就需要將這些全局變量,都通過(guò)動(dòng)態(tài)的形式作為可變的變量,這就代表著我們需要將這些全局變量作為入?yún)⑦M(jìn)行輸入進(jìn)來(lái)。

基于現(xiàn)有的固定shape算子,將其改裝為動(dòng)態(tài)shape的算子。將控制形狀的BLOCK DIM,TOTAL_LENGTH,TILE NUM這些變量依靠外界輸入得到,在核
函數(shù)中額外傳入一個(gè)tiling,它將指向控制核函數(shù)邏輯處理的至關(guān)重要的這幾個(gè)變量
1.tiling結(jié)構(gòu)體
根據(jù)上面的信息,我們可以分析得到結(jié)構(gòu)體需要如下的內(nèi)容
BLOCK DIM: 并行計(jì)算使用的核數(shù)
TOTAL LENGTH: 總共需要計(jì)算的數(shù)據(jù)個(gè)數(shù)
TILE NUM:每個(gè)核上計(jì)算數(shù)據(jù)分塊的個(gè)數(shù)

但是前面文章內(nèi)容中我們可以看出,入?yún)⑿枰y(tǒng)一為_(kāi)_gm__ uinit8_t*的形式,于是我們將結(jié)構(gòu)體按照這種指針進(jìn)行傳入后,需要對(duì)該結(jié)構(gòu)體進(jìn)行解析,并
且還要區(qū)分是CPU側(cè)和NPU側(cè)的代碼不同的執(zhí)行

2.核函數(shù)對(duì)比
固定shape算子的核函數(shù)實(shí)現(xiàn):?

動(dòng)態(tài)shape算子的核函數(shù)實(shí)現(xiàn):

如上一小點(diǎn)所說(shuō),實(shí)際函數(shù)設(shè)計(jì)時(shí),我們也需要的是將一些參數(shù)進(jìn)行傳入,并且進(jìn)行解析,這樣可以使我們隨時(shí)改動(dòng)傳入的參數(shù)值
3.Init函數(shù)對(duì)比
在固定算子中,我們做邏輯地址區(qū)別時(shí)的參數(shù)也是由全局變量去決定的

在動(dòng)態(tài)算子中,我們可以在相應(yīng)的類(lèi)中添加一些private的變量,以便可以從類(lèi)中的函數(shù)直接調(diào)用其值

4.不同功能代碼文件的區(qū)別

二、功能調(diào)試方法
TKC++提供孿生調(diào)試技術(shù)即在CPU模式下進(jìn)行運(yùn)實(shí)際上會(huì)創(chuàng)建個(gè)NPU的模型并模擬它的計(jì)算行為以此進(jìn)行業(yè)務(wù)功能的調(diào)試。
相同的算子代碼可以在CPU模式下進(jìn)行精度調(diào)試,并無(wú)縫切換到NPU模式下運(yùn)行
1.使用GDB調(diào)試

相關(guān)命令如下:

2.打印調(diào)試
在CPU代碼側(cè)直接插入C/C++的打印命令,如printf、std::cout,
PS:NPU模式下不支持打印語(yǔ)句,所以需要添加內(nèi)置宏 CCE_KT_TEST 予以區(qū)分
三、測(cè)試驗(yàn)證
1.UT測(cè)試
按照一、4.點(diǎn)的不同功能代碼的功能內(nèi)容,我們可以做按照如下步驟
添加UT測(cè)試步驟:
1.cann_op_contrib/community/ops中新建用例目錄并添加代碼實(shí)現(xiàn)文件

2.cann_op_contrib/community/tests中新建用例目錄并添加代碼測(cè)試文件

3.在cann_op_contrib目錄下執(zhí)行./build.sh -u tik2
2.ST測(cè)試
1.cann_op_contrib/community/ops中新建用例目錄并添加代碼實(shí)現(xiàn)文件

2.cann_op_contrib/community/tests中新建用例目錄并添加代碼測(cè)試文件

3.在cann_op_contrib目錄下執(zhí)行后續(xù)打包算子,安裝部署算子包和編譯并執(zhí)行測(cè)試用例的操作
3.對(duì)部分文件實(shí)現(xiàn)的簡(jiǎn)單講解
(1)op_host/add_tik2_tiling.h

UT測(cè)試代碼的tiling定義:?
改寫(xiě)自動(dòng)態(tài)shape的tiling解析函數(shù):
只保留CPU模式下的處理邏輯,即將傳入的tiling指針轉(zhuǎn)化為tiling的結(jié)構(gòu)體指針
ST測(cè)試代碼的tiling定義:?
提供了基于宏的封裝模式: BEGIN_TILING_DATA_DEF定義了tiling結(jié)構(gòu)體名稱(chēng)
TILING_DATA_FIELD_DEF定義了tiling中的成員變量
END_TILING_DATA DEF是結(jié)束定義的標(biāo)志
REGISTER_TILING_DATA_CLASS完成注冊(cè),將算子類(lèi)型與定義的tiling結(jié)構(gòu)體綁定算子類(lèi)型一般都是核函數(shù)名的大駝峰形式(核函數(shù)名一般為內(nèi)核形式)
(2)op_host/add_tik2.cpp
host側(cè)算子實(shí)現(xiàn)開(kāi)發(fā),包括算子原型注冊(cè)、Shape推導(dǎo)等函數(shù)實(shí)現(xiàn)與注冊(cè)、Tiling實(shí)現(xiàn)與注冊(cè)和信息庫(kù)配置
算子原型注冊(cè)
算子原型描述了算子的輸入輸出,屬性等信息,算子原型注冊(cè)用于將算子注冊(cè)到算子原型庫(kù)中

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

推導(dǎo)函數(shù)的注冊(cè):
Infershape:推理形狀的函數(shù)
InfershapeRange: 推理形狀中每個(gè)維度的范圍的函數(shù)
InferDataType: 推理數(shù)據(jù)類(lèi)型的函數(shù)

Tiling實(shí)現(xiàn)與注冊(cè)
計(jì)算數(shù)據(jù)切分過(guò)程相關(guān)的參數(shù),比如每次計(jì)算的數(shù)據(jù)量大小
TilingFunc: Tiling定義函數(shù)
TilingPrepare: Tiling解析函數(shù)
CheckOpsupport: 算子參數(shù)校驗(yàn)函數(shù)
OP_ADD:注冊(cè)算子的原型定義
Tiling實(shí)現(xiàn):

Tiling注冊(cè):

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

(3)run_case.sh與test_add_tik2_data.py
CANN開(kāi)發(fā)套件包中提供了ST測(cè)試工具: msopst,支持生成算子的ST測(cè)試用例并在硬件環(huán)境中執(zhí)行
根據(jù)算子信息庫(kù)定義文件(.ini)生成算子測(cè)試用例定義文件 (.json),作為算子ST測(cè)試用例的輸入
根據(jù)算子測(cè)試用例定義文件生成ST測(cè)試數(shù)據(jù)及測(cè)試用例執(zhí)行代碼,在硬件環(huán)境上執(zhí)行算子測(cè)試用例
自動(dòng)生成運(yùn)行報(bào)表 (st_report.son)功能,報(bào)表記錄了測(cè)試用例信息及各階段運(yùn)行情況
根據(jù)用戶(hù)定義并配置的算子期望數(shù)據(jù)生成函數(shù),回顯期望算子輸出和實(shí)際算子輸出的對(duì)比測(cè)試結(jié)果


(4)add_tik2.json

(5)生成測(cè)試用例與報(bào)告st_report.json

四、性能采集工具-msprof
性能采集步驟:?1.設(shè)置環(huán)境變量(異騰實(shí)際安裝的位置): source /usr/local/Ascend/ascend-toolkit/../set_env.sh
2.測(cè)試NPU模式下的TIK C++算子,保證其精度正確,生成對(duì)應(yīng)的二進(jìn)制可執(zhí)行文件: bash runsh add_tik2 ascend910 Aicore npu
3.使用msprof工具采集性能
4.使用命令(用戶(hù)可以根據(jù)自身的需要靈活組合性能分析指令)
eg:
5.在當(dāng)前目錄會(huì)生成out文件夾,在device_0/summary/op_summary_0_1.csv能夠看到一些具體的數(shù)據(jù)
ps:該文僅是為了記錄CANN訓(xùn)練營(yíng)的學(xué)習(xí)過(guò)程所用,不參與任何商業(yè)用途