【2023CANN训练营第二季】——Ascend C算子调用及实验演示
  c8diFpwhOi78 2023年11月30日 18 0

自定义算子调用方式

【2023CANN训练营第二季】——Ascend C算子调用及实验演示_离线

完成自定义算子的开发部署后,可以通过单算子调用的方式来验证单算子的功能。单算子调用有API执行和模型执行两种方式:

  • 单算子API执行:基于C语言的API执行算子,无需提供单算子描述文件进行离线模型的转换,直接调用单算子API接口。
  • 单算子模型执行:基于图IR执行算子,先编译算子(例如,使用ATC工具将Ascend IR定义的单算子描述文件编译成算子om模型文件),再调用AscendCL接口加载算子模型,最后调用AscendCL接口执行算子。

两种方式对于自定义算子开发部署的不同约束要求如下:

【2023CANN训练营第二季】——Ascend C算子调用及实验演示_离线_02

下面分别梳理单算子调用的方式

单算子API执行,Aclnn调用方式

要进行单算子API执行,首先需要做一些前置工作:参考基于msopgen工具创建算子工程完成算子工程的创建,参考kernel侧算子实现完成kernel侧实现的相关准备,参考host侧算子实现完成host侧实现相关准备。参考算子编译部署完成算子的编译部署。

然后检查API执行需要的头文件和库文件是否自动生成,算子工程build_out/auto_gen目录下会自动生成以下文件├── aclnn_Xxx.cpp // 自动生成的单算子API执行接口实现文件 ├── aclnn_Xxx.h // 自动生成的单算子API执行接口头文件 ├── ...

接下来准备验证代码工程:目录如下:

【2023CANN训练营第二季】——Ascend C算子调用及实验演示_离线_03

Aclnn调用步骤主要包括如下:1.AscendCL初始化 调用allnit接口实现初始化AscendCL 2.运行管理资源申请,依次申请运行管理资源: Device、 Context. Stream 3.申请内存和传输数据 调用aclrtMalloc接口申请Device_上的内存,存放待执行算子的输入、输出数据 调用aclCreate的张量、aclcreateIntArray等接口构造算子的输入、输出,如aclTenser 如果需要将Host.上数据传输到Device,则需要调用acIrtMemcpy接口(同步接口)或AclrtmemcpyAsync接口(异步接口)通过内存复制的方式实现数据传输

4.计算workspace并执行算子调用acInnXxxGetWorkspaceSize接口获取算子入参和算子执行流程需要的workspace大小

调用acltMalloc接口,根据workspaceSize大小申请Device侧内存 调用acInnXxx接口执行计算并得到结果 5.调用aclrtSynchronizeStream接口阻塞应用运行,直到指定Stream中的所有任务都完成。 6.运行管理资源释放 7.AscendCL去初始化 整理成图片形式如下:

【2023CANN训练营第二季】——Ascend C算子调用及实验演示_API_04

单算子模型调用方式

单算子模型根据算子编译方式,分为在线和离线调用方式,主要步骤为:先将自定义算子转换为单算子离线模型文件(*.om),然后通过AscendCL接口加载单算子模型文件并运行。 主要步骤包括:

1.编译算子根据算子编译的方式,分为离线编译(ofline)和在线编译(online):

  • 编译算子后, 算子相关数据保存在* .om模型文件中,需使用ATC工具,将单算子定义文件(json) 编译成离线模型(.om文件)
  • 编译算子后,算子相关数据保存在内存中,对于同一个算子,编译一次,多次执行的场景,调用aclopCompile接口编译算子

2.加载算子模型文件调用aclopSetModelDir接口,设置加载模型文件的目录,目录下存放单算子模型文件(*.om文件) 3.调用aclrtMalloc接口申请Device,上的内存,存放执行算子的输入、输出数据,如果需要将Host_上数据传输到Device,则需要调用aclrtMemcpy接口(同步接口)或acltMemcpyAsync接口 (异步接口) 通过内存复制的方式实现数据传输 4.执行算子 调用aclopExecuteV2接口执行算子。每次执行算子时,系统内部都会根据算子描述信息匹配内存中的模型 5.调用aclrtSynchronizeStream接口阻塞应用运行,直到指定Stream中的所有任务都完成 6.调用aclrtFree接口释放内存 如果需要将Device.上的算子执行结果数据传输到Host,则需要调用aclrtMemcpy接口(同步接口)或aclrtMemcpyAsync接口 (异步接口)通过内存复制的方式实现数据传输,然后再释放内存。

下面自己做实验,演示上述三种自定义算子调用方式

调用方式样例演示

