已合并
feat: 接入ONNX Plugin Python bridge到真实ParseParamsFn #4455
feat: 接入ONNX Plugin Python bridge到真实ParseParamsFn #4455
已合并
gentle-knight创建于 11 天前
gentle-knight
gentle-knight成员
11 天前

描述

在PR1(#4421 native bindings)基础上,以独立bridge SO完成Python descriptor/registry到parser真实ParseParamsFn的闭环。

PR2新增内容:

  • 新增ge_python_onnx_plugin_bridge独立SO,复用现有loader/registry/OpRegistrationTbe/OpRegistry,不新增第二套注册表或扫描器
  • PrepareBeforeParse在C++插件初始化成功后、ASCEND_CUSTOM_OPP_PATH非空时按需dlopen bridge
  • bridge以py::cast(NodeProto*, reference)借用parser已有对象构造native OnnxNode,不取得所有权
  • ge::Operator地址作为ctypes借用句柄传入Python callback,callback结束后失效
  • callback返回None映射SUCCESS,返回非None映射PARAM_INVALID,Python异常映射FAILED
  • OpRegistry使用已有完整(target, origin_type)键检查保持C++优先,Python不覆盖已有C++注册
  • 删除Python bridge UT中的SimpleNamespace测试接缝,改为C++ parser UT直接构造真实ge::onnx::NodeProto
  • 新增成功/异常/非None返回/C++优先四类场景测试

不包含ParseParamsByOperatorFn、ParseOpToGraphFn、ParseSubgraph、ES子图构图、Tensor/TensorDesc/DataType、通用PluginContext。

变更类型

关联的Issue

依赖PR1 #4421(native bindings),当前为stacked PR。

如何测试

  1. 编译ge_python_onnx_plugin_bridgefmk_onnx_parser目标
  2. 编译ut_parser并运行OnnxPythonPluginBridge测试用例
  3. 设置ASCEND_CUSTOM_OPP_PATH指向测试Python插件,验证真实ONNX parser闭环

核对清单

其他信息

  • 工作代码约221行,测试代码约168行,未超出PR2预算
  • bridge为独立SO,不进入graph_metadef,不向Python暴露protobuf指针
  • 未修改生产native OnnxNode模块,未增加测试工厂
  • 本地编译通过:ge_python_onnx_plugin_bridge、fmk_onnx_parser、ut_parser
  • pre-commit全部通过
likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 gentle-knight 的贡献)
gentle-knightgentle-knight成员
11 天前 创建了 pull request,commit c1b88da2
atomgit-bot
atomgit-bot
11 天前 评论:

变更摘要

本 PR(PR2,依赖 PR1 #4421)新增独立 bridge SO ge_python_onnx_plugin_bridge,打通 Python descriptor/registry 到真实解析器 ParseParamsFn 的闭环:onnx_parser.ccPrepareBeforeParse 在 C++ 插件初始化成功且 ASCEND_CUSTOM_OPP_PATH 非空时 dlopen 该 bridge 并调用 InitOnnxPluginBridge();bridge 复用现有 OpRegistrationTbe/OpRegistry(不新增第二套注册表),ParseParams 中以 py::cast(node, reference) 借用 parser 已有的 ge::onnx::NodeProto 对象、以 uintptr 地址作为 ctypes 借用句柄传入 ge::Operator,并按 callback 返回映射状态(None→SUCCESS、非 None→PARAM_INVALID、Python 异常→FAILED)。同时 Python 侧 OnnxNode 由纯 Python 扁平类切换为 pybind11 原生绑定 NodeProtoOperator 改为 ctypes 借用句柄并新增 GeApiWrapper_Operator_* C API,OpRegistry 保持 C++ 优先、Python 不覆盖已有 C++ 注册。

主要改动

  • 新增独立 bridge SO 与真实 ParseParamsFn 闭环: onnx_plugin_bridge.cc 新增 OnnxPluginBridge 单例,Initialize() 通过 load_and_get_onnx_plugin_descriptors() 加载 Python 插件并按 (target, origin_type) 注册,ParseParams() 以借用方式将 NodeProtoOperator 句柄传入 call_parse_node,实现 callback 返回值到 SUCCESS/PARAM_INVALID/FAILED 的映射。
  • 解析器按需加载 bridge: onnx_parser.ccPrepareBeforeParseAclParserInitialize 成功后、ASCEND_CUSTOM_OPP_PATH 非空时 dlopen("libge_python_onnx_plugin_bridge.so")dlsym 调用 InitOnnxPluginBridge
  • OnnxNode 切换为原生绑定: 删除纯 Python 的 onnx_node.py,新增 pybind11 模块 _ge_onnx_plugin_nativege::onnx::NodeProto 绑定为只读 OnnxNodename/origin_type/inputs/outputs/attrs),_bridge.call_parse_node 改为直接接收借用的 OnnxNode 与 operator 句柄。
  • Operator 改为 ctypes 借用句柄并新增 C API: operator.py 由后端对象改为 ctypes c_void_p 句柄(回调结束置空失效),经新增的 GeApiWrapper_Operator_GetName/GetType/SetAttr/InputRegister/OptionalInputRegister/OutputRegister/DynamicInputRegister/DynamicOutputRegister 访问,set_attr 支持通过 _AttrValue 设置字符串与列表等更多类型。
  • 测试重构并覆盖四类场景: 删除 Python bridge UT 中的 SimpleNamespace 测试接缝(python_onnx_plugin_bridge_test.py),改为 C++ parser UT 直接构造真实 ge::onnx::NodeProtoonnx_parser_unittest.cc 新增 OnnxPythonPluginBridge 用例),覆盖成功、Python 异常、非 None 返回、C++ 注册优先四类场景,并新增 ctypes 测试桩 FakeOperatorCapi
likedislike
atomgit-bot
atomgit-bot
11 天前 评论:

代码审查

✅ 未发现问题

likedislike
CANN-robotCANN-robot成员
11 天前 添加了label:stat/needs-squash
CANN-robotCANN-robot成员
11 天前 添加了label:cann-cla/yes
此处折叠了1143条消息 查看更多
zhanj
zhanj成员
6 天前 评论:

/lgtm

likedislike
CANN-robotCANN-robot成员
6 天前 添加了label:lgtm
张德鹏成员
4 天前 评论:

/approve

likedislike
CANN-robotCANN-robot成员
4 天前 添加了label:approved
CANN-robotCANN-robot成员
4 天前 合入了pull request