已合并
fix: 保留后端不支持的浮点 Cast 路径(#247) #1762
fix: 保留后端不支持的浮点 Cast 路径(#247) #1762
已合并
zqmin创建于 20 天前
zqmin
zqmin成员
20 天前

Pull Request

描述

重构 ImprovePrecision 连续 Cast 链处理逻辑,解决逐节点删除 Cast 时因图连接变更导致的级联错误和不支持 dtype 转换被错误折叠的问题。

核心改动:

  • 将 Cast 处理从逐节点 CastNodeProc 改为两阶段 ProcessCastChains:先统一收集线性链并做 DP 最小保留路径规划,再对保留的 Cast 执行精度后处理。
  • DP 使用 CanCollapseCast 判断每条 dtype 转换边是否被后端支持,identity 转换成本为 0,真实转换成本为 1,确保不保留冗余 identity Cast。
  • 不重新创建 Cast 节点,只调用 DelNode 删除不需要的原始 Cast 并重连上下游。
  • 移除 ShouldDeleteCastNode,保留原有 IsFloatToUltraLowNeedInsertCastShouldChangeDataType 后处理逻辑。

检视修复:

  • MarkRetainedCastNodes 回溯循环增加越界保护,避免后续修改 DP 时引入死循环。
  • ProcessCastChainsGetPeerOutNode 失败做容错,孤立节点不再中断整个 pass。
  • CollectLinearCastChain 去除冗余的线性检查条件。
  • 移除 ProcessCastNodePrecision 前置声明,按调用顺序重排函数定义。

测试改进:

  • 修正 UT Fp32ToFp16CastBeforeStore 为真实的 FP32 到 FP16 场景(原测试名与实际 dtype 不一致)。
  • 新增 UT NonFloatSourceCastChain_FallbackDeletesIdentity 覆盖 fallback 路径。
  • 抽取 UT/ST 重复 helper 到 improve_precision_test_utils.h,消除 codecheck 重复代码告警。

变更类型

关联的Issue

关联 #247:ImprovePrecision 保留后端不支持的浮点 Cast 中间路径。

如何测试

  1. cmake --build build-cast-fix --target optimize_ut optimize_st -j 8
  2. ./build-cast-fix/autofuse/tests/ut/optimize/optimize_ut --gtest_filter='TestImprovePrecisionUT.*',4 个用例通过。
  3. ./build-cast-fix/autofuse/tests/st/optimize/optimize_st --gtest_filter='TestImprovePrecisionST.*',25 个用例通过。
  4. pre-commit 和 OAT 检查全部通过。

核对清单

其他信息

  • 涉及文件:improve_precision.cppimprove_precision_test_utils.htest_improve_precision.cpp(UT/ST)
  • DP 保证 source < target 约束使回溯严格递减,不会产生环
  • 非线性链、非浮点链、分支链保留原有单节点处理逻辑
likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 zqmin 的贡献)
zqminzqmin成员
20 天前 创建了 pull request,commit fb434358
zqminzqmin成员
20 天前 关联了issue:ImprovePrecision 保留后端不支持的浮点 Cast 中间路径
atomgit-bot
atomgit-bot
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
likedislike
atomgit-bot
atomgit-bot
20 天前 评论:

代码审查

✅ 未发现问题

likedislike
CANN-robotCANN-robot成员
20 天前 添加了label:cann-cla/yes
此处折叠了207条消息 查看更多
CANN-robotCANN-robot成员
17 天前 添加了label:lgtm
张德鹏成员
17 天前 评论:

/approve

likedislike
CANN-robotCANN-robot成员
17 天前 添加了label:approved
CANN-robotCANN-robot成员
17 天前 关闭了关联的issue
CANN-robotCANN-robot成员
17 天前 合入了pull request