已合并
fix(triton_experimental): rebuild stale-rank store broadcast after r-tree promotion #44955
huyuchao创建于 16 天前
fix(triton_experimental): rebuild stale-rank store broadcast after r-tree promotion #44955
已合并
Pull Request已成功合入, 合并人@ascend-robot
(感谢 huyuchao 的贡献)ascend-robot
16 天前 评论:
16 天前 评论:
atomgit-bot
16 天前 评论:
16 天前 评论:
变更摘要
该 PR 修复 npu_backend=triton_experimental 下全量归约(输出为单个标量)kernel 的编译失败问题。根因是上游 store codegen 追加的 .broadcast_to(<value.shape>) 参数取自 r 树提升(promoted r-tree)之前的 CSE 形状,提升后归约值秩升高(如 [None, None, :] 秩 3),而 store 行的 broadcast 参数与基座 tl.full 仍停留在提升前秩 2,导致 tl.store 两侧秩不匹配(Cannot broadcast, rank mismatch: [1, 1, 1], [1, 1]),典型触发路径为 CausalLM 的 log_softmax + nll_loss(ignore_index)(ElectraForCausalLM / RobertaForCausalLM / XGLMForCausalLM 均受影响)。修复在既有 store 回改函数 _rewrite_reduction_store_shape(torch_npu/_inductor/triton_experimental/codegen/triton.py)内补全分支:当 broadcast 参数个数小于 real_ndim 时重建参数,将 r 槽位置为 1、旧的非 1 参数按序映射到其余槽位,并把基座 tl.full 的 shape 列表补齐到 real_ndim;写入地址、数值与冗余写次数不变,仅修正索引表达式形状元数据,语义严格等价。同时新增回归 UT 覆盖该触发模式。
主要改动
- 修复
_rewrite_reduction_store_shape的陈旧秩分支(torch_npu/_inductor/triton_experimental/codegen/triton.py):当broadcast_to参数个数小于real_ndim时,通过ast.walk(store)定位该调用并重建参数——r 槽强制置 1(常量索引 ⟹ 全量归约 ⟹ r 轴 singleton)、旧的非 1 参数按序填充空闲槽位,从而消除 store 两侧的秩不匹配。 - 补齐基座
tl.full的 shape 列表(同文件):当tl.full首参为ast.List且元素数小于real_ndim时,在头部插入常量 1 将列表补齐到real_ndim,保证 broadcast 输入秩与目标秩一致。 - 防御性 bail 逻辑(同文件):若未找到
broadcast_to调用、参数个数已达real_ndim,或旧非 1 参数数量与空闲槽位数不匹配,均保持原行不改,避免误改写。 - 新增回归测试(
test/_inductor/test_triton_experimental_rtree_store.py):新增TestPromotedRtreeScalarStore测试类,通过_causal_lm_loss(shift +log_softmax+nll_loss(ignore_index))复现双级 r 树提升加标量整数索引 store 的场景,断言编译成功、生成包含triton_experimental标记的 wrapper 代码,并与 eager 结果做数值一致性校验(assert_close)。


