OrangePi AIpro 香橙派 昇腾 Ascend C 算子开发 与 调用 - 通过aclnn调用的方式调用AddCustom算子

OrangePi AIpro 香橙派 昇腾 Ascend C 算子开发 与 调用 通过aclnn调用的方式调用 - AddCustom算子 - 单算子API执行(aclnn)

多种算子调用方式

*开发时间使用场景调用方式运行硬件
基于Kernel直调工程(快速)单算子调用,快速验证算法逻辑ICPU_RUN_KF
内核调用符号
ACLRT_LAUNCH_KERNEL
CPU
NPU
NPU
基于自定义算子工程(标准)单算子网络/整网部署调用aclInnxxx
aclopExecuteV2
pytorch adapter
NPU
NPU
NPU

AscendCL单算子调用概述

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

单算子API执行(aclnn) (本文描述的):

基于C语言的API执行算子,直接调用单算子API接口。多用于大模型训练算子,既整网算子模型较为固定的场景。

单算子模型执行:

基于图模式执行算子,先编译算子(例如,使用ATC工具将AscendIR定义的单算子描述文件编译成算子om模型文件),再调用AscendCL接口加载算子模型,最后调用AscendCL接口执行算子。多用于搜广推,整网模型变化较大的场景。

前面的内容是实现AddCustom算子,这里是通过aclnn调用的方式调用AddCustom算子,也是基于C语言的API执行算子,直接调用单算子API接口。
所有有两部分

一部分是 之前的实现

/home/HwHiAiUser/samples/operator/AddCustomSample/FrameworkLaunch/AddCustom

在这里插入图片描述可以从json串开始生成代码骨架,然后开始填写内容。具体请看这里
前置知识 1
前置知识 2
前置知识 3

编译
在这里插入图片描述

因为单算子API执行方式,会自动在编译工程的build_out/autogen目录下生成.cpp和.h,编写单算子的调用代码时,要包含自动生成的单算子API执行接口头文件。

#include "aclnn_add_custom.h"
/home/HwHiAiUser/samples/operator/AddCustomSample/FrameworkLaunch/AddCustom/build_out/

在这里插入图片描述编译完之后开始安装
编译成功后打包为run文件
然后安装run,安装完整就可以用了
在这里插入图片描述
安装完就可以调用了

另一部分算子调用

/home/HwHiAiUser/samples/operator/AddCustomSample/FrameworkLaunch/AclNNInvocation/

请添加图片描述

├──input                                                 // 存放脚本生成的输入数据目录
├──output                                                // 存放算子运行输出数据和真值数据的目录
├── inc                           // 头文件目录 
│   ├── common.h                 // 声明公共方法类,用于读取二进制文件 
│   ├── operator_desc.h          // 算子描述声明文件,包含算子输入/输出,算子类型以及输入描述与输出描述 
│   ├── op_runner.h              // 算子运行相关信息声明文件,包含算子输入/输出个数,输入/输出大小等 
├── src 
│   ├── CMakeLists.txt    // 编译规则文件
│   ├── common.cpp         // 公共函数,读取二进制文件函数的实现文件
│   ├── main.cpp    // 单算子调用应用的入口
│   ├── operator_desc.cpp     // 构造算子的输入与输出描述 
│   ├── op_runner.cpp   // 单算子调用主体流程实现文件
├── scripts
│   ├── verify_result.py    // 真值对比文件
│   ├── gen_data.py    // 输入数据和真值数据生成脚本文件
│   ├── acl.json    // acl配置文件

运行结果
在这里插入图片描述

自定义算子编译部署后,会自动生成单算子API,可以直接在应用程序中调用。算子API的形式一般定义为“两段式接口”,形如:

aclnnStatus aclnnXxxGetWorkspaceSize(const aclTensor *src, ..., aclTensor *out, uint64_t *workspaceSize, aclOpExecutor **executor);
aclnnStatus aclnnXxx(void *workspace, uint64_t workspaceSize, aclOpExecutor *executor, aclrtStream stream);

Xxx替换实际使用的函数

// 获取算子使用的workspace空间大小
aclnnStatus aclnnAddCustomGetWorkspaceSize(
const aclTensor *x, 
const aclTensor *y, 
const alcTensor *out, 
uint64_t workspaceSize, 
aclOpExecutor **executor);
// 执行算子
aclnnStatus aclnnAddCustom(void *workspace, 
int64_t workspaceSize, 
aclOpExecutor **executor, 
aclrtStream stream);

在这里插入图片描述

单算子API(aclnn)调用–关键代码

重要的就两个函数
在这里插入图片描述

