考题
参考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版本的驱动
资料汇总
sinh算子开发记录
1.安装cann包
下载安装包`Ascend-cann-toolkit_7.0.RC1.alpha002_linux-aarch64.run`
使用
Ascend-cann-toolkit_7.0.RC1.alpha002_linux-aarch64.run --full
指令安装在个人用户目录
环境初始化
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`变量
运行
(cd Add; bash run.sh add_custom ascend910 AiCore npu)
单算子API调用方式的代码示例在如下目录:
samples/operator/AddCustomSample
4.sinh算子内核调试符方式
可以直接基于sample仓的Add进行修改,首先编写真值生成脚本
修改核函数计算逻辑
把输入从2个改成1个,就可以运行了
结果文件的md5码不一致,把值打印出来看一下
看起来只是有一点精度误差。
动态shape的修改方式也是类似的,基于Add_tile进行修改,先编辑真值生成脚本
修改计算逻辑,然后把输入从2个改成1个就可以运行了
5.sinh算子API调用方式
编写SinhCustom算子的原型定义json文件,用于生成SinhCustom的算子开发工程
使用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脚本,报错了
百度说没缺个包,装一下
conda install -n cann7 hypothesis
成功了
安装包部署
./custom_opp_ubuntu_aarch64.run
部署成功后就可以在这个目录下面找到算子
可以调用的API函数在SinhCustom/build_out/autogen/aclnn_sinh_custom.h
准备验证代码工程,可以从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 // 真值对比文件
修改路径变量
make,报错了
设置一下环境变量
export DDK_PATH=${ASCEND_TOOLKIT_HOME}
export NPU_HOST_LIB=${ASCEND_TOOLKIT_HOME}/aarch64-linux/lib64
成功了,之后可以运行这个可执行文件
验证结果