文件最后提交记录最后更新时间
add example Co-authored-by: DaiFu<daifu2@huawei.com> # message auto-generated for no-merge-commit merge: !4764 merge 2604example into master add example Created-by: daifu1234567 Commit-by: DaiFu Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> # 【合入来源】 > <font color="red">**如有社区issue,请关联issue链接**</font>\ > <font color="red">**请勿携带内部流程信息(需求链接、问题单、内部issue等)**</font> - [x] 需求 - [ ] 问题单 - [ ] issue/工单 - [ ] 重构优化 - [ ] 资料更新 # 【修改方案】 > 请描述修改内容的具体实现,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列\ > 如果是需求或者重构类的PR,需要补充详细设计文档(说明上下游组件关系、时序图、类图、DFX能力等内容) 新增extension样例 # 【资料变更】 > 请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写“不涉及” 不涉及 # 【接口变更】 > 请确认是否涉及跨代码仓或者客户面可见的接口变更。如涉及,需要详细说明接口以及对应的变更内容,同时需要在资料中体现。如不涉及,需填写“不涉及” 不涉及 # 【功能验证】 > 说明测试场景,测试方法。如果本次测试方式与常规单元测试不同,请详细说明您的测试步骤\ > 新增/变更内容是否已新增/适配UT测试用例看护,并补充测试自验证截图 已本地验证 base: ![image.png](https://raw.gitcode.com/user-images/assets/7403085/8438d914-be5c-4532-b102-27abe88d0df2/image.png 'image.png') cpp_extension_full: module: ![image.png](https://raw.gitcode.com/user-images/assets/7403085/8831ad74-e587-491a-ad8e-22bd66d1477d/image.png 'image.png') torch_lib_impl: ![image.png](https://raw.gitcode.com/user-images/assets/7403085/f792b5bb-9316-46d6-8ee3-3abeb3d714c4/image.png 'image.png') # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [x] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/op-plugin!47641 个月前
add example Co-authored-by: DaiFu<daifu2@huawei.com> # message auto-generated for no-merge-commit merge: !4764 merge 2604example into master add example Created-by: daifu1234567 Commit-by: DaiFu Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> # 【合入来源】 > <font color="red">**如有社区issue,请关联issue链接**</font>\ > <font color="red">**请勿携带内部流程信息(需求链接、问题单、内部issue等)**</font> - [x] 需求 - [ ] 问题单 - [ ] issue/工单 - [ ] 重构优化 - [ ] 资料更新 # 【修改方案】 > 请描述修改内容的具体实现,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列\ > 如果是需求或者重构类的PR,需要补充详细设计文档(说明上下游组件关系、时序图、类图、DFX能力等内容) 新增extension样例 # 【资料变更】 > 请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写“不涉及” 不涉及 # 【接口变更】 > 请确认是否涉及跨代码仓或者客户面可见的接口变更。如涉及,需要详细说明接口以及对应的变更内容,同时需要在资料中体现。如不涉及,需填写“不涉及” 不涉及 # 【功能验证】 > 说明测试场景,测试方法。如果本次测试方式与常规单元测试不同,请详细说明您的测试步骤\ > 新增/变更内容是否已新增/适配UT测试用例看护,并补充测试自验证截图 已本地验证 base: ![image.png](https://raw.gitcode.com/user-images/assets/7403085/8438d914-be5c-4532-b102-27abe88d0df2/image.png 'image.png') cpp_extension_full: module: ![image.png](https://raw.gitcode.com/user-images/assets/7403085/8831ad74-e587-491a-ad8e-22bd66d1477d/image.png 'image.png') torch_lib_impl: ![image.png](https://raw.gitcode.com/user-images/assets/7403085/f792b5bb-9316-46d6-8ee3-3abeb3d714c4/image.png 'image.png') # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [x] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/op-plugin!47641 个月前
add example Co-authored-by: DaiFu<daifu2@huawei.com> # message auto-generated for no-merge-commit merge: !4764 merge 2604example into master add example Created-by: daifu1234567 Commit-by: DaiFu Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> # 【合入来源】 > <font color="red">**如有社区issue,请关联issue链接**</font>\ > <font color="red">**请勿携带内部流程信息(需求链接、问题单、内部issue等)**</font> - [x] 需求 - [ ] 问题单 - [ ] issue/工单 - [ ] 重构优化 - [ ] 资料更新 # 【修改方案】 > 请描述修改内容的具体实现,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列\ > 如果是需求或者重构类的PR,需要补充详细设计文档(说明上下游组件关系、时序图、类图、DFX能力等内容) 新增extension样例 # 【资料变更】 > 请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写“不涉及” 不涉及 # 【接口变更】 > 请确认是否涉及跨代码仓或者客户面可见的接口变更。如涉及,需要详细说明接口以及对应的变更内容,同时需要在资料中体现。如不涉及,需填写“不涉及” 不涉及 # 【功能验证】 > 说明测试场景,测试方法。如果本次测试方式与常规单元测试不同,请详细说明您的测试步骤\ > 新增/变更内容是否已新增/适配UT测试用例看护,并补充测试自验证截图 已本地验证 base: ![image.png](https://raw.gitcode.com/user-images/assets/7403085/8438d914-be5c-4532-b102-27abe88d0df2/image.png 'image.png') cpp_extension_full: module: ![image.png](https://raw.gitcode.com/user-images/assets/7403085/8831ad74-e587-491a-ad8e-22bd66d1477d/image.png 'image.png') torch_lib_impl: ![image.png](https://raw.gitcode.com/user-images/assets/7403085/f792b5bb-9316-46d6-8ee3-3abeb3d714c4/image.png 'image.png') # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [x] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/op-plugin!47641 个月前
modify document Co-authored-by: l60114168<liuyaxiong6@h-partners.com> # message auto-generated for no-merge-commit merge: !5085 merge master into master modify document Created-by: lyx324521 Commit-by: l60114168 Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> # 【合入来源】 > <font color="red">**如有社区issue,请关联issue链接**</font>\ > <font color="red">**请勿携带内部流程信息(需求链接、问题单、内部issue等)**</font> - [ ] 需求 - [ ] 问题单 - [x] issue/工单https://gitcode.com/Ascend/pytorch/issues/1880 - [ ] 重构优化 - [x] 资料更新 # 【修改方案】 AIDD扫描修改 # 【资料变更】 涉及 # 【接口变更】 不涉及 # 【功能验证】 > 说明测试场景,测试方法。如果本次测试方式与常规单元测试不同,请详细说明您的测试步骤\ > 新增/变更内容是否已新增/适配UT测试用例看护,并补充测试自验证截图 # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [x] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/op-plugin!508517 天前
add example Co-authored-by: DaiFu<daifu2@huawei.com> # message auto-generated for no-merge-commit merge: !4764 merge 2604example into master add example Created-by: daifu1234567 Commit-by: DaiFu Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> # 【合入来源】 > <font color="red">**如有社区issue,请关联issue链接**</font>\ > <font color="red">**请勿携带内部流程信息(需求链接、问题单、内部issue等)**</font> - [x] 需求 - [ ] 问题单 - [ ] issue/工单 - [ ] 重构优化 - [ ] 资料更新 # 【修改方案】 > 请描述修改内容的具体实现,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列\ > 如果是需求或者重构类的PR,需要补充详细设计文档(说明上下游组件关系、时序图、类图、DFX能力等内容) 新增extension样例 # 【资料变更】 > 请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写“不涉及” 不涉及 # 【接口变更】 > 请确认是否涉及跨代码仓或者客户面可见的接口变更。如涉及,需要详细说明接口以及对应的变更内容,同时需要在资料中体现。如不涉及,需填写“不涉及” 不涉及 # 【功能验证】 > 说明测试场景,测试方法。如果本次测试方式与常规单元测试不同,请详细说明您的测试步骤\ > 新增/变更内容是否已新增/适配UT测试用例看护,并补充测试自验证截图 已本地验证 base: ![image.png](https://raw.gitcode.com/user-images/assets/7403085/8438d914-be5c-4532-b102-27abe88d0df2/image.png 'image.png') cpp_extension_full: module: ![image.png](https://raw.gitcode.com/user-images/assets/7403085/8831ad74-e587-491a-ad8e-22bd66d1477d/image.png 'image.png') torch_lib_impl: ![image.png](https://raw.gitcode.com/user-images/assets/7403085/f792b5bb-9316-46d6-8ee3-3abeb3d714c4/image.png 'image.png') # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [x] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/op-plugin!47641 个月前
add example Co-authored-by: DaiFu<daifu2@huawei.com> # message auto-generated for no-merge-commit merge: !4764 merge 2604example into master add example Created-by: daifu1234567 Commit-by: DaiFu Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> # 【合入来源】 > <font color="red">**如有社区issue,请关联issue链接**</font>\ > <font color="red">**请勿携带内部流程信息(需求链接、问题单、内部issue等)**</font> - [x] 需求 - [ ] 问题单 - [ ] issue/工单 - [ ] 重构优化 - [ ] 资料更新 # 【修改方案】 > 请描述修改内容的具体实现,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列\ > 如果是需求或者重构类的PR,需要补充详细设计文档(说明上下游组件关系、时序图、类图、DFX能力等内容) 新增extension样例 # 【资料变更】 > 请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写“不涉及” 不涉及 # 【接口变更】 > 请确认是否涉及跨代码仓或者客户面可见的接口变更。如涉及,需要详细说明接口以及对应的变更内容,同时需要在资料中体现。如不涉及,需填写“不涉及” 不涉及 # 【功能验证】 > 说明测试场景,测试方法。如果本次测试方式与常规单元测试不同,请详细说明您的测试步骤\ > 新增/变更内容是否已新增/适配UT测试用例看护,并补充测试自验证截图 已本地验证 base: ![image.png](https://raw.gitcode.com/user-images/assets/7403085/8438d914-be5c-4532-b102-27abe88d0df2/image.png 'image.png') cpp_extension_full: module: ![image.png](https://raw.gitcode.com/user-images/assets/7403085/8831ad74-e587-491a-ad8e-22bd66d1477d/image.png 'image.png') torch_lib_impl: ![image.png](https://raw.gitcode.com/user-images/assets/7403085/f792b5bb-9316-46d6-8ee3-3abeb3d714c4/image.png 'image.png') # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [x] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/op-plugin!47641 个月前
README.md

