前言:昇腾AI处理器的算子开发增加了一种新的方式,称之为TIK2,正式名称是Ascend C算子开发。不同于采用Python的DSL和TIK方式,Ascend C使用C/C++作为前端语言的算子开发工具,通过四层接口抽象、并行编程范式、孪生调试等技术,极大提高了算子的开发效率,助力AI开发者低成本完成算子开发和模型调优部署。为了帮助开发者快速掌握这一新的技术,2023 CANN训练营第一季同步开设了相关课程,总共有三节课。
第三节课的主要内容,是掌握端到端的Ascend C算子开发流程。掌握Ascend C矢量算子动态shape输入的实现;掌握cpu模式下的算子调试技术;掌握UT和ST的测试编码方法;了解NPU模式下性能采集与分析。
课程地址:CANN训练营2023年第一季_TIK2算子开发入门
https://www.hiascend.com/zh/developer/courses/detail/1627494761683783682
课程视频:发布在B站“昇腾Ascend”:
第1次课:【2023 CANN训练营第一季】-TIKC++算子开发入门(上)
【2023 · CANN训练营第一季】- TIK C++算子开发入门(上)_哔哩哔哩_bilibili
第2次课:【2023 CANN训练营第一季】-TIKC++算子开发入门(中)
【2023 · CANN训练营第一季】- TIK C++算子开发入门(中)_哔哩哔哩_bilibili
第3次课:【2023 CANN训练营第一季】-TIKC++算子开发入门(下)
【2023 · CANN训练营第一季】- 新算子开发入门(下)_哔哩哔哩_bilibili
技术文档:“文档首页>CANN社区版>6.3.RC2.alpha001>算子开发>TIK C++算子开发>TIK C++简介”https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/63RC2alpha001/operatordevelopment/tik2opdevg/atlastik2_10_0001.html
本次课的内容要点如下:
一、动态shape算子——将第二次课固定shape的add算子改造成动态shape的add算子。
一)概念
动态shape和固定shape是一对概念。固定shape是指,在编译时指定shape大小,运行时不需要指定shape大小。在开发固定shape算子过程中,一个算子源代码可以支持多个固定shape,但需要在编译时明确了shape的实际值。而动态shape则是在编译时不指定shape大小,在运行时传入实际的shape大小,算子编译后的二进制文件支持任意shape,或者是一个或多个shape范围。
二)将固定shape算子改成动态shape
课程的第二次课,讲述是采用固定shape的加法示例,本次课讲述,如何将固定shape改为动态shape的算子。也就是,将控制形状的BLOCK DIM,TOTAL LENGTH,TILE NUM这些变量做成tiling结构体,作为参数传给核函数。如下图所示:
三)动态shape算子的tiling结构体
1、主要操作流程
2、tiling结构体中的信息
3、动态shape算子的tiling解析函数
4、固定与动态shape对比——核函数
5、固定与动态shape对比——kernelAdd类
主要差别有两点,如下图所示:
6、固定与动态shape对比——Init()函数
7、固定与动态shape对比——真值生成脚本
8、固定与动态shape对比——main.cpp
差异在于动态shape,需要根据输入的tiling计算出实际的数据大小。
综上,固定shape和动态shape代码文件的差别如下:
四)运行结果
二、功能调试
cpu模式下的算子功能调试。TIK C++提供孪生调试方法,即在cpu侧创建一个npu的模型并模拟它的计算行为,用来进行业务功能调试。以此进行业务功能的调试。相同的算子代码可以在CPU莫斯下进行精度调试,然后无缝切换到NPU模式下运行,主要有两种方法:
1、使用GDB进行调试
2、使用printf后者std::cout
在CPU代码侧直接插入c/C++的打印命令,如printf、std:.cout,但注意NPU模式下不支持打印语句,所以需要添加内置宏__CCE KT TEST__ 予以区分。
三、测试验证
单元测试和集成测试
一)环境安装
需要安装CANN开发环境和算子开发包。以root用户为例,默认安装路径:
toolkit:/usr/local/Ascend/ascend-toolkit/latest;
算子开发包:/usr/local/Ascend/ascend-toolkit/latest/opensdk
二)UT测试
UT的本质是使用内核调用符测试CPU模式下的TIK C++算子用例。
UT测试的步骤:
为Ascend C自定义算子添加UT测试步骤:
三)ST测试
ST的本质是创建ACL应用程序测试NPU模式下的TIK C++算子用例,将开发好的算子,编译好后,打包成自定义算子包,部署到系统中。
为TIK C++自定义算子添加ST测试步骤:
一)op_host/add_tik2_tiling.h
二) op_host/add_tik2.cpp
host侧算子实现开发,包括算子原型注册、Shape推导等函数实现与注册、Tiling实现与注册和信息库配置.
1、算子原型注册
算子原型描述了算子的输入输出,属性等信息,算子原型注册用于将算子注册到算子原型库中。
2、Shape推导等函数实现与注册
根据算子的输入张量描述、算子逻辑及算子属性,推理出算子的输出张量描述,包括张量的Shape,数据类型及数据排布格式等信息。这样算子构图准备阶段就可以为所有的张量静态分配内存,避免动态内存分配带来的开销。
3、Tiling实现与注册
计算数据切分过程相关的参数,比如每次计算的数据量大小。
4、信息库配置(根据运行平台进行配置)
算子开发者需要通过配置算子信息库文件,将算子在异腾A处理器上相关实现信息注册到算子信息库中。
三)run_case.sh与test_add_tik2_data.py
四)生成测试用例与报告st report.json
四、性能采集——msprof
当使用内核调用符时,会生成相应的二进制可执行文件,可以使用性能采集工具运行NPU模式下生成的可执行文件从而采集Ascend C算子在昇腾平台上执行的性能数据。