【2023 · CANN训练营第一季】——Ascend C算子开发入门——第三次课

前言:昇腾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结构体中的信息

【2023 · CANN训练营第一季】——Ascend C算子开发入门——第三次课_第1张图片

 

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

【2023 · CANN训练营第一季】——Ascend C算子开发入门——第三次课_第2张图片

 

二)UT测试

        UT的本质是使用内核调用符测试CPU模式下的TIK C++算子用例。

        UT测试的步骤:

【2023 · CANN训练营第一季】——Ascend C算子开发入门——第三次课_第3张图片

 

        为Ascend C自定义算子添加UT测试步骤:

【2023 · CANN训练营第一季】——Ascend C算子开发入门——第三次课_第4张图片

 

三)ST测试

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

 

为TIK C++自定义算子添加ST测试步骤:

 

一)op_host/add_tik2_tiling.h

 

二) op_host/add_tik2.cpp

    ​    ​host侧算子实现开发,包括算子原型注册、Shape推导等函数实现与注册、Tiling实现与注册和信息库配置.

1、算子原型注册

    ​    ​算子原型描述了算子的输入输出,属性等信息,算子原型注册用于将算子注册到算子原型库中。

【2023 · CANN训练营第一季】——Ascend C算子开发入门——第三次课_第5张图片

 

2、Shape推导等函数实现与注册

    ​    ​根据算子的输入张量描述、算子逻辑及算子属性,推理出算子的输出张量描述,包括张量的Shape,数据类型及数据排布格式等信息。这样算子构图准备阶段就可以为所有的张量静态分配内存,避免动态内存分配带来的开销。

 

3、Tiling实现与注册

    ​    ​计算数据切分过程相关的参数,比如每次计算的数据量大小。

 

4、信息库配置(根据运行平台进行配置)

    ​    ​算子开发者需要通过配置算子信息库文件,将算子在异腾A处理器上相关实现信息注册到算子信息库中。

【2023 · CANN训练营第一季】——Ascend C算子开发入门——第三次课_第6张图片

 

三)run_case.sh与test_add_tik2_data.py

 

​四)生成测试用例与报告st report.json

 

四、性能采集——msprof

        当使用内核调用符时,会生成相应的二进制可执行文件,可以使用性能采集工具运行NPU模式下生成的可执行文件从而采集Ascend C算子在昇腾平台上执行的性能数据。

 

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