Ascend for PyTorch 训练营学习笔记第四期续
【摘要】 API代码生成 Ascend for PyTorch 训练营(https://www.chaspark.com/#/s/AscendforPyTorch2026?multi=zh) 第四期Dispatcher 分发器作用:算子调度的"路由器"。根据输入张量的设备类型、是否需要梯度等信息,动态匹配最合适的后端实现。机制:维护一个按优先级排序的 DispatchKey 列表,依次查表、命中即执行...
API代码生成 Ascend for PyTorch 训练营(https://www.chaspark.com/#/s/AscendforPyTorch2026?multi=zh) 第四期

Dispatcher 分发器
- 作用:算子调度的"路由器"。根据输入张量的设备类型、是否需要梯度等信息,动态匹配最合适的后端实现。
- 机制:维护一个按优先级排序的 DispatchKey 列表,依次查表、命中即执行。
- DispatchKey:
CPU/CUDA/PrivateUse1(第三方硬件,昇腾 NPU 挂在这里)Meta(形状推断)Autograd(自动微分)
- 一次调用的查表链路(以
at::add为例):Functionalize→ torch.compile 功能化层PythonDispatcher→ Python 钩子ADInplaceOrView→ 追踪 inplace/view 操作AutogradCPU→ 构建反向计算图BackendSelect→ 根据输入设备选后端CPU/CUDA/NPU→ 执行具体 Kernel

代码生成 5 步走:
- 主仓入口(
generate_code.sh) - 生成 OpPlugin 配置(
op-plugin/gencode.sh) - 核心后端 stub 生成(
torchnpugen.gen_backend_stubs) - 自动微分(autograd)生成
- 测试与辅助功能生成

核心后端 stub 生成: “NPU 算子如何被 PyTorch 调度”
- 分发键(DispatchKey):NPU 算子统一通过
PrivateUse1这个 dispatch key 分发到昇腾后端。 - 算子注册:用
TORCH_LIBRARY_IMPL宏注册算子- 原生 API(如
add.Tensor)→ 注册到aten命名空间 - 自定义算子(如
npu_linear)→ 注册到npu命名空间
- 原生 API(如
- 生成产物:wrapper 包装函数 + 静态注册代码块,最终产出
RegisterNPU.cpp等文件。 - Python 侧调用:注册后可直接通过
torch.ops.aten.xxx或torch.ops.npu.xxx调用。
torchnpugen 通过解析算子定义,自动生成 wrapper 和注册代码,把昇腾 NPU 算子挂到 PyTorch 的 PrivateUse1 调度体系上,实现"写一次配置,自动生成适配层"。

自动微分(Autograd)代码生成:“NPU 算子自动求导”
核心机制
- 输入:
TorchNPU 自定义 YAML+OpPlugin 算子 YAML - 生成模块:
torchnpugen.autograd.gen_autograd - 依据:
derivatives.yaml(定义算子的导数规则)
生成内容
| 产物 | 说明 |
|---|---|
| 标准调度注册代码 | 基础算子注册 |
| 自定义算子前反向绑定 | 自定义算子的反向传播实现,注册到 AutogradPrivateUse1 dispatch key |
| Functionalize 算子注册 | 将原地修改算子(如 npu_silu_)转为 out-of-place 版本,注册到 Functionalize key,用于图模式 |
| 其他场景 | 量化、嵌套张量等特殊适配 |
代码示例
// 反向算子注册到 AutogradPrivateUse1
TORCH_LIBRARY_IMPL(aten, AutogradPrivateUse1, m) {
m.impl("npu_linear", TORCH_FN(VariableType::npu_linear));
}
// Functionalize:消除 in-place,转为 out-of-place
TORCH_LIBRARY_IMPL(npu, Functionalize, m) {
m.impl("npu_silu_", TORCH_FN(functionalization::npu_silu_));
}
复用 PyTorch 上游 Codegen 能力(原生算子的反向绑定直接复用),只针对 NPU 差异生成"胶水代码",实现轻量化适配、随社区版本平滑演进。
通过解析导数配置,自动生成反向传播绑定和图模式所需的 functionalize 转换代码,让 NPU 算子完整支持自动求导和编译优化。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)