Ascend for PyTorch 训练营学习笔记第四期
【摘要】 API代码生成 Ascend for PyTorch 训练营(https://www.chaspark.com/#/s/AscendforPyTorch2026?multi=zh) 第四期PyTorch 的 Codegen 的调用全链路:以 torch.add(a, b) 为例,展示一次调用从 Python 到硬件的完整路径:Python 入口 ↓pybind11 C++ 绑定(cod...
API代码生成 Ascend for PyTorch 训练营(https://www.chaspark.com/#/s/AscendforPyTorch2026?multi=zh) 第四期

PyTorch 的 Codegen 的调用全链路:以 torch.add(a, b) 为例,展示一次调用从 Python 到硬件的完整路径:
Python 入口
↓
pybind11 C++ 绑定(codegen 生成)
↓
at::ops::add_Tensor::call(codegen 生成的 dispatcher 入口)
↓
c10::Dispatcher::call(实际调度,codegen 生成)
↓
add_cpu / add_cuda / add_npu(根据设备选中 kernel wrapper)
↓
at::native::add(真正的硬件实现)
↓
AddBackward0(反向节点,codegen 生成)
↓
backward_kernel(真正的反向实现)
Codegen 是"声明即实现"——在 YAML 里声明好算子接口和梯度规则,编译时自动生成所有框架层代码,开发者只需专注写 add_npu 这类底层 Kernel 实现。昇腾适配复用了这套机制。

YAML 配置驱动:算子的"元信息"抽象到两个 YAML 文件里,只需配置,无需手写重复代码:
-
native_functions.yaml:定义算子的正向信息
func:函数签名(入参、返回值)device_check:是否检查输入张量在同一设备structured:是否为结构化算子(可自动生成部分逻辑)dispatch:设备分发映射(CPU、CUDA、NPU 各自对应哪个实现)
-
derivatives.yaml:定义算子的反向梯度规则
- 用公式描述每个输入张量的梯度如何计算(如
self_t + maybe_multiply(other_t, alpha))
- 用公式描述每个输入张量的梯度如何计算(如
开发者只写核心计算逻辑,Python 绑定、C++ API、Autograd 节点等"胶水代码"全部由工具自动生成。

torchnpugen 的定位
- 复用+扩展:在 PyTorch 原生 Codegen 基础上扩展,适配昇腾 NPU。
- 架构层级:模型脚本 → PyTorch API → Binding → Dispatcher → CANN 层(OpCommand / OP_API / ACL_OP) → 昇腾硬件。
- 编译流水线:YAML 配置 + 模板 + torchnpugen 工具 → 自动生成 OpApi 适配代码 → 最终链接到 CANN 的 ACLNN 算子库。
- 与原生社区的差异:YAML 字段定义不同、硬件后端是 NPU 而非 CUDA、API 到底层的调用路径不同、需要版本过滤。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)