本次演示主要分为三种,分别为online,offline,Aclnn的模型,下面分别看每一种的演示步骤:

编译并运行在线编译的单算子API样例

因为我在在新版的samples仓库并没有看到课程里的那个文件夹下的aclnn_online_model文件

【2023CANN训练营第二季】——Ascend C算子调用及实验演示_离线_05

【2023CANN训练营第二季】——Ascend C算子调用及实验演示_API_06

咨询了一下,在home/ma-user/samples/operator/AddCustomSample/FrameworkLaunch/AclNNInvocation文件夹下,所以如果是11月下载samples版本的伙伴可以在这个目录下找到上面三种模型。


!!重要: 单算子调用之前,需要先编译算子工程,进行AddCustom目录:

cd home/ma-user/work/samples/operator/AddCustomSample/FrameworkLaunch/AddCustom

修改CMakePresets.json文件的"ASCEND_CANN_PACKAGE_PATH"字段,修改为请替换为CANN软件包安装后的实际路径

【2023CANN训练营第二季】——Ascend C算子调用及实验演示_数据传输_07

修改好之后在当下的目录下编译工程:

bash build.sh

显示以下信息则说明成功:

【2023CANN训练营第二季】——Ascend C算子调用及实验演示_API_08

此时在AddCustom文件夹下生成了一个新的文件夹build_out,里面有autogen等文件

【2023CANN训练营第二季】——Ascend C算子调用及实验演示_数据传输_09

接下来进行算子部署进入到build_out目录下,执行以下命令:

./custom_opp_euleros_aarch64.run

生成以下信息说明部署成功:

【2023CANN训练营第二季】——Ascend C算子调用及实验演示_API_10

准备工作做好了之后,就可以进行编译并运行单算子API样例


进入AclNNInvocation目录:

cd home/ma-user/work/samples/operator/AddCustomSample/FrameworkLaunch/AclNNInvocation

执行run.sh脚本

bash run.sh

运行成功显示如下:

【2023CANN训练营第二季】——Ascend C算子调用及实验演示_数据传输_11

编译并运行离线编译的单算子模型样例

进入到AclOfflineModel目录:

home/ma-user/work/samples/operator/AddCustomSample/FrameworkLaunch/AclOfflineModel

执行 bash run.sh命令,报错:

ERROR: acl executable run failed! please check your project!

【2023CANN训练营第二季】——Ascend C算子调用及实验演示_数据传输_12

报错原因应该是因为我在启智社区调式的镜像环境有问题,需要源码安装python3.7.5

下载python3.7.5并解压、安装

wget https://canncamp202302.obs.cn-north-4.myhuaweicloud.com/Python-3.7.5.tgz
tar -zxvf Python-3.7.5.tgz
cd Python-3.7.5
./configure --prefix=/usr/local/python3.7.5 --enable-loadable-sqlite-extensions --enable-shared
make
make install

设置环境变量

export PATH=/usr/local/python3.7.5/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/python3.7.5/lib:$LD_LIBRARY_PATH

安装依赖

pip3 install -i https://repo.huaweicloud.com/repository/pypi/simple/  --upgrade pip
pip3 install -i https://repo.huaweicloud.com/repository/pypi/simple/ attrs numpy decorator sympy cffi pyyaml pathlib2 psutil protobuf==3.19.0 scipy requests absl-py wheel typing_extensions

接下来再次运行AclOfflineModel目录下的命令:

bash run.sh

然后等一会儿,ATC在启动中

生成以下信息则说明运行成功:

【2023CANN训练营第二季】——Ascend C算子调用及实验演示_离线_13

编译并运行在线编译的单算子模型样例

进入到AclOnlineModel目录下:

cd home/ma-user/work/samples/operator/AddCustomSample/FrameworkLaunch/AclOnlineModel

使用aclopCompile模型调用的方式调用AddCustom算子工程

bash run.sh

生成以下信息说明运行成功

【2023CANN训练营第二季】——Ascend C算子调用及实验演示_数据传输_14

以上就是Ascend C算子调用的理论知识和实操环节,总结一下自己在进行实验的时候遇到了很多问题,报了一些错误,比如cmake版本太低,还有头文件找不到等错误,归根到底是路径设置,和版本更新问题,最后通过在群里,昇腾社区提问的方式,还有看了有经验的大佬写的帖子,解决了这些问题,说明还是要多加实操,遇到问题就解决,解决不了就寻求帮助,加油!

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月30日 0

暂无评论

推荐阅读
  mcbWRrRPlhs5   2023年11月30日   20   0   0 访问令牌API应用程序
c8diFpwhOi78