文件最后提交记录最后更新时间
feat: 静态shape算子类aclgraph接入 Co-authored-by: Ekoxier<husizhe@huawei.com> Co-authored-by: yuht9<yuhaitao6@huawei.com> Co-authored-by: tjj<tongjinjian@huawei.com> # message auto-generated for no-merge-commit merge: !563 merge develop_debug1 into develop feat: 静态shape算子类aclgraph接入 Created-by: coconut_tree Commit-by: Ekoxier;yuht9;tjj Merged-by: cann-robot Description: # Pull Request ## 描述 增加静态shape算子类aclgraph接入 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 1、在custom_op 的sample 中去掉 custom_op.parameter_map["compile_dynamic_mode"].b = True 配置,然后运行sample 2、在dump图中查看对应自定义算子的shape 3、在日志中查看是否进入到davinic_model 中 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/ge!5632 个月前
【PR】: torch方式自定义入图 Co-authored-by: wuzhengzhen<wuzhengzhen@huawei.com> # message auto-generated for no-merge-commit merge: !867 merge torch_ge_add_custom into develop 【PR】: torch方式自定义入图 Created-by: wuzhengzhen Commit-by: wuzhengzhen Merged-by: cann-robot Description: # Pull Request ## 描述 请清晰准确地描述本次 Pull Request 的意图和变更内容。 本样例展示了如何使用PyTorch的torch.library机制注册自定义算子,并通过<<<>>>内核调用符调用核函数,以简单的Add算子为例,实现两个向量的逐元素相加。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1.在本样例根ascendc_add_custom目录下执行如下步骤,运行该样例。 2. mkdir -p build; cd build 3. cmake ..; make -j 4. python3 ../script/add_custom_test.py 5. 屏幕上若显示:Ran 1 test in **s 则表示用例执行成功。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/ge!8672 个月前
【PR】: torch方式自定义入图 Co-authored-by: wuzhengzhen<wuzhengzhen@huawei.com> # message auto-generated for no-merge-commit merge: !867 merge torch_ge_add_custom into develop 【PR】: torch方式自定义入图 Created-by: wuzhengzhen Commit-by: wuzhengzhen Merged-by: cann-robot Description: # Pull Request ## 描述 请清晰准确地描述本次 Pull Request 的意图和变更内容。 本样例展示了如何使用PyTorch的torch.library机制注册自定义算子,并通过<<<>>>内核调用符调用核函数,以简单的Add算子为例,实现两个向量的逐元素相加。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1.在本样例根ascendc_add_custom目录下执行如下步骤,运行该样例。 2. mkdir -p build; cd build 3. cmake ..; make -j 4. python3 ../script/add_custom_test.py 5. 屏幕上若显示:Ran 1 test in **s 则表示用例执行成功。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/ge!8672 个月前
feat: 自定义算子Compile&Serialize Sample Co-authored-by: Ekoxier<husizhe@huawei.com> # message auto-generated for no-merge-commit merge: !1775 merge hsz_custom_2.2_sample_only into develop feat: 自定义算子Compile&Serialize Sample Created-by: Ekoxier Commit-by: Ekoxier Merged-by: cann-robot Description: # Pull Request ## 描述 自定义算子阶段2.2 Sample新增&&修改 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [x] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 根据Sample README操作 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/ge!177524 天前
README.md

Ascend C 算子通过 TorchAir 入图样例

样例概述

  • 构图入口:PyTorch + TorchAir
  • 算子编成语言:Ascend C
  • 编译方式:预编译/直接调用
  • 模型下沉能力:不涉及
  • 核心链路:Ascend C kernel -> GE 交付件 -> TorchAir 入图 -> 图模式执行
  • 与其他 sample 的区别:本样例聚焦 PyTorch + TorchAir 场景,不涉及 ATC离线编译 -> om离线模型 模型下沉,也不涉及 Triton kernel。

本样例展示如何注册 Ascend C 自定义算子,并通过 TorchAir 将算子接入 GE 图。样例以 Add 算子为例,交付件侧通过 EagerExecuteOp 完成 GE 入图执行,Python 侧同时覆盖 eager 调用和图模式编译调用。

适用场景

  • 想看 PyTorch + TorchAir 场景下 Ascend C 自定义算子的最小入图链路。
  • 想参考 TORCH_LIBRARY 注册、自定义 converter 和 GE 自定义算子之间的配合方式。
  • 想验证 Ascend C kernel 在 eager 和图模式下的数值结果。

前置依赖

CANN

框架与插件

  • 已安装 PyTorchtorch_npuTorchAir
  • TorchAir 依赖的 Python 版本需满足其发布要求。

