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

自定义算子调用方式

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

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

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

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

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

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

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

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

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去初始化
整理成图片形式如下:
image.png

单算子模型调用方式

单算子模型根据算子编译方式,分为在线和离线调用方式,主要步骤为:
先将自定义算子转换为单算子离线模型文件(*.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文件
86d87ed286d371cf74c2221206f6215.png

de8844153214da83307f1b6dd627b05.png

咨询了一下,在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软件包安装后的实际路径
image.png

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

bash build.sh

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

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

image.png

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

./custom_opp_euleros_aarch64.run

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

image.png

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


进入AclNNInvocation目录:

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

执行run.sh脚本

bash run.sh

运行成功显示如下:
image.png

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

进入到AclOfflineModel目录:

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

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

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

image.png

报错原因应该是因为我在启智社区调式的镜像环境有问题,需要源码安装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在启动中

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

image.png

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

进入到AclOnlineModel目录下:

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

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

bash run.sh

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

image.png

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

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

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

相关文章

leetCode 131.分割回文串 + 动态规划 + 回溯算法 + 优化 + 图解 + 笔记

我的往期文章: leetCode 647.回文子串 动态规划 优化空间 / 中心扩展法 双指针-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/133883091?spm1001.2014.3001.5501leetCode 131.分割回文串 回溯算法 图解 笔记-CSDN博客https://blog.csdn.n…

使用Docker本地部署chatgpt

GitHub上有一个开源的工程ChatGPT-Next-Web,这个工程已经封装好了UI以及和OpenAI的API之间的交互,你要做的事情就是把他部署到本地,并配置好你的OpenAI的sk,然后就可以使用了。那么接下来的文章里,我会手把手教你如何C…

Vue3 究竟好在哪里?

Vue3 相较于 Vue2 在很多方面都有所改进和优化,以下是一些主要的优点: 性能提升:Vue3 使用了新的编译器(Vite),使得打包速度更快,运行速度也有所提升。同时,Vue3 对响应式系统进行了…

关于如何写好单元测试的思考

“二八定律”,由19世纪末20世纪初意大利经济学家巴莱多提出。他认为,在任何一组东西中,最重要的只占其中一小部分,约20%,其余80%尽管是多数,却是次要的。 What? 释义 单元测试(uni…

C语言第四十弹---两个整数二进制位不同的个数

C语言求两个整数二进制位不同的个数 遍历法&#xff0c;使用循环获取每一位二进制位数&#xff0c;并让二进制位与1比较&#xff0c;如果相同则忽略&#xff0c;不同则个数增加。 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h>int main() {int a 0;int b 0;in…

4.求解无向图的各连通分支

求解无向图的各连通分支 输入&#xff1a; 第一行为图的节点数n&#xff08;节点编号0至n-1&#xff0c;0<n<10&#xff09; 从第二行开始列出图的边&#xff0c;-1表示输入结束 输出&#xff1a; 输出每个连通分支的广度优先搜索序列&#xff08;从连通分支的最小编号…

下拉列表select动态添加option和获取选中的option的值和value

分别用两种方法动态添加option&#xff1a; 方法一&#xff1a;JS方法添加 1、创建select标签 var select documnet.createElement(‘select’); 2、给select添加id select.setAttribute(‘id’,‘selectid’); 3、给select添加onchange事件 select.setAttribute(‘onc…

【云原生系列】Kubernetes知识点

目录 概念 基础架构 单master节点 多master节点 组件 Master节点核心组件 其他组件 请求发送流程 插件 核心资源 调度资源 Pod 创建pod组件间调用流程 pod生命周期&#xff1a; 初始化容器 镜像拉取策略 重启策略 钩子函数 探针 探针的实现方式 DownwardAP…

如何解决Windows中“Address already in use: bind“错误

当在Windows系统中开发网络应用程序时&#xff0c;经常会遇到 "Address already in use: bind" 的错误。这个错误通常表示正在尝试绑定的端口已经被其他程序占用了。本篇技术博客将介绍如何在Windows系统中解决这个问题&#xff0c;并提供实用的解决方案。 在网络应用…

Axios.post 请求报错: 403 Forbidden missing csrf token 和 invalid csrf token

Axios.post 请求报错&#xff1a;403 Forbidden missing csrf token 和 invalid csrf token 问题及解决 这个问题是在一个 post 请求的跨域接口上出现的 很奇怪的问题&#xff0c;可以直接看一解决方案就行了 一、解决方案 问题&#xff1a;使用 Axios.post 请求报错&#xff…

数据收集与处理(爬虫技术)

文章目录 1 前言2 网络爬虫2.1 构造自己的Scrapy爬虫2.1.1 items.py2.1.2 spiders子目录2.1.3 pipelines.py 2.2 构造可接受参数的Scrapy爬虫2.3 运行Scrapy爬虫2.3.1 在命令行运行2.3.2 在程序中调用 2.4 运行Scrapy的一些要点 3 大规模非结构化数据的存储与分析4 全部代码 1 …

【JavaSE】Java基础(学习笔记)

一、数组 1、动态初始化 int arr new int[3];数组名字是地址默认初始值为0数组的内存分配 2、数组的内存分配 arr存在栈里&#xff0c;只存地址&#xff0c;是局部变量&#xff0c;相当于指针new出来的实体/对象存在堆里&#xff0c;存放数据&#xff0c;用完也不会立即消…

【二叉树】Leetcode 266.翻转二叉树

题目链接 参考文章 解题思路 如果从整棵树的角度来看&#xff0c;用层序遍历翻转一棵二叉树需要遍历同一层节点后再反向遍历该层节点并且改变指针&#xff0c;但是这样做不仅低效率还会访问到野指针。因此必须换一个角度考虑问题&#xff1a;如果将每一个父节点的左右孩子交换…

LCR 140. 训练计划 II 23.12.01

给定一个头节点为 head 的链表用于记录一系列核心肌群训练项目编号&#xff0c;请查找并返回倒数第 cnt 个训练项目编号。 示例 1&#xff1a; 输入&#xff1a;head [2,4,7,8], cnt 1 输出&#xff1a;8 提示&#xff1a; 1 < head.length < 100 0 < head[i] …

【EasyExcel实践】万能导出,一个接口导出多张表以及任意字段(可指定字段顺序)

文章目录 前言正文一、POM依赖二、核心Java文件2.1 自定义表头注解 ExcelColumnTitle2.2 自定义标题头的映射接口2.3 自定义有序map存储表内数据2.4 表头工厂2.5 表flag和表头映射枚举2.6 测试用的实体2.6.1 NameAndFactoryDemo2.6.2 StudentDemo 2.7 启动类2.8 测试控制器 三、…

【Spark基础】-- 宽窄依赖

目录 1、前言 2、宽窄依赖 2.1 窄依赖 2.2 宽依赖 3、宽窄转换的算子 1、前言 要理解宽窄依赖,首先我们需要了解 Transformations,什么是 Transformations?在 Spark 中,核心的数据结构是不可变的

数据结构-03-栈

1-栈的结构和特点 先进后出&#xff0c;后进先出 是栈的特点&#xff1b; 从图中&#xff0c;我们看到A入栈先放入底部&#xff0c;然后依次B和C&#xff1b;出栈的顺序依次是C-B-A&#xff1b;这种结构只能在一端操作。所以当某个数据集合只涉及在一端插入和删除数据&#xf…

什么是灯塔工厂?灯塔工厂的作用?

什么是灯塔工厂&#xff1f; "灯塔工厂"概念源于德国的工业4.0战略&#xff0c;又称“工业4.0示范工厂”或“标杆工厂”&#xff0c;代表工业领域顶级的智能制造能力。2018年&#xff0c;由世界经济论坛和麦肯锡共同推出。 灯塔工厂是通过数字化、网络化和智能化手…

Git常用命令#merge分支合并

要查看所有分支&#xff0c;包括本地和远程仓库的分支&#xff0c;可以使用以下命令&#xff1a; 1.查看分支 1.1 查看本地分支 git branch这个命令会列出本地所有的分支&#xff0c;当前所在的分支会有 * 标记。 1.2 查看远程分支 git branch -r这个命令会列出远程仓库的分…

Linux常用命令——pwd命令

文章目录 简介pwd命令的参数常见用法及实例1. 基本用法2. 使用 -P 参数3. 使用 -L 参数注意事项 结论 简介 pwd&#xff08;Print Working Directory&#xff09;是Linux和Unix系统中的一个常用命令&#xff0c;用于显示当前工作目录的完整路径。这个命令对于定位用户当前所在…