首页 > 其他分享 >【2023CANN训练营第二季】——Ascend C算子开发(进阶)微认证

【2023CANN训练营第二季】——Ascend C算子开发(进阶)微认证

时间:2023-12-21 23:32:10浏览次数:35  
标签:进阶 算子 Ascend 2023CANN 修改 sinh xLocal custom 函数

1.微认证题目:

参考tensorflow的Sinh算子,实现Ascend C算子Sinh,算子命名为SinhCustom,并完成aclnn算子调用相关算法: sinh(x) = (exp(x) - exp(-x)) / 2.0 要求: 1、完成host侧和kernel侧代码实现。 2、实现sinh功能,支持float16类型输入,使用内核调试符方式调用算子测试通过。 3、使用单算子API调用方式调用SinhCustom算子测试通过 提交要求: 完成编程后,将上述实现的工程代码打包在rar包内提交,如SinhCustom.rar.

2.环境准备

我是在华为云ModelArts西南贵阳一创建的Notebook,镜像为:

mindspore_2.2.0-cann_7.0.1-py_3.9-euler_2.10.7-aarch64-snt9b

【2023CANN训练营第二季】——Ascend C算子开发(进阶)微认证_json

3.算子分析

算子分析的流程图如下:

【2023CANN训练营第二季】——Ascend C算子开发(进阶)微认证_核函数_02

对应题目,本题主要解决的是核函数代码,Kernel侧代码、Host侧代码,单算子调用时的代码。 Sinh算子的数学表达式为:sinh(x) = (exp(x) - exp(-x)) / 2.0

算子分析表格为:

【2023CANN训练营第二季】——Ascend C算子开发(进阶)微认证_核函数_03

整个算子分析计算过程分为三个阶段:CopyIn,Compute,CopyOut CopyIn:搬入x到Local内存 Compute:使用Local内存进行计算 CopyOut:搬运Local计算结果到z

4.算子开发

可以参考samples仓库的Add算子,把Add算子的内核调用代码复制一份到SinhCustom

