已合并
fix: 保留后端不支持的浮点 Cast 路径(#247) #1762
zqmin创建于 20 天前
fix: 保留后端不支持的浮点 Cast 路径(#247) #1762
已合并
Pull Request已成功合入, 合并人@CANN-robot
(感谢 zqmin 的贡献)20 天前 关联了issue:ImprovePrecision 保留后端不支持的浮点 Cast 中间路径
atomgit-bot
20 天前 评论:
20 天前 评论:
变更摘要
此 PR 修复 ImprovePrecision 在删除连续浮点 Cast 节点时未校验消除后首尾 dtype 转换是否被后端支持的问题。核心改动是调整 ShouldDeleteCastNode 的判断逻辑:在折叠 Cast 链之前,先沿 Cast 链找到最终下游节点,并根据输入 dtype、最终下游输出 dtype 以及 CheckCastDtype 后端支持检查来决定是否删除中间 Cast,从而避免将 BF16 -> FP32 -> FP16 错误折叠成不支持的 BF16 -> FP16。
主要改动
- 重构
ShouldDeleteCastNode判断逻辑: 函数签名由(peer_output_dtype, output_dtype)改为(input_dtype, peer_output_dtype, output_dtype),当input_dtype == output_dtype时直接返回 true,否则在浮点判断基础上增加CheckCastDtype(input_dtype, peer_output_dtype)后端支持校验。 - 新增
GetCastChainOutputNode函数: 通过GetPeerInNodes沿af::ascir_op::Cast::Type链向下遍历,定位连续Cast链的最终下游节点,用于获取折叠后的实际输出 dtype。 - 更新
CastNodeProc删除判断流程: 在删除Cast前先获取下游节点及其输出张量描述,将原peer_output_dtype重新定义为下游节点的输出 dtype,并以输入 dtype、下游输出 dtype、当前输出 dtype 作为参数调用新的ShouldDeleteCastNode。 - 补充回归测试: 新增
UnsupportedCastBypass_PreservesIntermediateFloatCast用例,验证BF16 -> FP32 -> FP16链在删除后保留中间浮点Cast,最终图中有 2 个Cast节点且cast_bf16_to_fp32输出 dtype 保持ge::DT_FLOAT。


atomgit-bot
20 天前 评论:
20 天前 评论:
20 天前 添加了label:cann-cla/yes
此处折叠了207条消息 查看更多
17 天前 添加了label:lgtm
17 天前 添加了label:approved
17 天前 关闭了关联的issue
17 天前 合入了pull request
Pull Request
描述
重构 ImprovePrecision 连续 Cast 链处理逻辑,解决逐节点删除 Cast 时因图连接变更导致的级联错误和不支持 dtype 转换被错误折叠的问题。
核心改动:
CastNodeProc改为两阶段ProcessCastChains:先统一收集线性链并做 DP 最小保留路径规划,再对保留的 Cast 执行精度后处理。CanCollapseCast判断每条 dtype 转换边是否被后端支持,identity 转换成本为 0,真实转换成本为 1,确保不保留冗余 identity Cast。DelNode删除不需要的原始 Cast 并重连上下游。ShouldDeleteCastNode,保留原有IsFloatToUltraLowNeedInsertCast和ShouldChangeDataType后处理逻辑。检视修复:
MarkRetainedCastNodes回溯循环增加越界保护,避免后续修改 DP 时引入死循环。ProcessCastChains对GetPeerOutNode失败做容错,孤立节点不再中断整个 pass。CollectLinearCastChain去除冗余的线性检查条件。ProcessCastNodePrecision前置声明,按调用顺序重排函数定义。测试改进:
Fp32ToFp16CastBeforeStore为真实的 FP32 到 FP16 场景(原测试名与实际 dtype 不一致)。NonFloatSourceCastChain_FallbackDeletesIdentity覆盖 fallback 路径。improve_precision_test_utils.h,消除 codecheck 重复代码告警。变更类型
关联的Issue
关联 #247:ImprovePrecision 保留后端不支持的浮点 Cast 中间路径。
如何测试
cmake --build build-cast-fix --target optimize_ut optimize_st -j 8./build-cast-fix/autofuse/tests/ut/optimize/optimize_ut --gtest_filter='TestImprovePrecisionUT.*',4 个用例通过。./build-cast-fix/autofuse/tests/st/optimize/optimize_st --gtest_filter='TestImprovePrecisionST.*',25 个用例通过。pre-commit和 OAT 检查全部通过。核对清单
其他信息
improve_precision.cpp、improve_precision_test_utils.h、test_improve_precision.cpp(UT/ST)source < target约束使回溯严格递减,不会产生环