已合并
feat:支持融合结果上报的 Python 化 #4070
lfz2812创建于 7月20日
feat:支持融合结果上报的 Python 化 #4070
已合并
lfz2812创建于 7月20日
lfz2812成员
7月20日

Pull Request

描述

在 PR3996 完成 can_fuse Python 化的基础上,本 PR 继续补齐 GE 融合结果上报能力,使 Python 融合 Pass 能够完成融合可行性
检查、改图和融合结果上报的完整流程。

本次修改包括:

  1. 新增 report_fuse Python native 绑定:

    • 接收融合前、融合后的 Python Node 可迭代对象。
    • 统一将 Python Node 转换为 C++ GNode 集合。
    • 调用 GraphFuseInspectorUtils::ReportFuse 上报融合结果。
    • 上报失败时将错误信息写入 PassContext,并向 Python 抛出 RuntimeError
    • ge.passes 中公开 report_fuse,并补充类型声明。
  2. SubgraphRewriter.replace 增加带 context 的调用方式:

    • 原有 SubgraphRewriter.replace(boundary, replacement) 行为保持不变。
    • 新增 SubgraphRewriter.replace(boundary, replacement, context=context)
    • 传入 context 后,由底层自动完成融合可行性检查、子图替换和融合结果上报。
    • 执行失败时将错误信息写入 PassContext,并向 Python 抛出 RuntimeError
  3. 支持两种 Python 融合 Pass 改图流程:

    • 传统直接改图方式:用户依次调用 can_fuse、自定义 Graph 改图接口和 report_fuse
    • 基于子图替换的方式:用户传入 context 调用 SubgraphRewriter.replace,由底层统一完成检查、替换和上报。
  4. 优化 Python 与 native 层的职责划分:

    • 节点可迭代对象的遍历、类型校验和 GNode 转换统一在 native 层完成,避免 Python 与 native 重复处理。
    • can_fuse 保留 Python 包装,用 FuseCheckResult 封装检查结果。
    • report_fuse 无需适配返回值,直接重导出 native 实现。
  5. 更新 Python 融合 Pass 样例:

    • move_relu_before_concat_pass 使用带 contextSubgraphRewriter.replace
    • modify_conv_data_format_pass 演示 can_fuse、直接改图、report_fuse 和旧节点删除的调用顺序。
    • 同步更新相关中英文 README。
  6. 补充接口和设计文档:

    • 新增 report_fuse API 文档。
    • 更新 SubgraphRewriter.replace API 文档,说明传入和不传入 context 时的行为差异。
    • 更新 GE Python 中英文设计文档和 API 索引。
  7. 补充和更新测试:

    • 校验 report_fuse 非法 PassContext 入参。
    • 验证 Python Pass 通过 pybind 调用 report_fuse
    • 验证带 context 的融合结果上报流程。
    • 保留 can_fuse 正常、异常和边界场景覆盖。

调用示例:

from ge.passes import can_fuse, report_fuse

# 传统直接改图方式
result = can_fuse(nodes_before)
if not result.ok:
    context.set_error_message(result.reason)
    return False

# 用户直接调用Graph接口完成自定义改图。
report_fuse(nodes_before, nodes_after, context)

from ge.passes import SubgraphRewriter

# 基于子图替换的方式
SubgraphRewriter.replace(
    boundary,
    replacement,
    context=context,
)

变更类型

关联的Issue

关联 Issue:#299

如何测试

  1. 执行 Python UT:

bash tests/run_test.sh --ut=python

  1. 执行 ut_fusion_pass_executor_utest,验证 Python Pass 通过 pybind 调用 report_fuse,并检查
    PythonFusionBasePass_PybindBridge_RunSuccess 用例。

  2. 检查相关 Python 融合 Pass 样例和中英文文档。

核对清单

其他信息

  • 原有 SubgraphRewriter.replace(boundary, replacement) 接口保持兼容。
  • 传统直接改图场景必须在旧节点被删除或失效前调用 report_fuse。
  • 本次仅新增 Python 融合结果上报和带 context 的标准化子图替换能力,不改变原有 Python Pass 注册及执行机制。
likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 lfz2812 的贡献)
Llfz2812成员
7月20日 添加了label:enhancement
Llfz2812成员
7月20日 创建了 pull request,commit 15b79e20
Llfz2812成员
7月20日 update merge request[project id: 8824148, iid: 4070, commit_id: 5368977d9217ef0fda3ddd0cfbb8a53d1340c39f] virtual merging success
Llfz2812成员
7月20日 推送  12 个提交:15b79e20-11 commits from branch developb2ea4112-merge: resolve PR4070 conflicts with upstream develop
Llfz2812成员
7月20日 update merge request[project id: 8824148, iid: 4070, commit_id: 7c18b2483a25986a67b6eef423d2cb0f4d6c1aa1] virtual merging success
此处折叠了161条消息 查看更多
hugo111成员
7月23日 评论:

/lgtm

likedislike
CANN-robotCANN-robot成员
7月23日 添加了label:lgtm
zhanj
zhanj成员
7月23日 评论:

/approve

likedislike
CANN-robotCANN-robot成员
7月23日 添加了label:approved
CANN-robotCANN-robot成员
7月23日 合入了pull request