From 758c6e6c6b90efa9a99aef2153963fc575f2b66e Mon Sep 17 00:00:00 2001 From: xuzhen Date: Fri, 5 Sep 2025 18:05:19 +0800 Subject: [PATCH] modify custom_program --- .../operation/op_custom_prim.ipynb | 2 +- .../operation/op_customopbuilder.md | 30 +++++++++---------- .../operation/op_customopbuilder_asdsip.md | 2 +- .../operation/op_customopbuilder_atb.md | 4 +-- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/tutorials/source_zh_cn/custom_program/operation/op_custom_prim.ipynb b/tutorials/source_zh_cn/custom_program/operation/op_custom_prim.ipynb index 0ce525b3f5..1fa27933b1 100644 --- a/tutorials/source_zh_cn/custom_program/operation/op_custom_prim.ipynb +++ b/tutorials/source_zh_cn/custom_program/operation/op_custom_prim.ipynb @@ -130,7 +130,7 @@ "id": "809897ac", "metadata": {}, "source": [ - "加上其他环境依赖依赖和算子调用语句,我们获得完整的自定义算子用例如下。" + "加上其他环境依赖和算子调用语句,我们获得完整的自定义算子用例如下。" ] }, { diff --git a/tutorials/source_zh_cn/custom_program/operation/op_customopbuilder.md b/tutorials/source_zh_cn/custom_program/operation/op_customopbuilder.md index 1a41e5ffa7..4cacc6c3d9 100644 --- a/tutorials/source_zh_cn/custom_program/operation/op_customopbuilder.md +++ b/tutorials/source_zh_cn/custom_program/operation/op_customopbuilder.md @@ -6,7 +6,7 @@ 动态图模式下,网络流程更容易调试,可以支持执行单算子、普通函数和网络,以及单独求梯度等操作。 -[基于Custom原语的自定义算子](https://www.mindspore.cn/tutorials/zh-CN/master/custom_program/operation/op_custom_prim.html)虽然可以同时支持静态图和动态图,但是需要定义的内容较多。因此MindSpore针对动态图的自定义算子接入方式做了优化,提供了新的Python API [CustomOpBuilder](https://www.mindspore.cn/docs/zh-CN/master/api_python/ops/mindspore.ops.CustomOpBuilder.html) ,在方便用户使用的同时,还能提升动态图自定义算子的执行性能。 +[基于Custom原语的自定义算子](https://www.mindspore.cn/tutorials/zh-CN/master/custom_program/operation/op_custom_prim.html)虽然可以同时支持静态图和动态图,但是需要定义的内容较多。因此MindSpore针对动态图的自定义算子接入方式做了优化,提供了新的Python API [CustomOpBuilder](https://www.mindspore.cn/docs/zh-CN/master/api_python/ops/mindspore.ops.CustomOpBuilder.html),在方便用户使用的同时,还能提升动态图自定义算子的执行性能。 用户基于[C++接口](https://www.mindspore.cn/tutorials/zh-CN/master/custom_program/operation/cpp_api_for_custom_ops.html)开发算子,需要定义算子函数体,包括推导并构造输出Tensor,调用执行device算子等功能。定义好算子函数体后,通过[pybind11](https://github.com/pybind/pybind11)组件即可将C++函数注册成为Python模块接口。 @@ -33,7 +33,7 @@ MindSpore以Python作为前端,用C++实现后端,每个算子执行时需 ### 算子定义 -在动态图定义自定义算子时,用户需要继承 `ms::pynative::PyboostRunner` 类重写其`CalcWorkspace`和`LaunchKernel`两个虚函数,以支持申请内存和执行算子两阶段调用流程。然后用户需要提供一个算子入口函数,并通过pybind11将C++接口映射到Python作为自定义算子使用。 +在动态图定义自定义算子时,用户需要继承`ms::pynative::PyboostRunner`类重写其`CalcWorkspace`和`LaunchKernel`两个虚函数,以支持申请内存和执行算子两阶段调用流程。然后用户需要提供一个算子入口函数,并通过pybind11将C++接口映射到Python作为自定义算子使用。 ```cpp #include "ms_extension/api.h" @@ -86,8 +86,8 @@ class CustomAdd3 : public ms::pynative::PyboostRunner { using PyboostRunner::PyboostRunner; ``` -- **继承**:`CustomAdd3` 继承自 `PyboostRunner`,这是一个用于支持 MindSpore 动态图多级流水机制的基类。 -- **构造函数**:通过 `using` 关键字直接继承父类的构造函数,简化代码实现。 +- **继承**:`CustomAdd3`继承自`PyboostRunner`,这是一个用于支持MindSpore动态图多级流水机制的基类。 +- **构造函数**:通过`using`关键字直接继承父类的构造函数,简化代码实现。 #### 2. 工作区间大小计算 @@ -98,7 +98,7 @@ size_t CalcWorkspace() override { return inputs()[0].numel() * sizeof(int32_t); ``` - **调用阶段**:此接口在`DeviceTask`执行时被自动调用。 -- **核心功能**:`CalcWorkspace` 用于计算算子执行所需的工作区间大小(这里假设几个输入大小相同),框架根据接口返回结果申请工作区内存。 +- **核心功能**:`CalcWorkspace`用于计算算子执行所需的工作区间大小(这里假设几个输入大小相同),框架根据接口返回结果申请工作区内存。 #### 3. 算子核心逻辑:LaunchKernel @@ -125,13 +125,13 @@ void LaunchKernel() override { - **调用阶段**:此接口在`LaunchTask`执行时被自动调用,执行算子计算逻辑。 - **核心功能**: - - **输入张量获取**:通过 `inputs()` 获取输入张量 `x`、`y`、`z`。 - - **输出张量获取**:通过 `outputs()` 获取输出张量 `out`。 - - **指针操作**:通过 `GetDataPtr()` 获取张量数据的指针,方便进行逐元素的计算。 - - **工作区间操作**:通过 `workspace_ptr()` 获取工作区间的指针,用于临时存储中间结果。 + - **输入张量获取**:通过`inputs()`获取输入张量`x`、`y`、`z`。 + - **输出张量获取**:通过`outputs()`获取输出张量`out`。 + - **指针操作**:通过`GetDataPtr()`获取张量数据的指针,方便进行逐元素的计算。 + - **工作区间操作**:通过`workspace_ptr()`获取工作区间的指针,用于临时存储中间结果。 - **计算逻辑**: - - 第一步:将 `x` 和 `y` 的对应元素相加,结果存储到工作区间 `ws_base_ptr` 中。 - - 第二步:将工作区间结果与 `z` 的对应元素相加,结果存储到输出张量 `out_base_ptr` 中。 + - 第一步:将`x`和`y`的对应元素相加,结果存储到工作区间`ws_base_ptr`中。 + - 第二步:将工作区间结果与`z`的对应元素相加,结果存储到输出张量`out_base_ptr`中。 #### 4. C++算子包装函数 @@ -170,12 +170,12 @@ PYBIND11_MODULE(MS_EXTENSION_NAME, m) { } ``` -- **功能**:通过 `pybind11` 实现 C++ 算子与 Python 接口的绑定。 +- **功能**:通过`pybind11`实现C++算子与Python接口的绑定。 - **实现**: - - 使用 `PYBIND11_MODULE` 定义模块名称。 - - 通过 `m.def` 将 C++ 函数 `pyboost_add3` 绑定为 Python 接口 `add3`。 + - 使用`PYBIND11_MODULE`定义模块名称。 + - 通过`m.def`将C++函数`pyboost_add3`绑定为Python接口`add3`。 -通过以上步骤,我们完成了一个基于 `PyboostRunner` 的自定义算子的定义、实现、绑定。借助 MindSpore 提供的多级流水机制,以及 `pybind11` 的高效接口绑定能力,自定义算子的开发变得更加高效和灵活。 +通过以上步骤,我们完成了一个基于`PyboostRunner`的自定义算子的定义、实现、绑定。借助MindSpore提供的多级流水机制,以及`pybind11`的高效接口绑定能力,自定义算子的开发变得更加高效和灵活。 ### 算子调用 diff --git a/tutorials/source_zh_cn/custom_program/operation/op_customopbuilder_asdsip.md b/tutorials/source_zh_cn/custom_program/operation/op_customopbuilder_asdsip.md index 1079f8a27f..7edf71ee9e 100644 --- a/tutorials/source_zh_cn/custom_program/operation/op_customopbuilder_asdsip.md +++ b/tutorials/source_zh_cn/custom_program/operation/op_customopbuilder_asdsip.md @@ -82,7 +82,7 @@ param.batchSize = batch_size; param.dimType = ms::pynative::asdFft1dDimType::ASCEND_FFT_HORIZONTAL; ``` -### 3. 调用RunAtbOp接口执行算子 +### 3. 调用AsdSipFFTOpRunner接口执行算子 ```cpp ms::pynative::PyboostRunner::Call<1>(npu_fft, input, n, batch_size); diff --git a/tutorials/source_zh_cn/custom_program/operation/op_customopbuilder_atb.md b/tutorials/source_zh_cn/custom_program/operation/op_customopbuilder_atb.md index 7b0bdb3277..82f135a97b 100644 --- a/tutorials/source_zh_cn/custom_program/operation/op_customopbuilder_atb.md +++ b/tutorials/source_zh_cn/custom_program/operation/op_customopbuilder_atb.md @@ -10,7 +10,7 @@ 在 [基于CustomOpBuilder的自定义算子](https://www.mindspore.cn/tutorials/zh-CN/master/custom_program/operation/op_customopbuilder.html) 中,MindSpore提供了 `PyboostRunner` 方便用户在动态图接入自定义算子。现在针对ATB算子,MindSpore又额外提供了一套`AtbOpRunner`用于把ATB算子的调用流程和动态图多级流水封装到一起。 -在完整的[ATB算子的调用流程](https://www.hiascend.com/document/detail/zh/canncommercial/81RC1/developmentguide/acce/ascendtb/ascendtb_0037.html)中,用户需要执行 构造`Param`、创建`Operation`和`Context`、设置`variantPack`(算子输入输出张量)、调用`Setup`、调用`Execute`、销毁`Context`和`Operation` 等流程。但是对于一个算子来说,其`Operation`仅依赖于算子属性(`Param`),其`Context`仅依赖于流(stream),且都是可以复用的,因此MindSpore提供了一个缓存,将这些数据结构放在缓存中,避免多次创建和销毁带来不必要的时间消耗。 +在完整的[ATB算子的调用流程](https://www.hiascend.com/document/detail/zh/canncommercial/81RC1/developmentguide/acce/ascendtb/ascendtb_0037.html)中,用户需要执行构造`Param`、创建`Operation`和`Context`、设置`variantPack`(算子输入输出张量)、调用`Setup`、调用`Execute`、销毁`Context`和`Operation` 等流程。但是对于一个算子来说,其`Operation`仅依赖于算子属性(`Param`),其`Context`仅依赖于流(stream),且都是可以复用的,因此MindSpore提供了一个缓存,将这些数据结构放在缓存中,避免多次创建和销毁带来不必要的时间消耗。 用户基于 [AtbOpRunner类](https://www.mindspore.cn/tutorials/zh-CN/master/custom_program/operation/cpp_api_for_custom_ops.html#class-atboprunner) 对接ATB算子时,仅需要提供相应`Param`的哈希函数(作为缓存`Operation`的键值),并调用`Init`接口初始化(即构造`Operation`),再调用`Run`接口即可执行ATB算子。还可以直接调用 [RunAtbOp](https://www.mindspore.cn/tutorials/zh-CN/master/custom_program/operation/cpp_api_for_custom_ops.html#function-runatbop)函数一键执行(函数内包含了`Init`和`Run`接口的调用)。 @@ -170,4 +170,4 @@ y = my_ops.swiglu(x, -1) print(y) ``` -这里向`CustomOpBuilder`传入了`enable_atb=True`的参数,MindSpore会自动添加与ATB加速库有关的编译和链接选项。用户续保证正确执行了ATB库的`set_env.sh`脚本,环境中有了`ATB_HOME_PATH`环境变量。 +这里向`CustomOpBuilder`传入了`enable_atb=True`的参数,MindSpore会自动添加与ATB加速库有关的编译和链接选项。用户需保证正确执行了ATB库的`set_env.sh`脚本,环境中有了`ATB_HOME_PATH`环境变量。 -- Gitee