Ascend for PyTorch 训练营学习笔记第四期

举报
黄生 发表于 2026/08/02 09:44:37 2026/08/02
【摘要】 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。