bool OpRunner::RunOp()
{for (size_t i = 0; i < numInputs_; ++i) {auto size = GetInputSize(i);aclrtMemcpyKind kind = ACL_MEMCPY_HOST_TO_DEVICE;if (g_isDevice) {kind = ACL_MEMCPY_DEVICE_TO_DEVICE;}if (aclrtMemcpy(devInputs_[i], size, hostInputs_[i], size, kind) != ACL_SUCCESS) {ERROR_LOG("Copy input[%zu] failed", i);return false;}INFO_LOG("Copy input[%zu] success", i);}aclrtStream stream = nullptr;if (aclrtCreateStream(&stream) != ACL_SUCCESS) {ERROR_LOG("Create stream failed");return false;}INFO_LOG("Create stream success");size_t workspaceSize = 0;aclOpExecutor *handle = nullptr;auto ret =aclnnAddCustomGetWorkspaceSize(inputTensor_[0], inputTensor_[1], outputTensor_[0], &workspaceSize, &handle);if (ret != ACL_SUCCESS) {(void)aclrtDestroyStream(stream);ERROR_LOG("Get Operator Workspace failed. error code is %d", static_cast<int32_t>(ret));return false;}INFO_LOG("Execute aclnnAddCustomGetWorkspaceSize success, workspace size %lu", workspaceSize);if (workspaceSize != 0) {if (aclrtMalloc(&workspace_, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST) != ACL_SUCCESS) {ERROR_LOG("Malloc device memory failed");}}ret = aclnnAddCustom(workspace_, workspaceSize, handle, stream);if (ret != ACL_SUCCESS) {(void)aclrtDestroyStream(stream);ERROR_LOG("Execute Operator failed. error code is %d", static_cast<int32_t>(ret));return false;}INFO_LOG("Execute aclnnAddCustom success");ret = aclrtSynchronizeStreamWithTimeout(stream, 5000);if (ret != SUCCESS) {ERROR_LOG("Synchronize stream failed. error code is %d", static_cast<int32_t>(ret));(void)aclrtDestroyStream(stream);return false;}INFO_LOG("Synchronize stream success");for (size_t i = 0; i < numOutputs_; ++i) {auto size = GetOutputSize(i);aclrtMemcpyKind kind = ACL_MEMCPY_DEVICE_TO_HOST;if (g_isDevice) {kind = ACL_MEMCPY_DEVICE_TO_DEVICE;}if (aclrtMemcpy(hostOutputs_[i], size, devOutputs_[i], size, kind) != ACL_SUCCESS) {INFO_LOG("Copy output[%zu] success", i);(void)aclrtDestroyStream(stream);return false;}INFO_LOG("Copy output[%zu] success", i);}(void)aclrtDestroyStream(stream);return true;
}

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

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

相关文章

Kafka【十二】消费者拉取主题分区的分配策略

【1】消费者组、leader和follower 消费者想要拉取主题分区的数据&#xff0c;首先必须要加入到一个组中。 但是一个组中有多个消费者的话&#xff0c;那么每一个消费者该如何消费呢&#xff0c;是不是像图中一样的消费策略呢&#xff1f;如果是的话&#xff0c;那假设消费者组…

C语言-程序环境 #预处理 #编译 #汇编 #链接 #执行环境

文章目录 前言 一、程序的环境翻译和执行环境 二、翻译环境 (一)、整体把握 (一)、编译 1、预处理(预编译) 2、编译 a、词法分析 b、语法分析 c、语义分析 d、符号汇总 3、汇编 (二)、链接 三、运行环境 总结​​​​​​​ 前言 路漫漫其修远兮&#xff0c;吾将…

9月7日微语报,星期六,农历八月初五

&#xff19;月&#xff17;日微语报&#xff0c;星期六&#xff0c;农历八月初五&#xff0c;周末愉快&#xff01; 一份微语报&#xff0c;众览天下事&#xff01; 1、21个部门&#xff1a;符合条件的流动儿童家庭或可配公租房。 2、多所高校2025年招生简章显示&#xff0…

API安全 | 发现API的5个小tips

在安全测试目标时&#xff0c;最有趣的测试部分是它的 API。API 是动态的&#xff0c;它们比应用程序的其他部分更新得更频繁&#xff0c;并且负责许多后端繁重的工作。在现代应用程序中&#xff0c;我们通常会看到 REST API&#xff0c;但也会看到其他形式&#xff0c;例如 Gr…

Jenkins构建CI/CD

CI/CD 软件开发的连续方法基于自动执行脚本&#xff0c;以最大限度地减少在开发应用程序时引入错误的可能性。从新代码的开发到部署&#xff0c;它们需要较少的人为干预甚至根本不需要干预。 它涉及在每次小迭代中不断构建&#xff0c;测试和部署代码更改&#xff0c;从而减少…

对极约束及其性质 —— 公式详细推导

