AutoFuse
Inductor + AutoFuse 在架构上可以实现 E2E Vector 算子自动融合,但按当前公开文档看,不能认为它已经是开箱可用的产品能力。
更准确地说:
- 技术路线可行:PyTorch Inductor 负责从 PyTorch 图中发现可融合的 pointwise、broadcast、reduce 等计算结构;AutoFuse 负责将融合结构落到 Ascend C IR、Schedule、Auto Tiling 和代码生成。
- 当前公开支持有限:CANN AutoFuse 文档已经描述了“对接 PyTorch Inductor”的路线,但同时说明“当前版本不支持该技术路线”。
- **昇腾 PyTorch 当前推荐路径不是
backend="inductor"**:TorchAir 文档说明,昇腾 NPU 暂不支持torch.compile默认的inductorbackend,需要通过torchair.get_npu_backend()获取 NPU backend。
因此,如果问题是“现在能不能直接用 Inductor + AutoFuse 跑通端到端 Vector 算子自动融合”,答案是:公开版本下暂不能直接开箱使用。
如果问题是“这条路线能不能设计实现”,答案是:可以,而且是合理的工程方向。
技术定位
Inductor 和 AutoFuse 的分工可以理解为:
1 | PyTorch Program |
其中:
- Inductor 更偏前端和中端:图捕获、算子分解、循环级 IR、fusion group、索引化简、维度折叠、循环顺序优化。
- AutoFuse 更偏 NPU 后端:自动确定融合范围、生成融合 kernel 源码、Auto Tiling、生成 Host/Device 交付件。
- Vector 算子融合 的核心收益来自减少中间 Tensor 落 GM、减少 MTE 搬运、降低小算子 launch 和调度开销。
公开 PyTorch 文档中提到,Inductor 会把 AOTAutograd 产生的 ATen/Prim 图进一步 lowering 到 loop-level IR,并创建 fusion group、做索引化简、维度折叠和循环顺序调优。CANN AutoFuse 文档则说明 AutoFuse 基于 Ascend C,支持自动融合范围识别、自动算子代码生成、Auto Tiling、动态 shape 和混合精度等能力。
当前边界
当前需要重点区分三种情况。
第一,AutoFuse 本身支持自动融合。
CANN AutoFuse 当前公开文档中说明,AutoFuse 支持的融合大类包括:
- Elemwise
- Broadcast
- Reduce
- Concat
其中 Elemwise 和 Broadcast 在开启 AutoFuse 后默认使能;Reduce 和 Concat 需要通过环境变量显式开启。
示例:
1 | export AUTOFUSE_FLAGS="--enable_autofuse=true;--autofuse_enable_pass=reduce,concat" |
第二,AutoFuse 的 Inductor 路线目前未公开支持。
CANN 9.0.0-beta.2 AutoFuse 文档中明确提到存在两条技术路线:
1 | PyTorch Inductor -> Inductor IR 融合结构 -> Ascend C IR 图 -> Codegen |
但同一段文档也说明:当前版本不支持该技术路线。
这意味着,虽然“Inductor + AutoFuse”是官方文档中描述过的方向,但在当前公开版本里不能作为可用能力依赖。
第三,昇腾 PyTorch 图模式当前走 TorchAir backend,而不是 Inductor backend。
TorchAir 文档中的示例是:
1 | import torch |
文档同时说明 torch.compile 默认的 backend="inductor" 在昇腾 NPU 上暂不支持。因此,当前 PyTorch on Ascend 的图模式主路径是 TorchAir/GE,而不是原生 Inductor 后端。
可实现方案
如果要真正实现 “Inductor + AutoFuse E2E Vector 算子自动融合”,需要补齐一条编译链路。
核心工作包括:
1 | 1. TorchDynamo 捕获 PyTorch 前向图 |
推荐从以下算子模式开始:
1 | Pointwise 链: |
初期不建议一开始覆盖复杂动态控制流、复杂 view、scatter/gather、不规则索引、原地写和别名复杂的训练图。
关键难点
实现难点不在于单个算子,而在于 IR 语义对齐和运行时闭环。
主要挑战如下。
IR 映射
Inductor IR 是 loop-level 表达,关注 loop、index、buffer、stride、shape symbol。AutoFuse/AscIR 需要表达 Ascend C API、搬运、UB、Vector 计算、tiling 结构。两者之间需要稳定的 lowering 规则。
1 | Inductor Pointwise/Reduction |
Shape 和 stride 语义
PyTorch Tensor 支持复杂 stride、view、expand、slice 和非连续内存。Vector 融合要么支持这些 stride 语义,要么提前 materialize 或回退。
融合收益判断
不是融合越多越好。需要考虑:
- UB 容量
- 重计算代价
- 中间结果复用次数
- MTE 搬运量
- shape 大小
- reduce 轴位置
- broadcast 扩展方式
- kernel launch 开销
- 编译时间
动态 shape
AutoFuse 文档中提到其支持动态 shape,但 E2E PyTorch 动态 shape 还需要 Inductor symbolic shape、guard、cache 和 AutoFuse tiling 之间协同。否则容易出现频繁重编译或错误复用。
训练场景
训练场景除了 forward,还涉及 backward 图、梯度累积、view replay、alias、mutation、optimizer。建议先做 inference,再逐步扩展到 training。
工程判断
可以把结论压缩成一句话:
Inductor + AutoFuse 是实现 E2E Vector 算子自动融合的合理架构,但当前公开版本下更像是待补齐的技术路线,而不是已可直接使用的产品功能。
如果目标是当前落地:
- PyTorch on Ascend 当前应优先使用 TorchAir backend。
- AutoFuse 当前可通过 CANN 支持的图编译路径使用,但不等同于 Inductor 路线。
- 如果要自研 Inductor + AutoFuse,需要实现 Inductor IR 到 Ascend C IR 的 bridge、runtime wrapper、fallback 和验证体系。
如果目标是做编译器架构演进:
- Inductor 负责图捕获与融合发现。
- AutoFuse 负责 NPU 亲和的 Schedule、Tiling 和 Codegen。
- 二者结合可以形成比较理想的 PyTorch E2E 自动融合路径。
参考资料
- PyTorch 2.x 文档:Inductor backend、loop-level IR、fusion group 和硬件后端集成说明
https://docs.pytorch.org/get-started/pytorch-2.0/ - CANN AutoFuse 简介:AutoFuse 基于 Ascend C,支持自动融合范围识别、代码生成、Auto Tiling 等能力
https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/900beta2/graph/graphdevg/autofuse_1_0000.html - CANN AutoFuse 使能方式:支持 Elemwise、Broadcast、Reduce、Concat 融合能力及环境变量配置
https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/900beta2/graph/graphdevg/autofuse_1_0004.html - Ascend Extension for PyTorch TorchAir 图模式指南:
torch.compile使用 NPU backend,NPU 暂不支持默认inductorbackend
https://www.hiascend.com/doc_center/source/zh/Pytorch/600/modthirdparty/torchairuseguide/Ascend%20Extension%20for%20PyTorch%206.0.0%20%E5%9B%BE%E6%A8%A1%E5%BC%8F%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97%EF%BC%88TorchAir%EF%BC%8901.pdf