【2023 · CANN训练营第一季】——Ascend C算子沙箱实验

前言:CANN 训练营的Ascend C算子课程,以在线课程的方式提供了一个沙箱实验环境。这将有助于帮助开发者了解Ascend C算子开发的软、硬件环境;熟悉自定义Ascend C算子的开发流程和关键代码;同时也可以了解到自定义算子包的部署路径及部署后的各类文件。

在线试验地址:在线实验>基于昇腾CANN的Ascend C算子开发

https://www.hiascend.com/zh/edu/experiment/operation/Tik_xl

配套课程地址:CANN训练营2023年第一季_TIK C++算子开发入门

https://www.hiascend.com/zh/developer/courses/detail/1627494761683783682

一、系统环境

1、硬件芯片:昇腾910A

【2023 · CANN训练营第一季】——Ascend C算子沙箱实验_第1张图片

 

2、CANN版本

 

3、算子开发包

 

二、算子实现分析

    ​    ​沙箱实验,实现的是动态shape的add的Ascend C算子。

【2023 · CANN训练营第一季】——Ascend C算子沙箱实验_第2张图片

 

一)配置环境

 

二)下载代码包

【2023 · CANN训练营第一季】——Ascend C算子沙箱实验_第3张图片

 

样例工程关键目录和文件的用途如下所示:

【2023 · CANN训练营第一季】——Ascend C算子沙箱实验_第4张图片

 

三)代码分析及补全

1、kernel侧代码

    ​    ​实现代码在算子工程的/ai_core/op_kernel/add_tik2.cpp中。

    ​    ​1)算子类——init()

【2023 · CANN训练营第一季】——Ascend C算子沙箱实验_第5张图片

 

    ​    ​2)算子类——process()及3个基本任务CopyIn,Compute,CopyOut

    ​    ​基于矢量编程范式,将核函数的实现分为3个基本任务:CopyIn,Compute,CopyOut。Process函数中通过如下方式调用这三个函数。

【2023 · CANN训练营第一季】——Ascend C算子沙箱实验_第6张图片

 

    ​    ​CopyIn:使用DataCopy接口将GlobalTensor数据拷贝到LocalTensor;使用EnQue将LocalTensor放入VecIn的Queue中。

【2023 · CANN训练营第一季】——Ascend C算子沙箱实验_第7张图片

 

    ​    ​Compute:使用DeQue从VecIn中取出LocalTensor;使用Ascend C算子接口Add(2级接口)完成矢量计算;使用EnQue将计算结果LocalTensor放入到VecOut的Queue中。

【2023 · CANN训练营第一季】——Ascend C算子沙箱实验_第8张图片

 

    ​    ​CopyOut:使用DeQue接口从VecOut的Queue中取出LocalTensor;使用DataCopy接口将LocalTensor拷贝到GlobalTensor上。

【2023 · CANN训练营第一季】——Ascend C算子沙箱实验_第9张图片

 

2、host侧代码

    ​    host侧算子实现开发,包括算子原型注册、Shape推导等函数实现与注册、Tiling实现与注册和信息库配置。实现代码在算子工程的/ai_core/op_host/add_tik2.cpp中。

    ​    ​1)算子原型注册:

【2023 · CANN训练营第一季】——Ascend C算子沙箱实验_第10张图片

 

    ​    ​​2)Shape推导等函数实现与注册:

【2023 · CANN训练营第一季】——Ascend C算子沙箱实验_第11张图片

 

    ​    ​3)Tiling实现与注册:

【2023 · CANN训练营第一季】——Ascend C算子沙箱实验_第12张图片

 

    ​    ​4)信息库配置及算子注册:

【2023 · CANN训练营第一季】——Ascend C算子沙箱实验_第13张图片

 

 

四)UT测试

    ​    ​UT的本质是使用内核调用符测试CPU模式下的Ascend C算子的用例,在算子工程UT测试目录下的add_tik2_ut.cc文件,增加CPU侧算子调用代码如下:

 

    ​    ​运行指令:

    ​    ​    ​cd $HOME/cann_op_contrib/ ./build.sh -u tikcpp

    ​    ​运行结果:

【2023 · CANN训练营第一季】——Ascend C算子沙箱实验_第14张图片

 

五)编译部署

1、算子包打包

    ​    ​进入cann_op_contrib算子工程目录,执行算子包打包脚本,命令如下:

    ​    ​cd $HOME/cann_op_contrib/

    ​    ​./pack.sh

    ​    ​打包成功后,会在当前目录下创建output目录,并在output目录下生成自定义算子安装包CANN_OP_CONTRIB_linux-aarch64.run。

 

2. 自定义算子安装包部署

    ​    ​以运行用户执行如下命令,安装自定义算子包。

    ​    ​cd $HOME/cann_op_contrib/output

    ​    ​./CANN_OP_CONTRIB_linux-aarch64.run --install

    ​    ​命令执行成功后,自定义算子包中的相关文件会部署当前环境中。默认安装路径是tool-kit的“opp/vendors/”目录下,沙箱中的路径为:

/usr/local/Ascend/ascend-toolkit/latest/opp/vendors

【2023 · CANN训练营第一季】——Ascend C算子沙箱实验_第15张图片

 

        目录结构与自定义TBE算子基本一致,在算子实现代码部分,多了cpp格式的实现代码。

六)ST测试

    ​    ​ST的本质是创建ACL应用程序测试NPU模式下的Ascend C算子用例,将开发好的算子,编译好后,打包成自定义算子包,部署到系统中。

    ​    ​通过msopst工具,将用户定义的ST测试配置的*.json生成单算子的om文件,使用AscendCL接口加载单算子模型文件并执行单算子om文件,验证算子执行结果的正确性。

1、在算子工程ST测试目录下的add_tik2.json增加测试用例

【2023 · CANN训练营第一季】——Ascend C算子沙箱实验_第16张图片

 

2、配置ST测试用例编译所需环境变量

    ST测试的实质是,使用AscendCL接口加载单算子模型文件并执行,所以生成并编译ST测试用例前需要配置AscendCL应用编译所需的环境变量,如下所示:

export DDK_PATH=/usr/local/Ascend/ascend-toolkit/latest

export NPU_HOST_LIB=/usr/local/Ascend/ascend-toolkit/latest/runtime/lib64/stub

3、使用msopst工具,生成并执行ST测试用例

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

执行结果:

【2023 · CANN训练营第一季】——Ascend C算子沙箱实验_第17张图片

 

你可能感兴趣的:(人工智能)