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

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

image.png

3.算子分析

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

image.png

整个算子分析计算过程分为三个阶段: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函数。
image.png
使用__global__函数类型限定符来标识它是一个核函数,可以被<<<…>>>调用;使用__aicore__函数类型限定符来标识该核函数在设备端AI Core上执行。
根据矢量编程范式实现算子类
image.png
基于矢量编程范式,将核函数的实现分为3个基本任务:CopyIn,Compute,CopyOut。Process函数中通过如下方式调用这三个函数。

CopyIn函数实现

image.png

Compute函数实现

image.png
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函数实现

image.png

4.2核函数运行验证

CPU模式下执行如下命令

bash run.sh ascend910 cpu

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

bash run.sh ascend910 npu_onboard

image.png
这里报了一个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算子文件夹如下:
image.png

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类的初始化代码,题目有一个输入,一个输出,修改如下:
image.png

CopyIn()方法实现

image.png

Compute()方法实现

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

Compute()函数代码如下:
image.png

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

CopyOut()方法实现

image.png

4.5 op_host侧实现

sinh_custom_tiling.h文件实现

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

sinh_custom.cpp文件实现

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

5.算子工程编译和部署

算子kernel侧和host侧代码实现了之后,需要对算子工程进行编译,生成自定义算子安装包*.run
编译之前要修改CMakePresets.json文件下的ASCEND_CANN_PACKAGE_PATH变量,修改成你实际的CANN安装路径,我的修改如下:
image.png
修改好之后,切换到SinhCustom目录下,执行以下命令:
./build.sh
编译成功截图如下:
image.png

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

看到SUCCESS代表算子部署成功

6.使用aclnn方式调用

把AddCustom算子的AclNNInvocation文件夹复制一遍,目录位于samples/operator/AddCustomSample / FrameworkLaunch/AclNNInvocation,目录结构如下:
image.png
需要修改的文件有scripts文件下的gen_data.py,src文件下的main.cpp,op_runner.cpp

gen_data.py修改

image.png

main.cpp修改

要修改输入输出文件的位置
image.png

op_runner.cpp修改

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

修改完上述文件之后,就可以使用ACLNN的方式调用验证算子,进入AclNNInvocation文件夹,运行以下命令
bash run.sh
打印如下图,则代表测试通过!
image.png
可以看到真实结果和预期结果非常接近。误差很小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/291728.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 ElementUI 组件构建无边框 Window 桌面应用(WinForm/WPF)

生活不可能像你想象得那么好&#xff0c;但也不会像你想象得那么糟。 我觉得人的脆弱和坚强都超乎自己的想象。 有时&#xff0c;我可能脆弱得一句话就泪流满面&#xff1b;有时&#xff0c;也发现自己咬着牙走了很长的路。 ——莫泊桑 《一生》 一、技术栈 Vite Vue3 TS E…

Python字符串处理全攻略(一):常用内置方法轻松掌握

文章目录 引言Python字符串常用内置方法str.capitalize()语法示例运行结果注意事项 str.upper()语法示例注意事项 str.lower()语法示例注意事项 str.center()语法示例注意事项 str.count()语法示例注意事项 str.endswith()语法示例注意事项 str.find()语法示例注意事项 结束语 …

单片机原理及应用:Keil μVision4和Proteus 8的配置介绍

笔者所在的专业最近开设了单片机课程&#xff0c;对笔者而言&#xff0c;虽然之前有一定的代码基础。但还是第一次面对既要求代码架构又要求电路仿真的领域。为了巩固知识和增强记忆&#xff0c;特此创建了这个专栏&#xff0c;谨以一名非电专业初学者的身份记录和分享知识。 …

[node]Node.js 中REPL简单介绍

[node]Node.js 中REPL简单介绍 什么是REPL为什么使用REPL如何使用REPL 命令REPL模式node的全局内容展示node全局所有模块查看全局模块具体内容其它命令 实践 什么是REPL Node.js REPL(Read Eval Print Loop:交互式解释器) 表示电脑的环境&#xff0c;类似 Windows 系统的终端或…

BDD - Python Behave 入门

BDD - Python Behave 入门 Behave 是什么Behave 的主要特点和组成部分Behave 实践安装 BehaveBehave 项目目录结构创建项目创建 Feature 文件创建步骤定义文件 执行用例执行全部用例执行部分用例 生成报告生成 Json report生成 HTML 报告生成 Junit report生成 Cucumber report…

大数据技术基础-读书笔记

大数据技术基础-读书笔记 一、大数据概述 大数据是指在一定时间内无法用常规软件工具对其内容进行抓取、处理、分析和管理的数据集合。 大数据一般会涉及两种以上的数据形式&#xff0c;数据量通常是100TB以上的高速、实时数据流&#xff0c;或者从每年增长速度快的小数据开…

【Docker-5】镜像编排

Dockerfile语法 制作apache镜像 httpd.service 文件路径&#xff1a;/lib/systemd/system/httpd.service [rootdocker-0002 ~]# mkdir apache [rootdocker-0002 ~]# cd apache拷贝动态页面到docker-0002的/root/apache/ [rootecs-proxy ~]# scp /root/5/public/info.php 192.…

js中的Array.from()和Array.of()方法的用法详情

&#x1f601; 作者简介&#xff1a;一名大四的学生&#xff0c;致力学习前端开发技术 ⭐️个人主页&#xff1a;夜宵饽饽的主页 ❔ 系列专栏&#xff1a;JavaScript小贴士 &#x1f450;学习格言&#xff1a;成功不是终点&#xff0c;失败也并非末日&#xff0c;最重要的是继续…

Spring Boot学习随笔- 拦截器实现和配置(HandlerInterceptor、addInterceptors)、jar包部署和war包部署

学习视频&#xff1a;【编程不良人】2021年SpringBoot最新最全教程 第十三章、拦截器 拦截器 &#xff1a;Interceptor 拦截 中断 类似于javaweb中的Filter&#xff0c;不过没有Filter那么强大 作用 Spring MVC的拦截器是一种用于在请求处理过程中进行预处理和后处理的机制。拦…

C# SQLite基础工具类

目录 1、安装System.Data.SQLite工具包 2、创建数据库 3、数据库的连接与断开 4、执行一条SQL语句 5、批量执行sql语句 6、返回首行首列值 7、执行sql语句返回datatable 1、安装System.Data.SQLite工具包 2、创建数据库 /// <summary> /// 数据库路径 …

量化交易学习笔记:XGBoost 在量化选股中的应用

一、引言 本篇文章通过借鉴传统机器学习算法——XGBoost——对相同的量价因子进行实验&#xff0c;方便与深度学习模型进行对比实践。 二、算法介绍 XGBoost 是在 Gradient Boosting&#xff08;梯度提升&#xff09;框架下实现的机器学习算法&#xff0c;全称为“极限梯度提…

文献速递:生成对抗网络医学影像中的应用—— CG-3DSRGAN:用于从低剂量PET图像恢复图像质量的分类指导的3D生成对抗网络

文献速递&#xff1a;生成对抗网络医学影像中的应用—— CG-3DSRGAN&#xff1a;用于从低剂量PET图像恢复图像质量的分类指导的3D生成对抗网络 本周给大家分享文献的主题是生成对抗网络&#xff08;Generative adversarial networks, GANs&#xff09;在医学影像中的应用。文献…