已关闭
fix: 修复 Broadcast 后 Reduce source reuse 导致精度错误 #282
wei_shi创建于  22 天前关闭于  21 天前
wei_shi
wei_shi成员
22 天前 创建

问题描述

Autofuse 在处理 Broadcast -> Reduce 计算链时,Reduce 的 source reuse 判断可能错误地复用输入 source。当上游 Broadcast 的 B 轴与 Reduce 的 R 轴具有相同的 vectorized_axis,且该轴在 Broadcast 中发生扩展、在 Reduce 中参与归约时,生成的 Reduce 计算可能改写仍被 Broadcast 语义依赖的数据,最终导致输出精度错误。

问题原因

当前 Reduce source reuse 逻辑主要依据输入节点的出度判断是否可以复用 source,未进一步检查 Reduce 上游数据链中是否存在位于 Reduce 轴上的 Broadcast。Broadcast 改变了该轴的数据访问语义,直接复用 Reduce 输入 source 可能造成数据依赖冲突和结果精度异常。

修改方向

  1. 完善 Reduce source reuse 的准入条件,在确认输入节点为单出度的基础上遍历 Reduce 上游数据链。
  2. 识别上游 Broadcast,比较 Broadcast 输出轴、输入输出 stride 与 Reduce 输入输出 stride,判断是否存在同一 vectorized_axis 上的 Broadcast/Reduce 语义冲突。
  3. 对存在冲突的场景禁止复用 Reduce 输入 source,保留独立临时存储或原有计算路径;仅在能够证明数据复用安全时启用 source reuse。
  4. 在 Reduce 元数据计算和 Reduce API codegen 路径中复用同一判断逻辑,避免编译期属性与生成代码的复用策略不一致。
  5. 增加覆盖同轴 Broadcast、非同轴 Broadcast、无上游 Broadcast、多个上游节点和共享输入节点的单元测试及精度验证。

验证要求

  • 存在 Broadcast/Reduce 轴语义冲突时不再生成 source reuse。
  • 无冲突的单出度 Reduce 仍可正常复用 source。
  • 对典型 Broadcast 后 Reduce 图执行编译和设备侧精度对比,确认结果与参考实现一致。
likedislike
wei_shiwei_shi成员
22 天前 关联了pull request:fix: 修复 Broadcast 后 Reduce source reuse 判断, 避免修改复用的broadcast数据导致精度失败
wei_shi
wei_shi成员
22 天前 评论:

已分析处理

likedislike
wei_shiwei_shi成员
22 天前 将 wei_shi 设为负责人
wei_shiwei_shi成员
22 天前 添加了label:bug
wei_shiwei_shi成员
22 天前 issue类型由 任务 改变为 缺陷
zqminzqmin成员
21 天前 issue状态由 待办的 改变为 已完成
zqminzqmin成员
21 天前 关闭了 issue
CANN-robotCANN-robot成员
21 天前 添加了label:resolved