Title: 对极约束及其性质 —— 公式详细推导 文章目录 前言1. 对极约束 (Epipolar Constraint)2. 坐标转换 (Coordinate Transformations)3. 像素坐标 (Pixel Coordinates)4. 像素坐标转换 (Transformations of Pixel Coordinates)5. 本质矩阵 (Essential Matrix)6. 线坐标 (Co…

单调栈的实现

这是C算法基础-数据结构专栏的第二十四篇文章&#xff0c;专栏详情请见此处。 引入 单调栈就是满足单调性的栈结构&#xff0c;它最经典的应用就是给定一个序列&#xff0c;找出每个数左边离它最近的比它大/小的数。 下面我们就来讲单调栈的实现。 定义 单调栈就是满足单调性…

pycharm破解教程

下载pycharm https://www.jetbrains.com/pycharm/download/other.html 破解网站 https://hardbin.com/ipfs/bafybeih65no5dklpqfe346wyeiak6wzemv5d7z2ya7nssdgwdz4xrmdu6i/ 点击下载破解程序 安装pycharm 自己选择安装路径 安装完成后运行破解程序 等到Done图标出现 选择Ac…

精准设计与高效开发:用六西格玛设计DFSS实现新能源汽车开发突破

快速变化的市场需求和激烈的竞争迫使制造企业不得不持续创新和优化产品开发流程。如何在保证产品质量的前提下&#xff0c;加快产品开发周期&#xff0c;成为许多企业亟待解决的问题。六西格玛中的DFSS&#xff08;Design for Six Sigma&#xff09;模型提供了一种系统的方法&a…

【银河麒麟高级服务器操作系统实例】虚拟化平台系统服务中断现象分析及处理建议

服务器环境以及配置 【机型】虚机 处理器&#xff1a; Kunpeng-920 内存&#xff1a; 40G 【内核版本】 4.19.90-23.8.v2101.ky10.aarch64 【OS镜像版本】 银河麒麟操作系统 Kylin-Server-10-SP1-Release-Build20-20210518-arm64 【第三方软件】 智能运维系统、mysq…

5G移动网络运维实验(训)室解决方案

随着第五代移动通信技术&#xff08;5G&#xff09;的快速普及和工业互联网的迅猛发展&#xff0c;全球制造业正面临着前所未有的深刻变革。5G技术凭借其超高的传输速率、极低的延迟以及大规模的连接能力&#xff0c;为工业自动化、智能制造等领域带来了革命性的技术支持。为了…

Vatee万腾平台:赋能企业,共筑智慧经济新高地

在智慧经济时代的大潮中&#xff0c;企业如何把握机遇&#xff0c;实现转型升级&#xff0c;成为行业内的佼佼者&#xff1f;Vatee万腾平台以其卓越的技术实力、前瞻性的战略眼光和全方位的服务体系&#xff0c;正逐步成为企业数字化转型的坚实后盾&#xff0c;赋能企业&#x…

软考真题之软件设计师的程序语言设计题型(上午题)

目录 编程程序和解释程序 相关习题 函数 编译,解释和翻译阶段 符号表 ​编辑 相关习题 ​编辑 词法分析 语法分析 语义分析 目标代码生成 相关习题 中间代码生成 正规式 相关习题 有限自动机 相关习题 上下文无关文法 相关习题 比较偏的真题 编程程序和解…

Python OpenCV 影像处理:傅立叶转换

►前言 上篇介绍基于计算影像的梯度&#xff0c;通过在影像中找到梯度值的变化来识别边缘。 本篇将介绍傅立叶变换的基本原理&#xff0c;了解傅立叶变换是如何将影像从空间域转换到频率域的&#xff0c;以及为什么这种转换在影像处理过程中是有用的。以及傅立叶变换的实际应…

微服务日常总结

1.当我们在开发中&#xff0c;需要连接多个库时&#xff0c;可以在yml中进行配置。 当在查询的时候&#xff0c;跨库时&#xff0c;需要通过DS 注解来指定&#xff0c;需要yml配置需要保持一致。 2. 当我们想把数据存入到clob类型中&#xff0c;需要再字段 的占位符后面加上j…

微服务--Nacos

一、Nacos简介 Nacos&#xff08;Naming and Configuration Service&#xff09;是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它致力于帮助开发者快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos支持几乎所有主流类型的服…

AFSim 仿真系统----性能工具

什么是 WPR/WPA&#xff1f; Windows 性能记录器 (WPR) 和 Windows 性能分析器 (WPA) 是 Windows 性能工具包中提供的性能监控工具。它们是免费的工具&#xff0c;可以通过下载和安装 Windows 评估和部署工具包 (ADK) 来获得。 WPR 是一个工具&#xff0c;允许用户动态部署事…

【LeetCode】09.回文数

题目要求 解题思路 主要是提防越界问题 代码实现 class Solution { public:bool isPalindrome(int x) {//处理边界if(x<0) return false;long tempx,ret0;while(temp){retret*10temp%10;temp/10;}return xret;} };

线性代数|机器学习-P34神经网络和学习函数

文章目录 1. 神经网络2. 损失函数3. 距离矩阵 1. 神经网络 构建一个神经网络步骤如下&#xff1a; 构建一个神经网络 构造一个学习函数 F ( x , v ) F(x,v) F(x,v),x代表权重 A k , b k A_k,b_k Ak​,bk​&#xff0c;v代表样本特征向量,ReLu激活函数 v 1 R e L u [ F ( A …

Windows安装anaconda注意事项及jupyter notebook更换目录

anaconda的介绍就不罗嗦了&#xff0c;既然准备安装了&#xff0c;说明你已经有所了解了。直入主题&#xff0c;Anaconda官网下载&#xff0c;实在太慢&#xff0c;可到https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/下载&#xff0c;注意&#xff0c;这是清华镜像站…