【2023 · CANN训练营第一季】——Ascend C算子开发入门——第三次课(动态shape的实现、UT、算子部署及ST)

举报
dayao 发表于 2023/05/31 13:53:26 2023/05/31
【摘要】 这是2023年第1期CANN训练营,Ascend C算子课的第三次课。主要内容是掌握端到端的Ascend C算子开发流程。掌握Ascend C矢量算子动态shape输入的实现;掌握cpu模式下的算子调试技术;掌握UT和ST的测试编码方法;了解NPU模式下性能采集与分析。

前言:昇腾AI处理器的算子开发增加了一种新的方式,正式名称是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站“昇腾AI开发者”:

第1次课:【2023  CANN训练营第一季】-TIKC++算子开发入门(上)

https://www.bilibili.com/video/BV1ha4y1V7vK

第2次课:【2023  CANN训练营第一季】-TIKC++算子开发入门(中)

https://www.bilibili.com/video/BV1Pa4y157RG/

第3次课:【2023  CANN训练营第一季】-TIKC++算子开发入门(下)

https://www.bilibili.com/video/BV1yM411g7nw

技术文档:文档首页>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算子在昇腾平台上执行的性能数据。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。