Merged
feat: 恢复 CV Tensor API lowering 与尾部升精度适配 #5760
feat: 恢复 CV Tensor API lowering 与尾部升精度适配 #5760
Merged
ling-DTAdd on 5 days ago
ling-DTCollaborators
5 days ago

Pull Request

描述

恢复原 !5703 的完整 CV Tensor API 适配修改,与 GAF 新 PR !2779 配套。

  • 移除强制 offset_x=0x80 的旧 Basic API 选择方式,使 MM/BMM 按原生 Tensor API tiling 策略选择。
  • 保持 FP16/BF16 Cube 及其输入 Load 的 dtype,按矩阵运算边界仅对其后符合条件的 vector epilogue 升精度;保护 MM1→vector→MM2 等共享前驱场景。
  • 保留 bias rank/广播语义和动态 tiling 属性处理,补齐 lowering/canfuse/升精度的行为测试。

本次基于最新 develop 对整个 Tensor API 回退提交执行逆向恢复,没有新增 GE 业务逻辑,也不修改 docs 或 .gitignore。

变更类型

关联的Issue

延续 CV Tensor API 需求,对应原 !5703;GAF 配套 PR:https://gitcode.com/cann/graph-autofusion/pull/2779 。

如何测试

  1. 本轮 8 个修改文件 pre-commit 通过;恢复时无冲突。原需求的 lowering、bias 广播及升精度测试随代码完整恢复。
  2. 与 GAF 修复版联动的完整 TF CV 用例,声明 A [12,-1,64],实际 M=50/66,BMM→Add→Cast;动态及静态 MM-on/off 的精度与 kernel 对照均通过。
  3. TF/Inductor 动静态、MM/BMM 及 VV 泛化回归正在执行;泛化中的动态转置 kernel entry 异常仍在定位,不宣称全量通过。
  4. 本轮未重新完整编译最新 develop 的 GE;已有测试使用此前同源 GE Tensor API 产物。新基线的编译/UT 由本 PR 评论 compile 后的 CI 验证。

核对清单

其他信息

基于 develop f386938e3。本 PR 完整恢复 6ac89fcf3 回退的 8 个文件,未改变该恢复范围以外的业务流程。请与 GAF !2779 配套评估。

