CANN训练营第二季—Ascend C编程课sinh算子开发记录

 考题

参考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.

服务器资源

这是一台有8张昇腾910A的服务器,已装23.0.rc1版本的驱动

资料汇

CANN文档

昇腾样例

CANN社区版下载

sinh算子开发记录

1.安装cann包

下载安装包`Ascend-cann-toolkit_7.0.RC1.alpha002_linux-aarch64.run`

使用

Ascend-cann-toolkit_7.0.RC1.alpha002_linux-aarch64.run --full

指令安装在个人用户目录

cke_25904.png

环境初始化

source ~/Ascend/ascend-toolkit/set_env.sh

2.安装python环境

我这里安装了miniforge3并创建了一个conda环境,修改源之后安装一些需要用到的基础库

conda create -n cann7
conda activate cann7
# 改一下源
conda install -n cann7 numpy cmake scipy python=3.7 ipython protobuf sympy

3.运行sample仓库示例

克隆代码仓

https://gitee.com/ascend/samples.git

内核调试符方式调用算子的代码示例在如下目录:

samples/cplusplus/level1_single_api/4_op_dev/6_ascendc_custom_op/kernel_invocation

这里需要先修改`kernel_invocation/kernel_template/run.sh`文件的`ASCEND_HOME_DIR`变量

cke_158642.png

运行

(cd Add; bash run.sh add_custom ascend910 AiCore npu)

cke_162678.png

单算子API调用方式的代码示例在如下目录:

samples/operator/AddCustomSample

4.sinh算子内核调试符方式

可以直接基于sample仓的Add进行修改,首先编写真值生成脚本

cke_226371.png

修改核函数计算逻辑

cke_241069.png

把输入从2个改成1个,就可以运行了

cke_263572.png

结果文件的md5码不一致,把值打印出来看一下

cke_297105.png

看起来只是有一点精度误差。

动态shape的修改方式也是类似的,基于Add_tile进行修改,先编辑真值生成脚本

cke_377309.png

修改计算逻辑,然后把输入从2个改成1个就可以运行了

cke_398756.png

5.sinh算子API调用方式

编写SinhCustom算子的原型定义json文件,用于生成SinhCustom的算子开发工程

cke_427546.png

使用msopgen工具生成AddCustom算子的开发工程

~/Ascend/ascend-toolkit/latest/python/site-packages/bin/msopgen gen -i ./sinh_custom.json  -c ai_core-Ascend910A  -lan cpp -out ./SinhCustom

修改`CMakePresets.json`文件的`ASCEND_CANN_PACKAGE_PATH`

"ASCEND_CANN_PACKAGE_PATH": {
    "type": "PATH",
    "value": "/home/yangk/Ascend/ascend-toolkit/latest"
},
"ENABLE_BINARY_PACKAGE": {
    "type": "BOOL",
    "value": "True"
},

运行build.sh脚本,报错了

cke_457123.png

百度说没缺个包,装一下

conda install -n cann7 hypothesis

成功了

cke_498116.png

安装包部署

./custom_opp_ubuntu_aarch64.run

cke_511312.png

部署成功后就可以在这个目录下面找到算子

cke_558478.png

可以调用的API函数在SinhCustom/build_out/autogen/aclnn_sinh_custom.h

cke_589802.png

准备验证代码工程,可以从sample仓获取样例工程的完整样例

├── inc                           // 头文件目录 
│   ├── common.h                 // 声明公共方法类,用于读取二进制文件 
│   ├── operator_desc.h          // 算子描述声明文件,包含算子输入/输出,算子类型以及输入描述与输出描述 
│   ├── op_runner.h              // 算子运行相关信息声明文件,包含算子输入/输出个数,输入/输出大小等 
├── run                           // 单算子执行需要的文件存放目录 
│   ├── out    // 单算子执行需要的可执行文件存放目录 
│        └── test_data           // 测试数据存放目录 
│           ├── config 
│               └── acl.json     // 用于进行acl初始化,请勿修改此文件 
│           ├── data 
│               └── generate_data.py    // 生成测试数据的脚本 
├── src 
│   ├── CMakeLists.txt    // 编译规则文件
│   ├── common.cpp         // 公共函数,读取二进制文件函数的实现文件
│   ├── main.cpp    // 单算子调用应用的入口
│   ├── operator_desc.cpp     // 构造算子的输入与输出描述 
│   ├── op_runner.cpp   // 单算子调用主体流程实现文件
├── scripts
│   ├── verify_result.py    // 真值对比文件

修改路径变量

cke_637214.png

make,报错了

cke_675345.png

设置一下环境变量

export DDK_PATH=${ASCEND_TOOLKIT_HOME}
export NPU_HOST_LIB=${ASCEND_TOOLKIT_HOME}/aarch64-linux/lib64

cke_703907.png

成功了,之后可以运行这个可执行文件

cke_752516.png

验证结果

cke_829541.png

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值