已合并
feat: 添加自定义算子IR元信息收集能力 #4172
feat: 添加自定义算子IR元信息收集能力 #4172
已合并
GengChao创建于 7月28日
GengChao
GengChao成员
7月28日

Pull Request

描述

新增 Python 自定义算子 canonical IR 元信息收集能力,并完成从 runtime adapter 到 Python execute callback 的 IR 元信息 bridge 接入,作为后续 schema-bound execute 实参组装的基础。

  • 从 OperatorFactory 中已注册的算子原型收集 input、attr 和 output 元信息
  • input/output 保持 IR 定义顺序及 required/optional/dynamic 类型
  • attr 严格按照 OpDesc::GetIrAttrNames() 顺序收集,不依赖属性类型 map 的 key 顺序
  • adapter 创建时保存不可变 IR 快照,并投影为 callback 期间有效的只读 POD view
  • execute callback 将 POD view 传入 Python 版本敏感的 pybind bridge,并立即转换为 Python dict/list
  • 未注册原型时传递 None,继续兼容历史 execute(ctx) 调用链
  • 使用 GE_ASSERT_TRUE、GE_ASSERT_NOTNULL 和 GE_ASSERT_GRAPH_SUCCESS 进行错误检查
  • 不持有 OpDescPtr,不修改 EagerOpExecutionContext,bridge ABI 继续保持 v1

架构说明

当前 CollectCustomOpIrMeta 依赖 runtime 私有接口,Python 版本敏感的 bridge/codegen 只能依赖 run 包公开头文件,因此 collector 暂时归属 custom_op_runtime,并通过借用式 POD view 跨越 callback 边界。bridge 在同步 callback 内立即复制 view,不保存其中的裸指针。

该 POD 投影是过渡设计。后续 collector 所需接口全部成为 run 包稳定公开 API 后,可将 collector 迁移到 bridge/codegen 侧并删除 POD 投影,届时依赖关系由私有 callback/POD 协议转为正式公共头文件和符号依赖。

变更类型

请选择本次引入的变更类型(勾选对应项):

关联的Issue

无。

如何测试

  • 本次涉及文件的 pre-commit 检查全部通过,包括 clang-format、ruff、codespell 和 OAT 合规检查
  • 使用真实 REG_OP 原型运行 PythonCustomOpIrMeta 相关 C++ 用例,4 个测试全部通过
  • Python custom-op 测试 15 个全部通过
  • 测试覆盖 required/optional/dynamic input、required/dynamic output、IR attr 顺序、失败时输出不被覆盖、POD view callback 传递以及无原型时 legacy execute 兼容
  • 完整 custom_op_runtime 目标受已安装 CANN 头文件与当前 develop 接口不匹配影响未完成构建,交由上游 CI 在匹配环境中验证

核对清单

其他信息

本 PR 尚未实现 schema-bound execute 的 build_execute_inputs/build_execute_attrs。当前 Python helper 已接收 canonical IR 元信息,但仍调用历史 execute(ctx);后续提交将在该 bridge 基础上完成 Python 侧实参组装。

likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 GengChao 的贡献)
GengChaoGengChao成员
7月28日 创建了 pull request,commit a23d50da
atomgit-bot
atomgit-bot
7月28日 评论:

变更摘要

此 PR 新增了 Python 自定义算子内部 IR 元信息收集能力,作为后续根据算子原型自动组装 execute 输入和属性实参的前置基础设施。核心是通过 CollectCustomOpIrMeta 函数从已注册的算子原型中提取 input、attr 和 output 的元信息,并使用临时对象确保失败时不污染调用方已有结果。

