标签:bug
CastOptimizationPass::DoOptimize 在处理 Concat 输入端的 reverse Cast 时,无条件调用 IsolateNode + RemoveJustNode 删除该节点。当 reverse Cast 存在除 Concat 以外的其他消费者时,IsolateNode 会将所有消费者重连到 Cast 的输入节点,而输入的 dtype 与输出不同,导致 dtype 不连续。
CastOptimizationPass::DoOptimize
IsolateNode
RemoveJustNode
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_input0
abs0
load0
cast_optimization_pass.cpp:250-256,删除 reverse Cast 前未检查 GetOutDataNodes().size(),对多消费者场景缺少 bypass 处理。
cast_optimization_pass.cpp:250-256
GetOutDataNodes().size()
删除前检查消费者数量:
dst_dtype
autofuse/optimize/task_generator/cast_optimization_pass.cpp
DoOptimize
/assign @xchu42
修改已合入
/close
标签:bug
问题描述
CastOptimizationPass::DoOptimize在处理 Concat 输入端的 reverse Cast 时,无条件调用IsolateNode+RemoveJustNode删除该节点。当 reverse Cast 存在除 Concat 以外的其他消费者时,IsolateNode会将所有消费者重连到 Cast 的输入节点,而输入的 dtype 与输出不同,导致 dtype 不连续。复现场景
优化后
cast_input0被删除,abs0被重连到load0(FP16),但abs0期望 FP32 输入。根因分析
cast_optimization_pass.cpp:250-256,删除 reverse Cast 前未检查GetOutDataNodes().size(),对多消费者场景缺少 bypass 处理。修复方案
删除前检查消费者数量:
IsolateNode+RemoveJustNode)dst_dtype),保留 Cast 给其他消费者影响范围
autofuse/optimize/task_generator/cast_optimization_pass.cpp—DoOptimize方法