已合并
Add scatter reduce fallback for older CANN #5624
fgd_dragon创建于 20 天前
Add scatter reduce fallback for older CANN #5624
已合并
F
fgd_dragon
20 天前
20 天前
# 【合入来源】
- [ ] 需求
- [ ] 问题单
- [ ] 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 流水线执行通过,代码检查无异常


Pull Request已成功合入, 合并人@ascend-robot
(感谢 fgd_dragon 的贡献)20 天前 创建了 pull request,commit 992588e3
atomgit-bot
20 天前 评论:
20 天前 评论:
变更摘要
本PR为 scatter_reduce 系列算子添加了对旧版本CANN(不支持 aclnnScatterReduce / aclnnInplaceScatterReduce)的CPU回退兼容机制。通过在三个算子入口(scatter_reduce、scatter_reduce_out、scatter_reduce_)中插入 DO_COMPATIBILITY 宏,当NPU算子不可用时自动回退到CPU实现完成计算,并将结果拷贝回NPU设备。同时移除了原有的 exec_scatter_reduce 封装函数,将 get_reduce 和 EXEC_NPU_CMD 调用内联至各入口函数中。测试侧移除了此前因CANN版本限制而跳过的用例,新增了针对CANN 9.2.0之前版本的CPU回退专项测试,并简化了部分测试矩阵。
主要改动
- 新增CPU回退函数: 在
ScatterReduceKernelNpuOpApi.cpp中新增scatter_reduce_cpu_fallback、scatter_reduce_out_cpu_fallback和scatter_reduce_inplace_cpu_fallback三个静态函数,分别处理非in-place输出、out参数输出和in-place场景下的CPU回退逻辑,统一将张量迁移至CPU调用PyTorch原生实现后再拷贝回NPU。 - 集成兼容性宏调用: 在
scatter_reduce、scatter_reduce_out和scatter_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测试。


ascend-robot
20 天前 评论:
20 天前 评论:
atomgit-bot
20 天前 评论:
20 天前 评论:
代码审查
审查总结
我对此次 PR 的两个变更文件均已完成审查:
op_plugin/ops/opapi/ScatterReduceKernelNpuOpApi.cpp
- P2 ×1:
scatter_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 ×2:
test_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 函数实现本身无明显缺陷。主要风险集中在:
- sum/add + include_self 路径的 fallback 链存在结构性遮蔽问题,在极端老版本 CANN 上可能导致该路径报错而非走 CPU fallback;
- 测试覆盖范围大幅缩小,多个 reduce 类型和 include_self 值缺乏回归测试看护,
invalid_reduce错误处理测试被删除。建议在合入前恢复必要的测试参数范围。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 0 |
| 🟡 建议 | 2 |
💬 仅评论


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


19 天前 添加了label:lgtm
19 天前 合入了pull request
ascend-robot
19 天前 评论:
19 天前 评论:
Pull Request 已合并或已关闭。
If you want to solve this problem, you can click here to do it in the FAQs.