likedislike
Pull Request has been successfully merged by CANN-robot.
(Thank you for ling-DT's contribution.)
Lling-DTCollaborators
5 days ago Created pull request, commit 57b249ff
atomgit-bot
atomgit-bot
5 days ago Comments:

变更摘要

本 PR 恢复并适配 CV Tensor API 相关能力:移除 tiling 侧强制 offset_x=0x80 以触发 Basic API 的旧逻辑,使 MM/BMM 按原生 Tensor API tiling 策略选择;同时在 autofuse lowering 中放宽动态 shape 的 MatMul/BatchMatMul Cube 下沉条件(新增 IsValidMatMulShape 校验),并在升精度流程中引入“矩阵及其操作数生产者保护边界”语义,仅对 Cube 之后的 vector epilogue 及相关辅助分支升精度。配套补齐 lowering、bias 广播与升精度的单元测试。

主要改动

  • 移除强制 Basic API 属性注入:AutofuseNodeWithMatmulTiling 中删除对节点与 op_desc 设置 offset_x = 0x80 的代码,不再强制走 Basic API,改由原生 Tensor API tiling 策略决定。
  • 动态 shape 下 MatMul 下沉条件重构:StoreMatMul 新增 IsValidMatMulShape 校验(rank、batch 轴一致性、K/M/N 符号相等、常量维度为正),动态 shape 合法时也走 Cube 下沉,不合法则回退 StoreExtern;同时 StoreMatMulOp::RealizeImpl 在构建 LoopCtx 前对 dims_ 与 input_dims_ 做 Simplify()。
  • 升精度范围限定在矩阵边界之后的 vector 节点:新增 GetMatmulVectorNodes 收集矩阵及其全部上游生产者作为受保护集合,IsAllNodesInBlacklist、GetTypeToNodesFromGraph、IsNeedInsertCastBeforeOther 增加 PrecisionNodeSet 过滤参数,仅对集合内节点应用升精度规则;Cube 场景不再整体跳过。
  • Cast 节点处理与 ReLU/黑名单策略调整:CastNodeProc 新增 preserve_control_edges,对带控制边(含 data→control)的 Cast 保留为顺序边界而不删除;IsAllNodesInBlacklist 在受保护集合模式下跳过 kReluType 与 kCastType,以保留 MM+ReLU 的原生 fixpipe 能力。
  • 测试覆盖补齐:loop_api_unittest、loop_lowering_manager_asc_backend_unittest 覆盖动态 MM/BMM 下沉与各类不合法 shape 回退、动态 rank-1 bias 的 MatMulBias lowering;adaption_improve_precision_unittest 与 test_lowering_and_canfuse 覆盖 FP16/BF16 下操作数/共享 Load/直出保持原 dtype、辅助分支升精度、MM1→vector→MM2 场景、控制边 Cast 保留及静态/动态与 MM 开关组合。
likedislike
Incorrect?
atomgit-bot
atomgit-bot
5 days ago Comments:

代码审查

审查结论

发现汇总

  • P2:1 项
  • P3:1 项
  • P0/P1:无
  1. P2 base/common/op_tiling/op_tiling_rt2.cc:840 — 删除 offset_x=0x80 两行后,auto node_op_desc = node->GetOpDesc(); 变成未使用变量(死代码,-Wunused-variable 下告警甚至在 -Werror 目标上直接编译失败)。
  2. P3 tests/autofuse/ut/autofuse/loop_api_unittest.cpp:875-898 — 动态 BMM 用例只断言 IsExternKernel(),而该断言不会触发 StoreMatMulOp::RealizeImpl(KernelBox::Realize(bool) 只置位标志),因此 loop_ops.cpp 新增的 Simplify() + LoopCtx 符号化 3 维路径缺少端到端覆盖(可选补强,非必须修复)。

各变更文件审查结论

文件 结论
base/common/op_tiling/op_tiling_rt2.cc 1 项 P2(遗留未使用变量),其余为成对删除 offset_x 强制设置,函数内 op_desc 仍被使用,无接口契约破坏
compiler/.../asc_lowerer/loop_api.cpp no issues — IsValidMatMulShape 的 rank>=2 前置保护、batch 轴逐维校验、m/k1/k2/n 在 transpose/adj 下的取值与 lowering_impl.cpp:1229/1280 的既有转置语义一致;input_dims[0]/[1] 访问前有 size()<2 保护;新校验插在 PadDimsToMax 之前且静态 shape 走原路径,未改变静态行为,动态不支持场景仍回 StoreExtern;无 size→int 收窄或 32 位乘法链问题
compiler/.../asc_lowerer/loop_ops.cpp no issues — dims_/input_dims_ 为 StoreMatMulOp 值拷贝成员,Simplify() 幂等,与 StoreReshapeOp/StoreOp 既有写法一致,无共享状态被外部使用
compiler/.../adaption_improve_precision.cpp no issues — PrecisionNodeSet 存 const Node* 且节点由 type_to_nodes 的 NodePtr 保活,不存在删除后悬垂/地址复用误判;protected_nodes 为 matmul 入数据传递闭包,IsNeedInsertCastBeforeOther 的 input_idxs 与 GetPeerOutNodes 按锚点索引保序(idx 即输入序号);precision_nodes 仅在 cube matmul 图生效,非 cube 图行为完全不变;GetMatmulVectorNodes 对 Conv/无 matmul 返回空集从而保留旧的“整图跳过”语义,kMatmulTypes 与 IsCubeNodeType 的 8 种 matmul 完全对齐;ReLU/Cast 跳过只影响黑名单判定,混合图中即便被提升也不额外损失 fixpipe 资格(该场景 fixpipe 本就不可用)
tests/autofuse/ut/autofuse/adaption_improve_precision_unittest.cpp no issues — 依赖的 CreateXxxOp/CreateAscGraphSymbolsAndAxes/WrapPrecisionGraph 等辅助函数均已存在,SetUp/TearDown 备份并恢复黑名单,新增断言与生产分支一一对应
tests/autofuse/ut/autofuse/loop_api_unittest.cpp 1 项 P3(动态 BMM 端到端覆盖缺口);新增 fallback 用例的三组形状确实命中 batch 广播 / batch 乘积相等但轴不等 / K 不可证相等,逻辑正确;experimental_lowering_matmul=true 未回滚属本文件既有模式,后续用例的 extern 期望由其他原因(输入数、无符号 shape)保证,不会误判
tests/autofuse/ut/autofuse/loop_lowering_manager_asc_backend_unittest.cpp no issues — 新用例显式开启 matmul lowering,配置遗留方式与同文件 2706-2711 既有写法一致
tests/autofuse/ut/autofuse/test_lowering_and_canfuse.cpp no issues — RuntimeStub::SetInstance/Reset、ResetAutofusePlatform、SetCurShapeEnvContext、ShapeEnvAttr::CreateSymbol 的用法与 cube_fusion_strategy_unittest.cpp、extend_conv2d_lowering_unittest.cpp 一致,TearDown 已恢复环境变量、配置、shape env 与平台桩

整体风险判断

低。本次改动的主体是“动态 shape 放开 + CV Cube 图尾部 vector 升精度”,两条高风险路径都保留了兜底(动态 shape 不满足 K/M/N 与 batch 轴一致即回 StoreExtern;Conv 及非 matmul cube 图完整保留旧的“整图不升精度”行为),offset_x 移除与 GAF 侧配套由 PR 说明联动。唯一确定性缺陷是 base/ 侧遗留的未使用变量(潜在编译告警/失败),建议随本 PR 一并删除;另有 1 项非阻塞的测试覆盖补强建议。

类型 数量
🔴 阻塞 0
🟡 建议 2

💬 仅评论

likedislike
Incorrect?
CANN-robotCANN-robotCollaborators
5 days ago Added label: cann-cla/yes
CANN-robot
CANN-robotCollaborators
5 days ago Comments:

Thanks for your pull-request.
The full list of commands accepted by me can be found at here.
You can get sig-info at here.
You can self-configure the PR merge rules for this repository. For more details, please refer to Here.
For more, you also can visit HICANN.


PR Approval Progress

✅ Congratulations! All modules have met the lgtm and approve requirements.

Module Approval Details

module lgtm status approve status
repo-cann/ge ✅ yangyongqiang0606, xchu42, wangxiaotian995 (3/2) ✅ yangyongqiang0606 (1/1)

💡 Tip:

  • Committer can comment /approve or /lgtm
  • Commenting /approve implies both code review (lgtm) and intent to merge (approve)

CLA Signature Pass

ling-DT, thanks for your pull request. All authors of the commits have signed the CLA. 👍

likedislike
CANN-robotCANN-robotCollaborators
5 days ago Set yangyongqiang0606,kobemini,du-hua1024,ClarkXie,tangqunzhang,xchu42,hugo111,lining23666,tang-haojie,depeng1994,wqtshg_wt,peiyang,shengnan666,zhangfan_hanq,zhanj,zhujingjing,Mexyy,wangxiaotian995,stevenaw0,yuht9 as approver
CANN-robotCANN-robotCollaborators
5 days ago Set yangyongqiang0606,kobemini,du-hua1024,ClarkXie,tangqunzhang,xchu42,hugo111,lining23666,tang-haojie,depeng1994,wqtshg_wt,peiyang,shengnan666,zhangfan_hanq,zhanj,zhujingjing,Mexyy,wangxiaotian995,stevenaw0,yuht9 as approver
ling-DTCollaborators
5 days ago Comments:

compile

likedislike
Lling-DTCollaborators
5 days ago Pre merge succeeded (commit_id: b923018a688f9adf661e7f2119d5f49005b14699)
CANN-robot
CANN-robotCollaborators
5 days ago Comments:
🚀 CI 流水线已启动
📋 执行详情: 点击查看流水线
likedislike
CANN-robotCANN-robotCollaborators
5 days ago Added label: ci-pipeline-running
atomgit-bot
atomgit-bot5 days agoStart code review1
base/common/op_tiling/op_tiling_rt2.cc
@@ -838,4 +838,3 @@
838838 ge::Operator matmul_op = ge::OpDescUtils::CreateOperatorFromNode(node);
839839 auto op_desc = ge::OpDescUtils::GetOpDescFromOperator(matmul_op);
840- // CV自动融合场景强制设置offset_x为0x80,触发isForceBasicApi
841840 auto node_op_desc = node->GetOpDesc();
atomgit-bot
atomgit-bot5 days agoComments:

🟡 Medium Priority

改动删除了 (void)ge::AttrUtils::SetInt(node_op_desc, "offset_x", 0x80); 与 (void)ge::AttrUtils::SetInt(op_desc, "offset_x", 0x80); 两行,但保留了上一行的 auto node_op_desc = node->GetOpDesc();(本文件第 840 行)。在 AutofuseNodeWithMatmulTiling 余下代码(841-861 行)中只使用 op_desc、space_registry、run_info 等,node_op_desc 再无任何引用。
影响:该局部变量成为纯粹的死代码;在开启 -Wunused-variable(CANN 构建常用 -Wall -Wextra,部分目标叠加 -Werror)时会退化编译告警甚至直接编译失败,属于本次仅删两行引入的残留。

likedislike
Incorrect?
atomgit-bot
atomgit-bot5 days agoStart code review1
compiler/graph/optimize/autofuse/autofuse/lowering/asc_lowerer/loop_api.cpp
@@ -583,0 +620,4 @@
620+ if (!IsStaticShape(dims, dst, inputs) && !IsValidMatMulShape(input_dims, dims, matmul_attr)) {
621+ GELOGI("Drop lower result of %s as its dynamic matmul shape is unsupported", BufferName(dst).c_str());
622+ return StoreExtern(dst);
623+ }
atomgit-bot
atomgit-bot5 days agoComments:

🟡 Medium Priority

变更点(loop_api.cpp:620-623):原逻辑是「非静态 shape 一律回落」,现改为 !IsStaticShape(...) && !IsValidMatMulShape(...) 才回落,即符号化(动态)shape 的 MatMul/BatchMatMul 会进入 Cube lowering(StoreMatMulOp)。IsValidMatMulShape 仅校验符号维度一致性(batch 轴相等、K 相等、输出 M/N 相等、常量维 >0),并在 508-515 行显式支持 adj_x1/adj_x2/transpose_x1/transpose_x2 为真的输入。

触发条件:动态 shape 且 x1/x2 带转置属性(adj/transpose)或非连续布局。失败模式:此前该场景走 StoreExtern 的安全回落;现在会生成 Cube kernel entry,而 PR 描述自述「泛化中的动态转置 kernel entry 异常仍在定位」,说明该组合的 kernel entry 尚未验证通过 —— 表现为后端 kernel entry 生成失败/编译报错,或运行期取到不匹配的 tiling 导致精度/性能异常。静态 shape 仍走原路径,故影响仅限动态用例。

建议:在 IsValidMatMulShape 中拒绝动态转置用例(transpose_x1/transpose_x2/adj_x1/adj_x2 为真且对应维度非常量时返回 false),使其继续走 StoreExtern 回落;或在 GAF 侧确认动态转置 kernel entry 可用前加开关隔离该子路径。

likedislike
Incorrect?
CANN-robotCANN-robotCollaborators
5 days ago Removed label: ci-pipeline-running
CANN-robotCANN-robotCollaborators
5 days ago Added label: ci-pipeline-passed
Lling-DTCollaborators
4 days ago Resolved final issue
xchu42
xchu42Collaborators
4 days ago Comments:

/lgtm

likedislike
wangxiaotian995Collaborators
4 days ago Comments:

/lgtm

likedislike
CANN-robotCANN-robotCollaborators
4 days ago Added label: lgtm
yangyongqiang
yangyongqiangCollaborators
4 days ago Comments:

/approve

likedislike
CANN-robotCANN-robotCollaborators
4 days ago Added label: approved
CANN-robotCANN-robotCollaborators
4 days ago Merged pull request