已关闭
【26.2.0众测】Inductor默认后端(Triton)编译resnet18推理比Eager慢25~79倍:bf16/reduce-overhead/dynamic=False均无法规避 #4832
GMOW创建于  9月15日关闭于  19 天前
GMOW
GMOW
9月15日 创建

标题:【26.2.0众测】Inductor默认后端(Triton)编译resnet18推理比Eager慢25~79倍:bf16/reduce-overhead/dynamic=False均无法规避

建议标签:性能 / inductor / triton

环境信息

项 值
硬件 Atlas 800T A2(Ascend 910B3,64GB HBM)
CANN 9.1.0
PyTorch 2.9.0
torch_npu 2.9.0.post6(TorchNPU 26.1.0 配套)
triton / triton_ascend 3.5.0 / 3.2.2(文档要求的配套版本)
Python 3.11.15
OS Ubuntu 24.04 aarch64

问题描述

使用默认后端 torch.compile(model, backend="inductor")(Triton)编译 TorchBench 清单中的
resnet18 做推理,性能不仅没有提升,反而大幅倒退,且 batch 越大退化越严重:

batch Eager(稳态均值) Compiled(稳态均值) 加速比
8 3.6 ms 90.4 ms 0.04x(慢 25 倍)
32 5.1 ms 357.6 ms 0.01x(慢 70 倍)
64 9.0 ms 713.1 ms 0.01x(慢 79 倍)

计时方式:torch.npu.synchronize() 后对 20 次推理取均值(另附任务书要求的
单次 time.time() 计时:Eager 0.0051s vs Compiled 0.0064s,因首次下发含同步
开销,稳态均值更能反映真实性能)。

复现步骤

import torch
import torch_npu

model = resnet18().npu().eval()      # TorchBench 清单模型
x = torch.randn(8, 3, 224, 224, device="npu")

compiled = torch.compile(model, backend="inductor")   # 默认 Triton
with torch.no_grad():
    compiled(x)   # 触发编译

# 稳态性能
torch.npu.synchronize()
start = time.time()
for _ in range(20):
    with torch.no_grad():
        compiled(x)
torch.npu.synchronize()
print((time.time() - start) / 20)   # ~0.090s,对比 Eager 的 ~0.0036s

已排除的因素

  • 正确性正常:eager vs compiled max diff = 4.47e-08(PASS),非错误结果导致的伪对比
  • 无图断裂:TORCH_LOGS=graph_breaks 下无任何 graph break
  • 首次编译开销:预热充分后再计时(20 次均值)
  • 非首次下发同步:稳态均值已含同步

对照组(同模型同环境)

后端 稳态加速比
Inductor-DVM 1.38x
NPUGraph_EX 1.47x
TorchAir-GE 1.95x
Inductor-Triton(默认) 0.04x

DVM/NPUGraphs/TorchAir 均有收益,唯独默认的 Triton 模式严重倒退,
问题可定位到 Triton-Ascend 生成的 kernel 实现。

已尝试的规避手段(均无效,用户侧无可规避)

尝试 结果
dynamic=False(排除动态 shape 开销) 无改善,仍 0.04x
mode="reduce-overhead"(NPUGraph Tree,消除下发开销) 无改善(90.4ms vs 90.3ms)——说明慢在设备执行而非下发
bf16 autocast(NPU fp16 性能通常更优) 无改善(89.9ms vs 90.3ms);Eager bf16 3.58ms vs fp32 3.40ms 也无收益
对照:Eager fp32 / aclnn 高性能 kernel 3.4ms

版本无关性:在环境预装的官方配套组合 PyTorch 2.7.1 + torch_npu 2.7.1.post8
上复现同样倒退(bs=8 稳态 0.07x),排除 2.9.0 特有回归;两版本线数据见
材料 PR #38 的 补充-测试报告与原始日志/原始日志/(2.7.1)与
torch2.9.0_补充环境/(2.9.0)对照。

结论:慢在 Triton 生成的 kernel 的设备执行时间本身(90ms 随 batch 线性增长,
为真实计算耗时),常规用户侧手段(精度、模式、动态 shape)均无法规避,
必须从 Triton-Ascend 的 kernel 代码生成层解决。

影响

官方文档《Inductor》将 Triton 定位为"默认选择,适用于大多数场景,不确定时首选",
但实测其为所有后端中性能最差(比 Eager 还慢 25~79 倍),新手按文档默认用法
将直接获得负优化,容易对 torch.compile 产生"不仅不加速还变慢"的整体印象。

期望

  1. 排查 Triton-Ascend 3.2.2 在 910B3 上 conv/bn 类算子的代码生成路径
    (疑似生成了未充分优化的通用 kernel,未利用 NPU 高性能实现)
  2. 文档更新:在性能数据出来之前,补充已知性能限制说明,或调整"默认首选"的表述

证明材料

运行结果截图(下图为 PR #38 配套材料中的运行终端输出,可直接点击查看):

Inductor-Triton默认后端:正确性PASS但性能倒退0.04x

提交 issue 时请将上图作为附件上传(截图中含 eager vs compiled 最大差异: 4.470e-08、
稳态均值(20次): Eager: 0.0037s, Compiled: 0.0903s、加速比: 0.04x 完整终端输出)。

完整终端日志:补充-测试报告与原始日志/原始日志/07_Inductor-Triton.log

likedislike
TorchNPU-BotTorchNPU-Bot成员
9月15日 添加了label:triage-review
TorchNPU-Bot
TorchNPU-Bot成员
9月15日 评论:

issue待分派,添加triage-review标签

likedislike
GMOWGMOW
9月15日 修改标题为 “【26.1.0众测】Inductor默认后端(Triton)编译resnet18推理比Eager慢25~79倍:bf16/reduce-overhead/dynamic=False均无法规避”,原标题为“【26.2.0众测】Inductor默认后端(Triton)编译resnet18推理比Eager慢25~79倍:bf16/reduce-overhead/dynamic=False均无法规避”
GMOWGMOW
9月15日 修改了issue 的描述
TorchNPU-BotTorchNPU-Bot成员
9月15日 添加了label:bot-triaged;删除了label:triage-review
TorchNPU-Bot
TorchNPU-Bot成员
9月15日 评论:

检测到当前 issue 已关联 PR,自动添加标签:bot-triaged

likedislike
GMOWGMOW
9月22日 修改标题为 “【26.2.0众测】Inductor默认后端(Triton)编译resnet18推理比Eager慢25~79倍:bf16/reduce-overhead/dynamic=False均无法规避”,原标题为“【26.1.0众测】Inductor默认后端(Triton)编译resnet18推理比Eager慢25~79倍:bf16/reduce-overhead/dynamic=False均无法规避”
GMOWGMOW
9月22日 修改了issue 的描述
TorchNPU-BotTorchNPU-Bot成员
9月22日 添加了label:help-wanted
TorchNPU-Bot
TorchNPU-Bot成员
9月22日 评论:

检测到社区任务相关 issue,自动添加标签:help-wanted

likedislike
GMOWGMOW
9月22日 修改了issue 的描述
GMOWGMOW
9月23日 修改了issue 的描述
GMOWGMOW
9月25日 修改了issue 的描述
ascend-robotascend-robot成员
19 天前 关闭了 issue
ascend-robotascend-robot成员
19 天前 issue状态由 TODO 改变为 DONE
ascend-robotascend-robot成员
19 天前 添加了label:resolved