Pull Request has been successfully merged by CANN-robot.
(Thank you for ling-DT's contribution.)变更摘要
本 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 的MatMulBiaslowering;adaption_improve_precision_unittest与test_lowering_and_canfuse覆盖 FP16/BF16 下操作数/共享 Load/直出保持原 dtype、辅助分支升精度、MM1→vector→MM2 场景、控制边 Cast 保留及静态/动态与 MM 开关组合。


代码审查
审查结论
发现汇总
- P2:1 项
- P3:1 项
- P0/P1:无
- P2
base/common/op_tiling/op_tiling_rt2.cc:840— 删除offset_x=0x80两行后,auto node_op_desc = node->GetOpDesc();变成未使用变量(死代码,-Wunused-variable下告警甚至在-Werror目标上直接编译失败)。 - 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 |
💬 仅评论


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
/approveor/lgtm- Commenting
/approveimplies 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. 👍


| 🚀 CI 流水线已启动 |
|---|
| 📋 执行详情: 点击查看流水线 |


🟡 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)时会退化编译告警甚至直接编译失败,属于本次仅删两行引入的残留。


🟡 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 可用前加开关隔离该子路径。


/lgtm


/lgtm


/approve


Pull Request
描述
恢复原 !5703 的完整 CV Tensor API 适配修改,与 GAF 新 PR !2779 配套。
本次基于最新 develop 对整个 Tensor API 回退提交执行逆向恢复,没有新增 GE 业务逻辑,也不修改 docs 或 .gitignore。
变更类型
关联的Issue
延续 CV Tensor API 需求,对应原 !5703;GAF 配套 PR:https://gitcode.com/cann/graph-autofusion/pull/2779 。
如何测试
[12,-1,64],实际 M=50/66,BMM→Add→Cast;动态及静态 MM-on/off 的精度与 kernel 对照均通过。核对清单
其他信息
基于 develop
f386938e3。本 PR 完整恢复6ac89fcf3回退的 8 个文件,未改变该恢复范围以外的业务流程。请与 GAF !2779 配套评估。