Pull Request已成功合入, 合并人@ascend-robot
(感谢 rain-666 的贡献)变更摘要
该 PR 约束了 Welford 归约在 NPU Inductor 中的使用场景,核心思路是在 var_mean_helper_ 中新增 allow_welford 参数,由各调用方根据语义自行决定是否允许走 Welford 路径。具体而言:独立的 aten.var/prims.var 降级时禁止 Welford(allow_welford=False),以避免 Welford 产生的双归约内核导致从 NPU 线性路径回退;aten.var_mean 和 native_layer_norm 则允许 Welford(allow_welford=True)。同时放宽了 Ascend 950 上 native_layer_norm 对 float16/bfloat16 的回退条件:仅当 enable_welford 为 False 时才回退,否则信任 Welford 路径。
主要改动
-
var_mean_helper_新增allow_welford参数:在torch_npu/_inductor/lowering.py中为var_mean_helper_增加allow_welford形参,内部判断逻辑由单一的not npu_config.enable_welford扩展为not allow_welford or not npu_config.enable_welford,使得调用方可以显式禁止 Welford。 -
aten.var/prims.var降级禁止 Welford:var_函数调用var_mean_helper_时传入allow_welford=False,防止独立的方差计算被错误转为 Welford 双归约内核,避免从 NPU 线性路径回退。 -
native_layer_norm低精度回退条件收紧:在 Ascend 950 上对 float16/bfloat16 的强制回退逻辑中新增and not npu_config.enable_welford条件,当用户显式启用 Welford 时不再回退,同时调用var_mean_helper_显式传入allow_welford=True。 -
新增单测
test_welford_does_not_change_standalone_var_codegen:验证enable_welford=True时,独立的torch.var+torch.mean组合不会生成triton_helpers.welford_reduce/triton_helpers.welford(代码。 -
新增单测
test_welford_simd_low_precision_codegen:验证在 float16/bfloat16 低精度且enable_welford=True时,layer_norm可正确生成 SIMD 风格的 Welford 代码(包含vectorized_welford_axis和npu_kernel_type: simd)。




【合入来源】
【修改方案】
【资料变更】
【接口变更】
【功能验证】
【CheckList】