cp -r samples/operator/AddCustomSample/KernelLaunch/AddKernelInvocation/* samples/SinhCustomSample/KernelLaunch/SinhKernelInvocation

4.1核函数开发

首先修改最重要的sinh_custom.cpp

进行核函数的定义,并在核函数中调用算子类的Init和Process函数。

【2023CANN训练营第二季】——Ascend C算子开发(进阶)微认证_json_04

使用__global__函数类型限定符来标识它是一个核函数,可以被<<<...>>>调用;使用__aicore__函数类型限定符来标识该核函数在设备端AI Core上执行。 根据矢量编程范式实现算子类

【2023CANN训练营第二季】——Ascend C算子开发(进阶)微认证_函数实现_05

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

CopyIn函数实现

【2023CANN训练营第二季】——Ascend C算子开发(进阶)微认证_函数实现_06

Compute函数实现

【2023CANN训练营第二季】——Ascend C算子开发(进阶)微认证_核函数_07

Exp(xLocal, xLocal, TILE_LENGTH);:对从输入队列取出的本地张量 xLocal 进行指数运算(Exponential)。这用于计算 e^x,其中 x 是 xLocal 中的元素。TILE_LENGTH 是可能是一个常量,表示操作的长度。 Reciprocal(zLocal, xLocal, TILE_LENGTH);:计算 1/xLocal 的倒数,并将结果存储在 zLocal 中。 Muls(zLocal, zLocal, scalar, TILE_LENGTH);:将 zLocal 中的每个元素乘以标量 scalar,并将结果存储回 zLocal。

CopyOut函数实现

【2023CANN训练营第二季】——Ascend C算子开发(进阶)微认证_核函数_08

4.2核函数运行验证

CPU模式下执行如下命令

bash run.sh ascend910 cpu

运行结果如下:

【2023CANN训练营第二季】——Ascend C算子开发(进阶)微认证_json_09

【2023CANN训练营第二季】——Ascend C算子开发(进阶)微认证_json_10

可以看到真实值和期望值相差很小,基本没有误差。 NPU模式下执行如下命令:

bash run.sh ascend910 npu_onboard

【2023CANN训练营第二季】——Ascend C算子开发(进阶)微认证_核函数_11

这里报了一个aclError,不知道是不是硬件问题。

4.3创建算子工程

CANN软件包中提供了工程创建工具msopgen,我们可以输入算子原型定义文件生成Ascend C算子开发工程。编写Sinh_Custom算子的原型定义json文件,如下:

[
{
    "op": "SinhCustom",
    "language": "cpp",
    "input_desc": [
        {
            "name": "x",
            "param_type": "required",
            "format": [
                "ND"
            ],
            "type": [
                "fp16"
            ]
        }
    ],
    "output_desc": [
        {
            "name": "z",
            "param_type": "required",
            "format": [
                "ND"
            ],
            "type": [
                "fp16"
            ]
        }
    ]
}

然后使用以下命令生成算子文件夹:

/usr/local/Ascend/ascend-toolkit/latest/python/site-packages/bin/msopgen gen -i /home/ma-user/work/samples/sinh_custom.json -c ai_core-Ascend910B2  -lan cpp -out /home/ma-user/work/samples/SinhCustom

生成的SinhCustom算子文件夹如下:

【2023CANN训练营第二季】——Ascend C算子开发(进阶)微认证_函数实现_12

build_out文件夹是后面编译部署生成的,这里我们主要要修改的文件有:CMakePresets.json,op_host目录下的sinh_custom_tiling.h、sinh_custom.cpp、op_kernel目录下的sinh_custom.cpp。下面分别展开:

4.4 op_kernel侧实现

Init()方法实现

可以先把Add_custom算子的kernel侧实现代码复制过来,然后在此基础上进行修改,首先是KernelSinh类的初始化代码,题目有一个输入,一个输出,修改如下:

【2023CANN训练营第二季】——Ascend C算子开发(进阶)微认证_json_13

CopyIn()方法实现

【2023CANN训练营第二季】——Ascend C算子开发(进阶)微认证_核函数_14

Compute()方法实现

Compute()函数是算子开发的核心,根据题目sinh(x) = (exp(x) - exp(-x)) / 2.0Exp(xLocal, xLocal, TILE_LENGTH);:对从输入队列取出的本地张量 xLocal 进行指数运算(Exponential)。这用于计算 e^x,其中 x 是 xLocal 中的元素。TILE_LENGTH 是可能是一个常量,表示操作的长度。Reciprocal(zLocal, xLocal, TILE_LENGTH);:计算 1/xLocal 的倒数,并将结果存储在 zLocal 中。

Compute()函数代码如下:

【2023CANN训练营第二季】——Ascend C算子开发(进阶)微认证_函数实现_15

这里用到了Muls()方法用于矢量中每个元素与标量求积

CopyOut()方法实现

【2023CANN训练营第二季】——Ascend C算子开发(进阶)微认证_核函数_16

4.5 op_host侧实现

sinh_custom_tiling.h文件实现

这个文件要修改的地方是TilingData结构定义头文件的编写

【2023CANN训练营第二季】——Ascend C算子开发(进阶)微认证_函数实现_17

sinh_custom.cpp文件实现

该文件是Tiling函数实现代码,主要修改算子原型注册代码,如下

【2023CANN训练营第二季】——Ascend C算子开发(进阶)微认证_函数实现_18

5.算子工程编译和部署

算子kernel侧和host侧代码实现了之后,需要对算子工程进行编译,生成自定义算子安装包*.run编译之前要修改CMakePresets.json文件下的ASCEND_CANN_PACKAGE_PATH变量,修改成你实际的CANN安装路径,我的修改如下:

【2023CANN训练营第二季】——Ascend C算子开发(进阶)微认证_json_19

修改好之后,切换到SinhCustom目录下,执行以下命令: ./build.sh编译成功截图如下:

【2023CANN训练营第二季】——Ascend C算子开发(进阶)微认证_函数实现_20

此时会生成一个build_out文件夹,里面有一个文件custom_opp_euleros_aarch64.run,使用以下命令部署./custom_opp_euleros_aarch64.run

【2023CANN训练营第二季】——Ascend C算子开发(进阶)微认证_函数实现_21

看到SUCCESS代表算子部署成功

6.使用aclnn方式调用

把AddCustom算子的AclNNInvocation文件夹复制一遍,目录位于samples/operator/AddCustomSample / FrameworkLaunch/AclNNInvocation,目录结构如下:

【2023CANN训练营第二季】——Ascend C算子开发(进阶)微认证_函数实现_22

需要修改的文件有scripts文件下的gen_data.py,src文件下的main.cpp,op_runner.cpp

gen_data.py修改

【2023CANN训练营第二季】——Ascend C算子开发(进阶)微认证_json_23

main.cpp修改

要修改输入输出文件的位置

【2023CANN训练营第二季】——Ascend C算子开发(进阶)微认证_json_24

op_runner.cpp修改

要修改调用的算子名称,以及引入aclnn_sinh_custom.h头文件

【2023CANN训练营第二季】——Ascend C算子开发(进阶)微认证_函数实现_25

修改完上述文件之后,就可以使用ACLNN的方式调用验证算子,进入AclNNInvocation文件夹,运行以下命令 bash run.sh打印如下图,则代表测试通过!

【2023CANN训练营第二季】——Ascend C算子开发(进阶)微认证_核函数_26

可以看到真实结果和预期结果非常接近。误差很小。

标签:进阶,算子,Ascend,2023CANN,修改,sinh,xLocal,custom,函数
From: https://blog.51cto.com/u_16353294/8927296

相关文章

  • 【2023CANN训练营第二季】——Ascend C代码实操分享
    1.实操题目:使用AscendC实现Addcdiv算子参考pytorch的Addcdiv算子,实现AscendC算子Addcdiv,算子命名为AddcdivCustom相关算法:out=x+y/z*value要求:1、完成Kernel侧实现代码和host侧调用算子代码,支持fp16类型输入2、完成AcInn方式调用编写好的算子3、根据提供的测试用例,使用......
  • day24 面向对象进阶
    day24开始2023年12月20日周三12:25:36类的组合:把类对象当做变量值、参数、返回值、容器元素使用,这样可以间接使用类对象的方法classF1:passclassF2:passf1=F1()f2=F2()f1.f2=f2#等号前面的f2是f1属性的名字(key)等号后面的f2是F2类实例化出来的一个对象(value)现将......
  • 12.Capabilities 进阶
    deviceName只是设备的名字,别名随便起不能锁定唯一一个设备uid多设备选择的时候,要指定uid默认读取设备列表的第一个设备设备列表获取adbdevicesnewCommandTimeoutappium程序应等待来自客户端的新命令多长时间超时后==会话删除==默认 60 秒设置为0......
  • pwn知识——ret2text进阶
    stacksmash造成原因当进行栈溢出时,触发了__stack_chk_fail,从而拦截了该栈溢出,使程序崩溃利用原理我们首先了解一下__stack_chk_fail函数的构成发现调用了__fortify_fail函数,那我们再看下这个函数发现有两个参数,一个是msg(信息,也就是前边的"stacksmashingdetected"),另......
  • day23 面向对象进阶
    属性查找顺序:对象本身→类对于类而言,self就是一个普通形参对于对象而言,self就是对象本身 类的继承:减少重复#自己写的时候不推荐使用继承继承多个的时候功能会混乱继承后子类会拿到父类的所有东西classfather():classson(father):继承后的属性查找顺序:对象自己→类→父......
  • 2023强网杯ez_fmt题解及进阶格式化之劫持子函数
    格式化任意内存读写相信已经是老生常谈了,但是随着题目难度加大,格式化题目给我们的难题逐渐变成了覆写什么,改写什么。这题对我是一道很好的例题,其中对栈及函数调用的理解堪称刷新我的认知。exp先放着,想自己调试理解的可以看看。frompwnimport*context(terminal=['tmux','......
  • Redis进阶:Lua初尝试
    Lua是一门脚本语言,可以编写Lua脚本到Redis中执行 【使用Lua脚本的优点】1.减少网络开销。Redis每条命令都需要进行网络传输,特别是命令条数很多的情况。2.原子操作。脚本都会作为一个整体执行,中间不会有其他命令插入。3.复用。会永远存储在Redis中比较类似Sql里面的存储过程......
  • 动态规划进阶
    数位DP常见的模板:询问\(l\simr\)中有多少个满足给定条件的数,\(1\lel\ler\le10^{18}\)。这种问题,数位DP可以做到\(O(\logv)\)级别,其中\(v\)是\(l,r\)的值域。思路直接枚举会枚举大量不可能满足条件的数,可以从数位入手。数位DP的算法流程如下:几个定义:\(len(......
  • 跨平台应用开发进阶(三十五) :Android权限列表permission说明
    一、前言uni-app开发完APP后,上架到应用市场,审核时会对APP内部设置的权限进行核准,并给出相应的理由。如项目中有以下权限设置:"android":{"permissions":["<uses-featureandroid:name=\"android.hardware.camera\"/>","<uses-featurea......
  • 2023ISCTF的fry题解及进阶格式化利用
    这题是一个比较好的进阶格式化利用。就是有点繁琐。先惯例checksec一下心脏骤停hhh。没事先分析一下Main函数int__cdeclmain(intargc,constchar**argv,constchar**envp){init(argc,argv,envp);puts("WelcometoISCTF~~~~~~~~~~~~~~~~");puts("Doyouwantto......