适配开发及调用(完整样例-module)

基于C++ extensions方式,通过torch_npu来调用单算子API的适配开发过程,其中前反向绑定通过Python类的forwardbackward注册实现。

算子适配开发

前提条件

在开始之前,请确保您已完成以下环境的安装。

  1. 请参考《CANN 软件安装》(商用版)或《CANN 软件安装》(社区版),安装NPU驱动固件和CANN软件(Toolkit、ops和NNAL)。
  2. 请参考《Ascend Extension for PyTorch 软件安装指南》完成PyTorch框架的安装。

适配文件结构

├── build_and_run.sh                // 自定义算子wheel包编译安装并执行用例的脚本
├── csrc                            // 算子适配层C++代码目录
│   └── add_custom.cpp              // 自定义算子正反向适配代码、ATen IR注册以及绑定
├── cpp_extension_full              // 自定义算子包python侧代码
│   ├── ops.py                      // 定义ops调用
│   └── __init__.py                 // python初始化文件
├── setup.py                        // wheel包编译文件
└── test                            // 测试用例目录
    └── test_add_custom.py          // 执行算子用例脚本

操作步骤

  1. 在算子适配层C++代码目录(csrc)中的add_custom.cpp完成C++侧算子代码适配、注册自定义算子schema及绑定具体实现。PyTorch提供TORCH_LIBRARY宏来定义新的命名空间,并在该命名空间里注册schema。注意命名空间的名字必须是唯一的。具体示例如下:

    Note

    多卡场景必须在适配代码中加const c10::OptionalDeviceGuard device_guard(device_of(Tensor))保障跨device访问。

        // 为NPU设备注册前向实现
        at::Tensor add_custom_impl_npu(const at::Tensor& self, const at::Tensor& other)
        {
            const c10::OptionalDeviceGuard device_guard(device_of(self));
            // 创建输出内存
            at::Tensor result = at::empty_like(self);
    
            at::Scalar alpha = 1.0;
    
            // 调用aclnn接口计算
            EXEC_NPU_CMD_EXT(aclnnAdd, self, other, alpha, result);
            return result;
        }
    
        // 为NPU设备注册反向实现
        std::tuple<at::Tensor, at::Tensor> add_custom_backward_impl_npu(const at::Tensor& grad)
        {
            const c10::OptionalDeviceGuard device_guard(device_of(grad));
            at::Tensor result = grad; // 创建输出内存
    
            return {result, result};
        }
    
        // 为Meta设备注册前向实现
        at::Tensor add_custom_impl_meta(const at::Tensor& self, const at::Tensor& other)
        {
            return at::empty_like(self);
        }
    
        // 为Meta设备注册反向实现
        std::tuple<at::Tensor, at::Tensor> add_custom_backward_impl_meta(const at::Tensor& self)
        {
            auto result = at::empty_like(self);
            return std::make_tuple(result, result);
        }
    
        // 为NPU设备注册前反向实现
        // NPU设备在pytorch 2.1及以上版本使用的设备名称是PrivateUse1,在2.1以下版本用的是XLA,如果是2.1以下版本PrivateUse1需要改成XLA
        TORCH_LIBRARY_IMPL(cpp_extension_full, PrivateUse1, m) {
            m.impl("add_custom", &add_custom_impl_npu);
            m.impl("add_custom_backward", &add_custom_backward_impl_npu);
        }
    
        // 为Meta设备注册前反向实现
        TORCH_LIBRARY_IMPL(cpp_extension_full, Meta, m) {
            m.impl("add_custom", &add_custom_impl_meta);
            m.impl("add_custom_backward", &add_custom_backward_impl_meta);
        }
    
        TORCH_LIBRARY(cpp_extension_full, m) {
            m.def("add_custom(Tensor self, Tensor other) -> Tensor");
            m.def("add_custom_backward(Tensor self) -> (Tensor, Tensor)");
        }
    
    
  2. cpp_extension_full目录下的__init__.pyops.py文件中,添加ops调用及读取so文件,具体示例如下:

    # __init__.py
    __all__ = ['ops', 'add_custom', 'add_custom_backward']
    from .ops import add_custom, add_custom_backward
    import pathlib
    import torch
    # Load the custom operator library
    def _load_opextension_so():
        so_dir = pathlib.Path(__file__).parents[0]
        so_files = list(so_dir.glob('custom_ops_lib*.so'))
        if not so_files:
            raise FileNotFoundError(f"not find custom_ops_lib*.so in {so_dir}")
        atb_so_path = str(so_files[0])
        torch.ops.load_library(atb_so_path)
    _load_opextension_so()
    
    # ops.py
    import torch
    def add_custom(self, other):
        return torch.ops.cpp_extension_full.add_custom(self, other)
    def add_custom_backward(grad):
        return torch.ops.cpp_extension_full.add_custom_backward(grad)
    
  3. 在测试脚本test_add_custom.py中实现前反向绑定,可通过Python中的forwardbackward定义算子的前向计算与反向梯度计算逻辑。具体示例如下:

    class AddCustomFunction(torch.autograd.Function):
        @staticmethod
        def forward(ctx, x, y):
            # 保存梯度计算需要的tensor
            ctx.save_for_backward(x, y)
            # 执行前向计算
            return torch.ops.cpp_extension_full.add_custom(x, y)
        
        @staticmethod
        def backward(ctx, grad_output):
            # 获取保存的tensor
            x, y = ctx.saved_tensors
            return torch.ops.cpp_extension_full.add_custom_backward(grad_output)
    

调用样例

完成了算子适配开发后,即可通过C++ extensions的方式调用自定义算子。

  1. 完成自定义算子工程创建、算子开发及编译部署流程,具体可参考《CANN Ascend C算子开发指南》。

  2. 下载示例代码。

    # 下载样例代码
    git clone https://gitcode.com/Ascend/op-plugin
    # 进入代码目录
    cd examples/cpp_extension_full/module
    
  3. 完成算子适配,具体可参考算子适配开发

  4. 执行如下命令,完成编译、安装、测试。

    bash build_and_run.sh
    

    得到结果如下即为执行成功。

    Ran xx tests in xx s
    OK