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

news2024/12/23 11:08:59

自定义算子调用方式

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.coloradmin.cn/o/1274006.html

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

相关文章

docker buildx跨架构构建笔记(x86_64构建下构建aarch64镜像)

docker buildx跨架构构建(x86_64构建aarch64镜像) 文章目录 docker buildx跨架构构建(x86_64构建aarch64镜像)简介第一步 先交叉编译一个aarch64的HelloWorld程序。准备一个用于跨架构的Dockerfile文件使用docker buildx命令构建aarch64架构的镜像。查看镜像具体详细信息&#…

LeetCode Hot100 438.找到字符串中所有字母异位词

题目: 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。 代码: class Solution …

【shell】shell脚本编程作业

1 编写bash脚本,要求用户输入源目录和目标目录(绝对路径),然后列出源目录下所有的文件,并将这些文件拷贝到目标目录,并在文件名后面加上时间戳。(提交源代码和运行截图) if [ -d $1 ] || [ -d…

类和对象——(3)再识对象

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 你说那里有你的梦想,…

国产linux单用户模式破解无密码登陆 (麒麟系统用户登录密码遗忘解决办法)

笔者手里有一批国产linu系统,目前开始用在日常的工作生产环境中,我这个老程序猿勉为其难的充当运维的或网管的角色。 国产linux系统常见的为麒麟Linux,统信UOS等,基本都是基于debian再开发的linux。 问题描述: 因为…

centos7下执行yum命令报错

前言 在Linux系统中,安装nginx时候,需要先安装环境。 Nginx是使用C语言开发,安装nginx需要先从官网上将源码下载,然后编译,编译需要gcc环境,但是在安装gcc环境的时候,执行命令报错。 yum install –y gcc-…

【稳定检索|投稿优惠】2024年生物神经工程与健康大数据国际会议(ICBNHBD 2024)

2024年生物神经工程与健康大数据国际会议(ICBNHBD 2024) 2024 International Conference on Biological Neuroengineering and Health Big Data(ICBNHBD) 一、【会议简介】 2024年生物神经工程与健康大数据国际会议(ICBNHBD 2024),这场科学盛宴,会议在中…

训练自己的个性化Stable diffusion模型,LORA

一、背景 需要训练自己的LORA模型 二、分析 1、有sd-webui有训练插件功能 2、有单独的LORA训练开源web界面 两个开源训练界面 1、秋叶写的SD-Trainer https://github.com/Akegarasu/lora-scripts/ 没成功,主要也是cudnn和nvidia-smi中的CUDA版本不一致退出 2…

操作系统背景知识

一、程序分类 程序按其运行环境分为: 裸机程序:直接运行在对应硬件上的程序 应用程序:只能运行在对应操作系统上的程序 二、计算机系统的层次结构 计算机系统两种层次结构: 2.1 无操作系统的简单的两层结构 2.2 有操作系统的…

SpringBoot中的部分注解

1.SpringBoot/spring SpringBootApplication: 包含Configuration、EnableAutoConfiguration、ComponentScan通常用在主类上; Repository: 用于标注数据访问组件,即DAO组件; Service: 用于标注业务层组件; RestController: 用…

使用ApexSQLLog工具恢复数据库

目录 前言 一、ApexSQLLog是什么? 二、使用步骤 1.连接你要恢复的数据库 2.选择你要恢复的时间点的数据 3.恢复指定操作的数据 4.恢复指定的表 5.输出结果方式 6.输出结果方式 7.生成还原的sql语句 总结 前言 我们在操作数据库的时候可能误操作把数据修…

Ps:用好钢笔工具

使用钢笔工具时,应随时注意鼠标指针的形状。 ◆ ◆ ◆ 基本操作方法 1、绘制闭合路径 路径绘制结束时回到起点即可创建闭合路径。 2、绘制开放路径 想结束绘制时,按住 Ctrl 键点击画布空白处,或者,直接按 Esc 键,即可…

qt-C++笔记之点击按钮弹出文件资源管理器选择文件后把文件路径赋值给一个QString

qt-C笔记之点击按钮弹出文件资源管理器选择文件后把文件路径赋值给一个QString code review! 文章目录 qt-C笔记之点击按钮弹出文件资源管理器选择文件后把文件路径赋值给一个QString1.运行2.main.cpp3.qt_FileDialog.pro4.QFileDialog类详解 1.运行 2.main.cpp 代码 #inclu…

达索系统SOLIDWORKS 2024工程图新功能

工程图概述 设计模型不仅能比绘制直线更快;SOLIDWORKS 从模型中生成工程图,模型的参数和几何关系在工程图中被保留,这样工程图可反映模型的设计意图;模型或工程图中的更改反映在其相关文件中,这样更改起来更容易&…

基于AT89C51单片机的电子闹钟设计

1.设计任务 利用AT89C51单片机为核心控制元件,设计一个电子闹钟,设计的系统实用性强、操作简单,实现了智能化、数字化。 (1)按开始键自动进入时间显示,开始为0,按K1键进入更改时间&#xff0c…

AMEYA360:思瑞浦TPS32 MCU两大全新产品系列介绍

TPS32混合信号微控制器依托思瑞浦出色的数模混合信号处理技术能力,围绕垂直应用开发产品,优化产品设计,助力客户实现终端产品的差异化。思瑞浦提供完整的开发生态系统支持,包含简单易用的配套嵌入式软件包、硬件和软件开发工具&am…

时序预测 | Python实现TCN时间卷积神经网络价格预测

时序预测 | Python实现TCN时间卷积神经网络时间序列预测 目录 时序预测 | Python实现TCN时间卷积神经网络时间序列预测预测效果基本介绍模型描述程序设计参考资料预测效果 基本介绍 时间卷积网络,TCN。 利用CNN技术处理时间序列数据。 卷基础层有三种,第一种是一维CNN,用于输…

某60区块链安全之薅羊毛攻击实战一学习记录

区块链安全 文章目录 区块链安全薅羊毛攻击实战一实验目的实验环境实验工具实验原理实验内容薅羊毛攻击实战一 实验步骤EXP利用 薅羊毛攻击实战一 实验目的 学会使用python3的web3模块 学会分析以太坊智能合约薅羊毛攻击漏洞 找到合约漏洞进行分析并形成利用 实验环境 Ubun…

latex中算法的几种模板

latex中算法的几种模板_latex算法模板-CSDN博客文章浏览阅读6.2k次,点赞3次,收藏45次。latex中几种算法模板_latex算法模板https://blog.csdn.net/weixin_50514171/article/details/125136121?spm1001.2014.3001.5506 latex排版原理 常用算法排版伪代码…

程序/进程替换(讲解)

本文旨在讲解进程替换的知识!希望读完本文,能使读者对进程替换有更深一步的认识!!好的,废话不多说,干货来了! 进程替换的引进! 为什么要引进进程替换呢?我们创建子进程总…