msOpGen 工具在算子开发过程中可自动生成自定义算子工程,使用户能够聚焦于算子的核心逻辑与算法实现,避免在项目搭建、编译配置等重复性工作上耗费大量时间,从而显著提升开发效率。
本文档基于入门教程中开发的简易加法算子,演示 msOpGen 工具的核心功能,帮助初学者直观体会其在算子开发过程中带来的高效性与便捷性。
本章节以您已完成[object Object]《算子开发工具快速入门》[object Object]的全流程操作为前提;若尚未体验,建议先完成该指南以获得更佳的学习效果。
请严格按照[object Object]《昇腾 AI 算子开发工具链学习环境安装指南》[object Object]完成环境安装与工作区配置。 即使您已具备类似环境,也需按该指南重新执行一遍,以确保所有依赖组件、环境变量等完整且一致。
执行以下命令,若输出"All is OK",则表明所需 Python 包及其版本均满足规范:
算子工程较为复杂且包含大量框架代码,msOpGen 工具可自动生成完整的算子工程框架,使开发者聚焦于核心算法实现,避免在项目搭建、编译配置等重复性工作上耗费时间。先跟着操作体验效果,原理部分可稍后阅读:
创建名为[object Object] 的子目录,作为算子源码根目录:
[object Object]
请将如下配置文件内容保存为文件 msopgen_demo.json:
1. 获取芯片型号并拼接参数
执行以下命令获取芯片SoC类型:[object Object]。
参数 -c:芯片类型,格式为 [object Object]/[object Object],ai_core拼接后的示例为:ai_core-ascend910B4、ai_core-ascend910_9392。
2. 生成 Ascend C 算子工程
执行以下命令,请将 -c 参数替换上节查询的拼接值([object Object]注意[object Object]:其中的减号和下划线不能写错,例如:ai[object Object]_[object Object]core[object Object]-[object Object]ascend910B4):
[object Object]
生成的工程结构看起来很庞大复杂,但我们仅需关注标记为【用户扩展点】的三个C++文件,其余均为框架代码,无特殊需求则无需查看或修改:
[object Object]
按如下修改,代码实现原理请参考代码注释或阅读[object Object]《昇腾Ascend C编程入门教程(纯干货)》[object Object]:
打开生成的 [object Object] 文件,定位并提取包含 [object Object] 的代码行,并保存下来,例如:
按以下方式修改,但需将其中涉及 [object Object] 的代码行替换为上述保存的实际内容(因 SoC 信息随运行环境而异,不可硬编码):
按如下修改,代码实现原理请参考代码注释或阅读[object Object]《昇腾Ascend C编程入门教程(纯干货)》[object Object]:
1. 编译算子
执行构建脚本,成功后将在 build_out 目录下生成 .run 格式的算子部署包:
2. 部署算子
[object Object]
因各平台生成的算子部署包名称略有差异,执行以下脚本以自动定位并运行部署包(在固定环境中,实际等效于执行类似 ./build_out/custom_opp_ubuntu_aarch64.run 的命令):
3. 加入动态库路径
部署成功后,按终端提示追加算子依赖的动态库路径:
执行算子调用工程,验证算子功能(本例执行 1.0 + 2.0,预期结果为 3.0):
[object Object]
若输出如下内容,结果为 3.0,则表明算子已成功加载并计算正确:
若超过 30 秒未返回结果,可能是 NPU 卡繁忙,可按 Ctrl+C 终止后切换至其他空闲卡重试;若出现类似如下错误,可能原因包括:NPU卡异常(硬件故障、驱动问题等),/dev/hisi_hdc 设备异常(如容器内未成功挂载、缺乏访问权限、因线程数过多导致设备无法打开等),以及内存等系统资源不足等。
错误码说明请参见:,
请先解决 NPU 卡故障或更换为其他正常卡后再继续体验(指定 NPU 卡运行的方法详见上文“关于 NPU 设备选择的说明”):
问题原因: 算子部署时没有将 op_api/include/aclnn_add_custom.h 部署到正确的位置,导致找不到头文件。一种可能的原因是环境中存在环境变量 [object Object] 且值不正确,或者存在多个以冒号间隔的路径,但目前部署头文件时只会成功拷贝到第一个路径中,后续路径均未拷贝。
解决方法: 删除环境变量,执行[object Object],重新部署算子。