参考:

环境变量

  • ASCEND_HOME_PATH
  • LD_LIBRARY_PATH 等 CANN 运行时相关变量

额外依赖

pip3 install expecttest

快速运行

examples/custom_op/ascendc_add_custom 目录下执行:

推荐方式

mkdir -p build
cd build
cmake ..
make -j"$(nproc)"
export ASCEND_CUSTOM_OPP_PATH="$(pwd):$ASCEND_CUSTOM_OPP_PATH"
python3 ../script/add_custom_test.py

若终端出现 Ran 1 testOK,表示样例运行成功。

分步方式

  1. 先执行 cmake ..make -j"$(nproc)" 生成 build/libcust_opapi.so
  2. 再执行 export ASCEND_CUSTOM_OPP_PATH="$(pwd):$ASCEND_CUSTOM_OPP_PATH",将 libcust_opapi.so 所在目录加入环境变量。
  3. 最后执行 python3 ../script/add_custom_test.py 运行 eager 和 TorchAir 图模式测试。
  4. 如需执行安装目标,可额外运行 cmake --install build

目录结构与关键文件

ascendc_add_custom
├── CMakeLists.txt
├── README.md
├── add_custom_kernel
│   ├── add_custom.asc        // Ascend C kernel 实现与 PyTorch 注册代码
│   ├── add_custom_kernel.h   // kernel 声明
│   └── custom_op.cpp         // GE 交付件,实现 Execute 入图逻辑
└── script
    └── add_custom_test.py    // Python 测试脚本,覆盖 eager 和图模式

重点文件:

  • add_custom_kernel/add_custom.asc Ascend C Add kernel 的实现文件,同时包含 PyTorch 自定义算子注册逻辑。
  • add_custom_kernel/custom_op.cpp 自定义算子的 GE 交付件,实现 Execute 路径并完成 GE 入图。
  • script/add_custom_test.py Python 测试脚本,覆盖 eager 执行和 TorchAir 图模式编译执行。
  • CMakeLists.txt 编译 libcust_opapi.so 并配置 PyTorch、TorchAir、CANN 依赖。

核心链路

  1. add_custom_kernel/add_custom.asc 中实现 Ascend C Add kernel,并完成 PyTorch 自定义算子注册。
  2. add_custom_kernel/custom_op.cpp 中实现 EagerExecuteOp,将自定义算子注册到 GE。
  3. 通过 script/add_custom_test.py 加载 libcust_opapi.so,在 eager 与 TorchAir 图模式下执行并校验结果。

构建产物

  • build/libcust_opapi.so GE/TorchAir 使用的自定义算子交付件。

结果校验

成功时可观察到:

  • 终端输出包含 Ran 1 test
  • 终端输出包含 OK
  • 测试过程未出现 Numerical values do not match within tolerance 报错。

若失败,优先检查:

  • ASCEND_HOME_PATHLD_LIBRARY_PATH 等环境变量是否正确。
  • torchtorch_npuTorchAir 版本是否匹配。
  • build/libcust_opapi.so 是否已成功生成并可被 Python 脚本加载。
  • 当前环境是否具备可用 NPU,脚本会直接校验 torch.npu.is_available()

注意事项 / 限制

  • 支持的产品:Atlas A2 训练系列产品 / Atlas A2 推理系列产品
  • 样例当前使用 float168 x 2048 输入做结果校验。
  • script/add_custom_test.py 依赖可用 NPU 环境,CPU 环境下无法通过。
  • 本样例展示的是 PyTorch + TorchAir 入图路径,不涉及模型下沉到 om离线模型。

附录

算子规格

项目 内容
算子类型 AddCustom
输入 x, y
输出 z
输入 shape 8 x 2048
输出 shape 8 x 2048
数据类型 float16
格式 ND
kernel 名称 add_custom

算子实现补充

Ascend C Add kernel 的执行过程可概括为三个步骤:

  1. CopyIn:将输入从 Global Memory 搬运到片上 Local Memory。
  2. Compute:对两个 LocalTensor 执行加法运算。
  3. CopyOut:将计算结果搬回输出 Tensor 对应的 Global Memory。

注册机制补充

  • TORCH_LIBRARY_FRAGMENT 用于定义 Python 侧可见的算子签名。
  • TORCH_LIBRARY_IMPL 用于把算子实现绑定到 PrivateUse1XLAMetaDispatchKey
  • script/add_custom_test.py 中的 @torchair.register_fx_node_ge_converter(...) 负责把 PyTorch 节点映射到 GE 自定义算子 AddCustom