主要改动

  • 新增 CustomOpIrMeta 系列结构体: 在 python_custom_op_ir_meta.h 中定义了 CustomOpIrInputMeta(包含 name 与 ge::IrInputType kind)、CustomOpIrAttrMeta(包含 name 与 type)、CustomOpIrOutputMeta(包含 name 与 ge::IrOutputType kind)以及聚合结构体 CustomOpIrMeta,用于承载算子 IR 元信息。
  • 实现 CollectCustomOpIrMeta 收集函数: 在 python_custom_op_ir_meta.cc 中,函数通过 OperatorFactory 获取已注册算子原型,按 GetIrInputs() / GetIrAttrNames() / GetIrOutputs() 顺序分别收集 input(保持 required/optional/dynamic 定义顺序)、attr(严格按 OpDesc::GetIrAttrNames() 顺序,不依赖属性类型 map 的 key 顺序)和 output 元信息,使用临时 collected 对象构建完成后通过 std::move 赋值给输出参数,失败时不覆盖调用方已有结果。
  • 引入 GE_ASSERT_* 系列错误检查宏: 使用 GE_ASSERT_TRUE 检查 op_type 非空和算子已注册,GE_ASSERT_NOTNULL 检查 OpDesc 获取成功,GE_ASSERT_GRAPH_SUCCESS 检查 IR attr 名称和类型获取成功,统一了该模块的错误处理风格。
  • 添加单元测试覆盖: 新增 python_custom_op_ir_meta_unittest.cc,包含两个测试用例——collects_ir_in_definition_order 验证 required/optional/dynamic input、required/dynamic output 的 IR 定义顺序及 attr 的 z_attr/a_attr 顺序与类型正确性;rejects_unregistered_op_without_overwriting_output 验证对未注册算子收集失败时输出参数 op_type 保持原值不被覆盖。
likedislike
不准确?
atomgit-bot
atomgit-bot
7月28日 评论:

代码审查

我已经全面审查了此 diff 中的所有 5 个文件,包括:

  1. runtime/custom_op/CMakeLists.txt — 将新的 .cc 源文件添加到 custom_op_runtime 共享库目标中。变更简单,与现有构建模式一致,无需报告。

  2. runtime/custom_op/python_custom_op_ir_meta.h — 定义了 CustomOpIrInputMeta、CustomOpIrAttrMeta、CustomOpIrOutputMeta、CustomOpIrMeta 四个数据结构体以及 CollectCustomOpIrMeta 函数声明。头文件保护宏正确,包含依赖完整,类型使用合理。无需报告。

  3. runtime/custom_op/python_custom_op_ir_meta.cc — 实现了 CollectCustomOpIrMeta 函数。使用临时对象 collected 进行收集,仅在所有 GE_ASSERT_* 断言通过后将结果移动到 ir_meta,ir_meta 原值在断言失败时不会被覆盖。GetIrAttrNames() 返回 const std::vector<std::string>&,GetIrInputs() / GetIrOutputs() 同理;使用 const auto & 绑定避免了不必要的拷贝。AscendString 临时对象用于 map 查找,生命周期在 find() 调用期间有效。错误处理流程正确。

  4. tests/ge/ut/ge/CMakeLists.txt — 将单元测试文件添加到 MULTI_PARTS_TEST_FILES 中,供 ut_libge_multiparts_utest 可执行目标使用。变更简单,无需报告。

  5. tests/ge/ut/ge/runtime/custom_op/python_custom_op_ir_meta_unittest.cc — 单元测试。REG_OP 注册使用标准模式(在 namespace ge 内)。collects_ir_in_definition_order 测试验证了 input/output/attr 的收集顺序和类型映射的正确性。rejects_unregistered_op_without_overwriting_output 测试验证了未注册算子返回错误且不会覆盖 op_type(临时对象实现保证了所有字段均不会被覆盖)。无需报告。


审查总结

优先级 数量
P0 0
P1 0
P2 0
P3 0

总体风险评估:低风险。 此变更新增了一个独立的 IR 元信息收集函数及其单元测试,实现遵循代码库现有的 GE_ASSERT_* 断言模式和临时对象收集模式。错误处理路径正确(失败时返回 GRAPH_FAILED 而不覆盖 ir_meta)。与现有 custom_op_runtime 构建目标和测试框架集成方式正确。未发现逻辑缺陷、安全隐患、可靠性问题或破坏性变更。

⚠️ 已识别出整体风险,但无法提取行内评论,请参考整体评估。

likedislike
不准确?
CANN-robotCANN-robot成员
7月28日 添加了label:cann-cla/yes
CANN-robot
CANN-robot成员
7月28日 评论:

CLA Signature Pass

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

likedislike
此处折叠了42条消息 查看更多
hugo111成员
7月29日 评论:

/lgtm

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

/approve

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