Pull Request已成功合入, 合并人@CANN-robot
(感谢 zl_hw 的贡献)变更摘要
本 PR 主要针对 foreach 系列算子测试资产中的三方腿(第三方对比实现)精度口径问题:原三方腿使用 torch._foreach_add / torch._foreach_sub 携带 alpha 参数的 FMA 单次舍入形式,而 NPU 内核实际是先 Muls 再 Add/Sub 的两次舍入,两者对 float64 真值的误差恒满足 1.0000 ULP 关系,导致 cross_check 的 mare 比值被抬到 8.6(阈值 5)而出现假红。改动将三方腿改为 _foreach_mul + _foreach_add/_foreach_sub 两步拼接,与 CPU golden 同口径,避免误报(NPU 相对误差约 1.07e-7,远低于 fp32 判据)。PR 标题还提及为 ScatterList 资料补充 mask 取值范围,但相应文件未附带补丁,此处不作展开。
主要改动
foreach_add_list_inplacegolden 三方腿去融合化:在tests/assets/golden.py中将_ForeachAddListInplaceCompose的单次torch._foreach_add(..., alpha=...)调用拆为先_foreach_mul缩放、再_foreach_add的两步实现,与 CPU golden 的两次舍入口径保持一致foreach_sub_list_inplacegolden 三方腿去融合化:在tests/assets/golden.py中将_ForeachSubListInplaceCompose的单次torch._foreach_sub(..., alpha=...)调用同样拆为_foreach_mul+_foreach_sub两步,消除 FMA 单次舍入与内核两次舍入的精度差异- 消除 cross_check 假红:两步拼接后三方腿与内核误差同向(对 float64 真值恒满足 1.0000 ULP 关系),使 mare 比值回落到阈值 5 以内,同时以注释说明该改动并非内核精度短板,避免后续误判


Thanks for your pull-request.
The full list of commands accepted by me can be found at here.
You can get sig-info at here.
You can self-configure the PR merge rules for this repository. For more details, please refer to Here.
For more, you also can visit HICANN.
PR Approval Progress
✅ Congratulations! All modules have met the lgtm and approve requirements.
Module Approval Details
| module | lgtm status | approve status |
|---|---|---|
| */*/README.md | ✅ 陈娇, 汤平川, 钱泽洪 (3/2) | ✅ 陈娇 (1/1) |
| */*/docs/acl*.md | ✅ 钱泽洪, 陈娇, 汤平川 (3/2) | ✅ 陈娇 (1/1) |
| docs | ✅ 陈娇, 汤平川 (2/2) | ✅ 陈娇 (1/1) |
| foreach | ✅ 汤平川, 钱泽洪 (2/2) | ✅ 钱泽洪, 汤平川 (2/1) |
| optim | ✅ 汤平川, 钱泽洪 (2/2) | ✅ 汤平川, 钱泽洪 (2/1) |
💡 Tip:
- Committer can comment
/approveor/lgtm- Commenting
/approveimplies both code review (lgtm) and intent to merge (approve)
CLA Signature Pass
zl_hw, thanks for your pull request. All authors of the commits have signed the CLA. 👍


/lgtm
/approve


