Pull Request已成功合入, 合并人@CANN-robot
(感谢 GengChao 的贡献)变更摘要
此 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保持原值不被覆盖。


代码审查
我已经全面审查了此 diff 中的所有 5 个文件,包括:
-
runtime/custom_op/CMakeLists.txt— 将新的.cc源文件添加到custom_op_runtime共享库目标中。变更简单,与现有构建模式一致,无需报告。 -
runtime/custom_op/python_custom_op_ir_meta.h— 定义了CustomOpIrInputMeta、CustomOpIrAttrMeta、CustomOpIrOutputMeta、CustomOpIrMeta四个数据结构体以及CollectCustomOpIrMeta函数声明。头文件保护宏正确,包含依赖完整,类型使用合理。无需报告。 -
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()调用期间有效。错误处理流程正确。 -
tests/ge/ut/ge/CMakeLists.txt— 将单元测试文件添加到MULTI_PARTS_TEST_FILES中,供ut_libge_multiparts_utest可执行目标使用。变更简单,无需报告。 -
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 构建目标和测试框架集成方式正确。未发现逻辑缺陷、安全隐患、可靠性问题或破坏性变更。
⚠️ 已识别出整体风险,但无法提取行内评论,请参考整体评估。


/approve


Pull Request
描述
新增 Python 自定义算子 canonical IR 元信息收集能力,并完成从 runtime adapter 到 Python execute callback 的 IR 元信息 bridge 接入,作为后续 schema-bound execute 实参组装的基础。
架构说明
当前 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
无。
如何测试
核对清单
其他信息
本 PR 尚未实现 schema-bound execute 的 build_execute_inputs/build_execute_attrs。当前 Python helper 已接收 canonical IR 元信息,但仍调用历史 execute(ctx);后续提交将在该 bridge 基础上完成 Python 侧实参组装。