atomgit-bot
16 天前 评论:
16 天前 评论:
16 天前 添加了label:ascend-cla/yes
此处折叠了63条消息 查看更多
5 天前 添加了label:ci-pipeline-passed
AtlasAccount
5 天前 评论:
5 天前 评论:
流水线 PR-pipeline_pytorch#64908 [ commitID:21bbfd9d ] 已完成
>>>代码风格自动修复执行成功(无修复内容)
| 阶段 | 任务名 | 状态 | 详情 |
|---|---|---|---|
| 编译构建 | Build_X86 | ✅ | >>> |
| Build_ARM | ✅ | >>> | |
| Build_X86_torchair | 🛑 | >>> | |
| Build_ARM_torchair | 🛑 | >>> | |
| patch_test | 🛑 | >>> | |
| Build_X86_213 | ✅ | >>> | |
| Build_ARM_213 | ✅ | >>> | |
| 恶意代码检查 | Antipoison | ✅ | >>> |
| 编码安全与规范检查 | codecheck_pre-commit | ✅ | >>> |
| check_error | ✅ | >>> | |
| lintrunner | ✅ | >>> | |
| 开源片段检查 | SCA | ✅ | >>> |
| 开发者测试 | UT_ARM_A3_Part_01 | 🛑 | >>> |
| UT_ARM_A3_Part_02 | 🛑 | >>> | |
| UT_ARM_A2_Part_01 | ✅ | >>> | |
| UT_ARM_A2_Part_02 | ✅ | >>> | |
| UT_ARM_A2_Part_03 | ✅ | >>> | |
| UT_inductor_Part_01 | 🛑 | >>> | |
| UT_inductor_Part_02 | 🛑 | >>> | |
| UT_inductor_Part_03 | 🛑 | >>> | |
| UT_inductor_Part_04 | 🛑 | >>> | |
| UT_DIST_ARM_Part_01 | 🛑 | >>> | |
| UT_DIST_ARM_Part_02 | 🛑 | >>> | |
| UT_DIST_ARM_Part_03 | 🛑 | >>> | |
| UT_DIST_ARM_Part_04 | 🛑 | >>> | |
| UT_ARM_A2_Select_Part_01 | ✅ | >>> | |
| UT_ARM_A2_Select_Part_02 | ✅ | >>> | |
| UT_ARM_A2_Part_213 | ✅ | >>> | |
| UT_inductor_Part_213 | 🛑 | >>> | |
| UT_DIST_ARM_Part_213 | 🛑 | >>> | |
| UT_ARM_A2_Select_Part_213 | ✅ | >>> | |
| 流水线 | PR-pipeline_pytorch | ✅ | >>> |
- compile、compile_inductor、compile_torchair : 运行流水线
- retry : 重试流水线所有失败子任务
- retry <任务名> : 仅重试指定失败子任务
- stop : 停止流水线


5 天前 关闭了关联的issue
5 天前 合入了pull request
AtlasAccount
5 天前 评论:
5 天前 评论:
流水线 pytorch_gitcode_PR_multiVersion#14740 [ commitID:21bbfd9d ] 已完成


【合入来源】
【合入来源】
【修改方案】
问题现象:
npu_backend=triton_experimental时,输出为单个标量的全量归约融合 kernel(CausalLM 的log_softmax + nll_loss(ignore_index)路径,典型如triton_unk_fused_clone_nll_loss_forward_slice_view_*)编译失败:HuggingFace runner 的 ElectraForCausalLM / RobertaForCausalLM / XGLMForCausalLM 三模型均因同一 kernel 模板失败。
根因分析(上游 torch/_inductor 与 triton_experimental 的交互):
.broadcast_to(<value.shape>),其中value.shape取自发射时刻 CSE 记录的形状——此刻归约值与索引秩一致(均为 2),代码正确;[None, None, :](秩 3),但 store 行中手动追加的 broadcast_to 参数与基座tl.full仍停留在提升前的秩 2;[1,1,1]vs[XBLOCK,1]直接编译失败。修复内容:在既有的 store 回改函数
_rewrite_reduction_store_shape(torch_npu/_inductor/triton_experimental/codegen/triton.py)内补全分支——当 broadcast_to 参数数小于 real_ndim(陈旧秩)时重建参数:r 槽强制置 1(常量索引 ⟹ 全量归约 ⟹ 值在 r 轴为 singleton,类型上保证)、旧的非 1 参数按序映射到其余槽位、基座tl.full的 shape 列表补齐到 real_ndim。写入地址、数值与冗余写次数均不变,仅修正索引表达式的形状元数据,语义严格等价;参数计数不匹配时保持原行不改(防御性 bail)。【资料变更】
不涉及
【接口变更】
不涉及
【功能验证】
验证环境:Ascend NPU(aarch64)+ torch 2.13.0 + torch_npu(triton_experimental 后端)。
test/_inductor/test_triton_experimental_rtree_store.py,覆盖 CausalLM shift + log_softmax + nll_loss(ignore_index) 触发模式(双级 r 树提升 + 标量整数索引 store)。修复前该 UT 失败,报错与线上三模型完全一致(rank mismatch: [1, 1, 1], [1, 1]);修复后通过(含与 eager 数值一致性断言)。test/_inductor/test_triton_experimental_enable.py13/13 通过,无回归。【CheckList】