香橙派AI Pro算子开发(一)

环境准备

环境准备内容参考博主发布的上一节内容,Ubuntu虚拟机配置MindStudio开发环境
昇腾社区对算子开发介绍的也是很清楚,这一节先从算子设计开始。
在这里插入图片描述

设计算子

这里的算子开发从add算子开发开始,同时昇腾开源了许多的算子,可以在Ascend/Sample仓库获取
此外,在昇腾社区开发者首页也公开了相关的教程:Ascend C算子开发

https://gitee.com/ascend/samples
https://www.hiascend.com/developer/courses/detail/1763490197410181122

这里先克隆对应代码,然后执行对应的bash脚本,这里的bash脚本是一键运行脚本

git clone https://gitee.com/ascend/samples
cd samples/operator/ascendc/tutorials/HelloWorldSample
bash run.sh -v Ascend310B4

在这里插入图片描述
在这里插入图片描述
可以看到helloworld算子正常执行,成功运行,有了这份喜悦,一起来看看代码结构吧

HelloWorldSample/
│-- CMakeLists.txt					//CMake 构建配置文件。
│-- README.md
│-- build/   								//用于存放编译生成的文件的目录
│-- hello_world.cpp
│-- main.cpp
│-- out/									//执行脚本后得到的
│-- output_msg.txt					//执行脚本后得到的
│-- run.sh								//运行程序

这里代码核心为hello_world.cpp和main.cpp两个文件,这里对两个文件进行逐行解读。
hello_world.cpp,算子执行在device上的代码

/**
 * @file hello_world.cpp
 *
 * Copyright (C) 2024. Huawei Technologies Co., Ltd. All rights reserved.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 */
#include "kernel_operator.h"

// 核函数定义,这里hello_world是函数名称,其余都是标准格式
extern "C" __global__ __aicore__ void hello_world()
{
    AscendC::printf("Hello World!!!\n");
}
// 核函数调用
void hello_world_do(uint32_t blockDim, void *stream)
{
//<<< >>>内核调用符
    hello_world<<<blockDim, nullptr, stream>>>();
}

main.cpp,这里是执行在host上的代码

/**
 * @file main.cpp
 *
 * Copyright (C) 2024. Huawei Technologies Co., Ltd. All rights reserved.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 */
#include "acl/acl.h"
extern void hello_world_do(uint32_t coreDim, void *stream);

int32_t main(int argc, char const *argv[])
{
	//AscendCL初始化
    aclInit(nullptr);
    //运行资源申请
    int32_t deviceId = 0;
    aclrtSetDevice(deviceId);
    aclrtStream stream = nullptr;
    aclrtCreateStream(&stream);
	
    constexpr uint32_t blockDim = 8;
    
    // Device数据传输到Host
    // 调用了hello_world_do函数,这里函数是在hello_world.cpp定义了
    hello_world_do(blockDim, stream);
    // 阻塞执行队列,等待执行完毕
    aclrtSynchronizeStream(stream);
	
	//运行资源释放
    aclrtDestroyStream(stream);
    aclrtResetDevice(deviceId);
    aclFinalize();
    //AscendCL去初始化
    return 0;
}

<think>嗯,用户需要知道在香橙AI Pro上把ONNX模型转成OM模型的方法。根据提供的引用,有几个关键点:引用1提到用户自己成功转换过但过程复杂,引用2强调昇腾310芯片和CANN软件栈的重要性,引用3补充了硬件规格,引用4验证了实际部署效果。 用户应该是嵌入式开发者,毕业设计需要板端部署模型。ta的深层需求可能不仅是步骤,更希望避坑——毕竟引用1说环境配置就花了3天。需要重点突出三个易错点:CANN版本冲突、转换参数优化、模型验证。 香橙的OM模型转换依赖华为工具链,核心是Ascend-CANN-toolkit里的atc命令。用户可能不知道:1)必须用特定Python版本(3.7-3.9);2)动态shape配置影响部署性能;3)转换失败时优先检查算子兼容性。 上次回答给的步骤比较简略,这次要补充实操细节:比如用docker避免环境污染(引用2提到容器部署优势),转换失败时查看/var/log/nnpartitioner.log。验证环节特别重要,建议用benchmark工具实测吞吐量——引用4提到9ms推理延迟的案例就是这样测出的。 需要警告模型压缩的副作用:如果原始ONNX有GroupNorm层,压缩后精度可能下降5%。这个在引用里没提,但经验上容易踩雷。 最后生成的问题要引导用户完善场景:模型类型决定是否需要INT8量化,应用场景影响功耗配置。毕竟图像识别和NLP的优化策略不同(引用3提到这两类应用)。 </think>在香橙AI Pro上将ONNX模型转换为OM模型需通过 **华为昇腾CANN工具链** 实现。以下是具体步骤和注意事项: --- ### **转换步骤** 1. **环境准备** - 安装昇腾CANN工具包(推荐 >= 5.0.2 版本) - 确保Python环境为3.7-3.9(CANN兼容版本) - 安装依赖:`pip install onnx-simplifier`(可选,用于优化ONNX模型) 2. **模型转换命令** ```bash atc --model=your_model.onnx \ --framework=5 \ --output=your_model \ # 输出OM文件名 --soc_version=Ascend310B1 \ # 芯片型号必须匹配 --input_format=NCHW \ # 输入数据格式 --input_shape="input:1,3,224,224" \ # 根据模型实际输入调整 --log=error # 日志级别 ``` **关键参数说明**: - `soc_version`:香橙AI Pro搭载昇腾310B1芯片[^3],务必指定 - `dynamic_shape`:若模型支持动态输入,需添加此参数配置范围(如`--dynamic_dims="input:1-10,1-10;..."`)[^2] 3. **验证转换结果** - 检查输出:生成`your_model.om`文件 - 运行推理测试:使用昇腾提供的`benchmark`工具验证性能 ```bash benchmark -om_path=your_model.om -round=20 ``` --- ### **常见问题解决** | 错误类型 | 解决方案 | |---------------------------|--------------------------------------------------------------------------| | **算子不支持** | 更新CANN至最新版;或用`onnx-simplifier`简化模型(`python -m onnxsim input.onnx output.onnx`) | | **输入形状不匹配** | 检查`input_shape`是否与ONNX模型输入致;动态模型需配置`dynamic_shape`参数 | | **内存不足** | 添加`--fusion_switch_file`配置文件,关闭部分算子融合降低内存占用 | --- ### **优化建议** 1. **精度与性能平衡** - 使用`--precision_mode=allow_fp32_to_fp16`开启混合精度加速推理 - 通过`--op_select_implmode=high_performance`启用高性能算子模式 2. **动态Shape支持** 若需处理可变输入(如不同分辨率图像),提前在转换时声明动态维度范围[^2]: ```bash --dynamic_dims="input:1,3,200-500,200-500" # 高度/宽度在200-500间变化 ``` --- ### **相关拓展问题** 1. 如何验证OM模型在香橙上的推理精度? 2. 转换后的OM模型如何集成到C++推理程序中? 3. 昇腾310B1芯片的INT8量化具体操作步骤是什么? > **提示**:香橙AI Pro依赖昇腾310B1的NPU算力(8-20TOPS)[^3],转换前请确认ONNX算子兼容性。推荐在Ubuntu 18.04/20.04的x86主机上完成转换,再部署到板端[^1]。 [^1]: ONNX转OM需配置CANN环境 [^2]: 动态shape优化可提升推理效率 [^3]: 香橙AI Pro搭载昇腾310芯片 [^4]: 实测OM模型推理延迟约毫秒级
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值