已合并
Add scatter reduce fallback for older CANN #5624
Add scatter reduce fallback for older CANN #5624
已合并
fgd_dragon创建于 19 天前
fgd_dragon
19 天前
# 【合入来源】 - [ ] 需求 - [ ] 问题单 - [ ] issue/工单 - [x] 重构优化 https://gitcode.com/Ascend/op-plugin/issues/289 - [ ] 资料更新 # 【修改方案】 `torch.scatter_reduce` 的 NPU 实现依赖 CANN 9.2.0 新增的 `aclnnScatterReduce` 和 `aclnnInplaceScatterReduce`。CANN 9.2.0 之前缺少相关符号,会导致接口执行失败。 本次为 `scatter_reduce.two`、`scatter_reduce.two_out` 和 `scatter_reduce_.two` 增加兼容处理: - 保留 `sum/add + include_self=True` 场景的 aclop 兼容路径。 - 其他缺少 aclnn 符号的场景回退到 PyTorch CPU 实现。 - CPU 计算完成后将结果写回 NPU Tensor,保持 functional、out 和 inplace 接口语义。 - 增加 CANN 9.2.0 之前的 CPU fallback 测试。 # 【资料变更】 不涉及。 # 【接口变更】 不涉及。 # 【功能验证】 已增加 functional、out 和 inplace 的 CPU fallback 测试,覆盖: ```text fp32 + reduce=sum + include_self=False ``` 已通过 Python 语法检查。 # 【CheckList】 - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR 标题正确使用类型标签 - [ ] CI 流水线执行通过,代码检查无异常
likedislike
Pull Request已成功合入, 合并人@ascend-robot
(感谢 fgd_dragon 的贡献)
Ffgd_dragon
19 天前 创建了 pull request,commit 992588e3
atomgit-bot
atomgit-bot
19 天前 评论:

变更摘要

本PR为 scatter_reduce 系列算子添加了对旧版本CANN(不支持 aclnnScatterReduce / aclnnInplaceScatterReduce)的CPU回退兼容机制。通过在三个算子入口(scatter_reducescatter_reduce_outscatter_reduce_)中插入 DO_COMPATIBILITY 宏,当NPU算子不可用时自动回退到CPU实现完成计算,并将结果拷贝回NPU设备。同时移除了原有的 exec_scatter_reduce 封装函数,将 get_reduceEXEC_NPU_CMD 调用内联至各入口函数中。测试侧移除了此前因CANN版本限制而跳过的用例,新增了针对CANN 9.2.0之前版本的CPU回退专项测试,并简化了部分测试矩阵。

主要改动

  • 新增CPU回退函数: 在 ScatterReduceKernelNpuOpApi.cpp 中新增 scatter_reduce_cpu_fallbackscatter_reduce_out_cpu_fallbackscatter_reduce_inplace_cpu_fallback 三个静态函数,分别处理非in-place输出、out参数输出和in-place场景下的CPU回退逻辑,统一将张量迁移至CPU调用PyTorch原生实现后再拷贝回NPU。
  • 集成兼容性宏调用: 在 scatter_reducescatter_reduce_outscatter_reduce_ 三个入口函数中分别添加 DO_COMPATIBILITY(aclnnScatterReduce, ...)DO_COMPATIBILITY(aclnnInplaceScatterReduce, ...) 宏调用,在CANN不支持对应算子时自动触发CPU回退路径。
  • 移除封装函数并内联调用: 删除原有的 exec_scatter_reduce 封装函数,将 get_reduce 参数转换和 EXEC_NPU_CMD 调用直接内联到各入口函数中,简化函数调用层级。
  • 测试用例适配CANN版本: 移除 test_scatter_reduce_float32_shape_format 上的 @unittest.skip 装饰器,新增 test_scatter_reduce_cpu_fallback_before_cann_920 测试用例(仅在CAN 9.2.0之前版本运行),将原 test_scatter_reduce_float16_shape_format 重命名为 test_scatter_reduce_float32_basic_shape_format 并切换为float32数据类型,同时移除 test_scatter_reduce_invalid_reduce 测试。
likedislike
atomgit-bot
atomgit-bot
19 天前 评论:

代码审查

审查总结

我对此次 PR 的两个变更文件均已完成审查:

op_plugin/ops/opapi/ScatterReduceKernelNpuOpApi.cpp

  • P2 ×1scatter_reduce()scatter_reduce_() 中 sum/add + include_self 路径的 CPU fallback 被 scatter_add 的 DO_COMPATIBILITY 遮蔽——若老版本 CANN 上 scatter_add 也不可用,CPU fallback 永远不可达(line 117-121, 154-158)。

test/test_base_ops/test_scatter_reduce.py

  • P2 ×2test_scatter_reduce_float32_shape_format 测试覆盖大幅缩小(reduce_list 从 10→1,include_self_list 从 [True,False]→[True]);test_scatter_reduce_invalid_reduce 错误路径测试被删除。
  • P3 ×2:确定性测试参数缩小(仍 skip,低影响);CPU fallback 专项测试仅覆盖 include_self=False(可选改进)。

各优先级统计

优先级 数量
P0 0
P1 0
P2 3
P3 2

整体风险判断

本次变更的核心逻辑(添加 CPU fallback 支持老版本 CANN)方向正确,CPU fallback 函数实现本身无明显缺陷。主要风险集中在:

  1. sum/add + include_self 路径的 fallback 链存在结构性遮蔽问题,在极端老版本 CANN 上可能导致该路径报错而非走 CPU fallback;
  2. 测试覆盖范围大幅缩小,多个 reduce 类型和 include_self 值缺乏回归测试看护,invalid_reduce 错误处理测试被删除。建议在合入前恢复必要的测试参数范围。
类型 数量
🔴 阻塞 0
🟡 建议 2

💬 仅评论

likedislike
ascend-robotascend-robot成员
19 天前 添加了label:ascend-cla/yes
此处折叠了47条消息 查看更多
ascend-robotascend-robot成员
19 天前 添加了label:approved
ffmh
ffmh
19 天前 评论:

/lgtm

likedislike
ascend-robotascend-robot成员
19 天前 添加了label:lgtm
ascend-robotascend-robot成员
19 天前 合入了pull request
ascend-robot
ascend-robot成员
19 天前 评论:

Pull Request 已合并或已关闭。

If you want to solve this problem, you can click here to do it in the FAQs.

likedislike