已关闭
[bug] CastOptimizationPass 删除 reverse Cast 时未检查多消费者导致 dtype 不连续 #88
xchu42创建于  6月4日关闭于  6月5日
xchu42
xchu42成员
6月4日 创建

标签:bug

问题描述

CastOptimizationPass::DoOptimize 在处理 Concat 输入端的 reverse Cast 时,无条件调用 IsolateNode + RemoveJustNode 删除该节点。当 reverse Cast 存在除 Concat 以外的其他消费者时,IsolateNode 会将所有消费者重连到 Cast 的输入节点,而输入的 dtype 与输出不同,导致 dtype 不连续。

复现场景

load0 (FP16)
    │
    ▼
cast_input0 (FP16→FP32)  ◄── reverse Cast
    │
    ├──► concat0 (FP32) ──► cast_out0 (FP32→FP16) ──► store0
    │
    └──► abs0 (FP32) ──► store1

优化后 cast_input0 被删除,abs0 被重连到 load0(FP16),但 abs0 期望 FP32 输入。

根因分析

cast_optimization_pass.cpp:250-256,删除 reverse Cast 前未检查 GetOutDataNodes().size(),对多消费者场景缺少 bypass 处理。

修复方案

删除前检查消费者数量:

  • 单消费者:原逻辑删除(IsolateNode + RemoveJustNode
  • 多消费者:仅断开 Concat 连接,将 Concat 直连到 Cast 的输入源(dtype 已匹配 dst_dtype),保留 Cast 给其他消费者

影响范围

  • autofuse/optimize/task_generator/cast_optimization_pass.cppDoOptimize 方法
  • 涉及 downcast 和 upcast(gather alg)两条路径
likedislike
xchu42xchu42成员
6月4日 关联了pull request:【PR】: [fix] CastOptimizationPass 删除 reverse Cast 时未检查多消费者导致 dtype 不连续
Phl17成员
6月4日 评论:

/assign @xchu42

likedislike
CANN-robotCANN-robot成员
6月4日 将 xchu42 设为负责人
xchu42xchu42成员
6月5日 添加了label:resolved
xchu42
xchu42成员
6月5日 评论:

修改已合入

likedislike
xchu42
xchu42成员
6月5日 评论:

/close

likedislike
CANN-robotCANN-robot成员
6月5日 issue状态由 待办的 改变为 已完成
CANN-robotCANN-robot成员
6月5日 关闭了 issue