描述
本 PR 包含三组修复,均由 TTK 三方精度比对(cross_check)跑批暴露的红灯定位而来。
1. ForeachAddcmulList / ForeachAddcdivList:补 Div 0 ULP 精度档(内核)
foreach/foreach_utils/op_kernel/arch35/foreach_addc_list_regbase.h中的Div此前未指定DivConfig,落到缺省DivAlgo::INTRINSIC——该档在 dav-3510 上仅保真到 1 ULP。x1与scalars*(x2/x3)几乎相消的点上,该偏差被放大成上千 ULP 的相对误差,cross_check 的 mare 判据因此报红(实测 mare 29.87 > L1 阈值 5.0)DivAlgo::PRECISION_0ULP_FTZ_TRUE后,输出与正确舍入结果逐位相同(0/524288)仓内 20/22 处显式
Div配置均选 0ULP 档,本文件此前漏配;兄弟算子foreach_div_list_inplace已修过同一问题。addcmul 走Mul分支不受影响;ComputeIntPath的整数Div未改。2. LambApplyOptimizerAssign:支持面订正(资料 + host 校验 + UT)
原 README 声明
grad与input3均可小于inputv/inputm并向上广播,但底层Ops::Base广播模板的DoDimensionCollapse不支持对 In0(即grad)做广播:grad为标量时EnsureNotScalar只抬到{1}、不左补 1 对齐输出 rank →The 1 input's dim num is not same with output's dim numgrad与输出同 rank 但某维为 1 →The 1 input's dim index is not same with out, and not 1grad在任意单维广播均被拒;input3支持()/(1,)/(1,1,1)/(4,)/(1,3,4)/(2,1,4),仅 rank 大于输出时不支持改动:
grad/inputv/inputm三者 shape 必须完全相同,仅input3按右对齐 broadcast 规则向inputv对齐」infershape与 tiling 的CheckInplaceShapeConstraint同步改为严格等形,使非法组合在 host 阶段被清晰拒绝,而不是放行后到 tiling 阶段抛E90003OP_LOGE_FOR_INVALID_SHAPE(S)_WITH_REASON,与 tiling 侧口径一致moment_shape_decides_output_shape断言的是旧广播语义,已改为等形;新增grad_smaller_than_moment_is_rejected与input3_broadcast_into_moment_is_accepted3. 三方腿与资料订正(golden / docs)
foreach_add_list_inplace/foreach_sub_list_inplace的三方腿改用两步拼接(_foreach_mul+_foreach_add),不再用alpha=的融合形式。融合形式是一次 FMA 舍入,与 CPU golden 的两步舍入序列不同,两者恒差 1 ULP:实测 107/107 例|NPU−真值| + |三方−真值|精确等于 1.0000 ULP,mare 恒为 1.000。分离后三个种子(0/1/7)各 20/20 全通过。foreach_addcmul_list/foreach_addcdiv_list的 golden 补 e2e 三方腿适配类_TpE2e(TTK 按 torch 重载形参名self/tensor1/tensor2/scalars下发,与 def 注册名x1/x2/x3/scalars不同,直接复用 kernel 腿竞品类会抛UnknownParamError);并标注这两个算子实际不具备 e2e 通路支持——aten::_foreach_addc{mul,div}.Tensor在追踪期即抛Expected scalars to be on CPU,torch.compile建不了图,torchair converter 走不到,需手工给已安装的 torch_npu 补 meta 注册才能跑通,该补丁不在本仓、重装即失效,故不作为已交付通路。maskOptional取值范围,并修正 mask 维度列笔误(0-8 → 1 维);aclnnScatterMin补索引取值范围;op_api_list补 ForeachAddcmul/AddcdivList 的确定性说明。关联的Issue
关联 Issue #5750 —— https://gitcode.com/cann/ops-nn/issues/5750
测试
bash build.sh -u --ops=lamb_apply_optimizer_assign --soc=ascend950→ 14/14 PASSED(含 2 条新增用例)ForeachAddcdivList在 kernel / aclnn / GE 图三条通路上mare = mere = rmse = 1(即与 golden 逐位相同)grad等形 +input3降 rank 用例 PASS;grad标量 /grad含 1 维用例在 host 阶段被拒,报错文案为Parameter grad of op1 has incorrect shape [1]. Reason: grad does not support broadcast and must have exactly the same shape as inputv/inputmforeach_addcdiv_list(1437 例)与lamb_apply_optimizer_assign泛化集回归正在跑批中,结果将补充到本 PR 评论文档更新
optim/lamb_apply_optimizer_assign/README.md:输入/输出 shape 描述与《约束说明》改写index/scatter_list/README.md、index/scatter_list/docs/aclnnScatterList.md:mask 取值范围与维度笔误订正docs/zh/op_api_list.md:补 ForeachAddcmul/AddcdivList 确定性说明类型标签
AI/Agent生成声明