已合并
feat: 接入ONNX Plugin Python bridge到真实ParseParamsFn #4455
gentle-knight创建于 11 天前
feat: 接入ONNX Plugin Python bridge到真实ParseParamsFn #4455
已合并
Pull Request已成功合入, 合并人@CANN-robot
(感谢 gentle-knight 的贡献)11 天前 创建了 pull request,commit c1b88da2
atomgit-bot
11 天前 评论:
11 天前 评论:
变更摘要
本 PR(PR2,依赖 PR1 #4421)新增独立 bridge SO ge_python_onnx_plugin_bridge,打通 Python descriptor/registry 到真实解析器 ParseParamsFn 的闭环:onnx_parser.cc 的 PrepareBeforeParse 在 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 原生绑定 NodeProto,Operator 改为 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()以借用方式将NodeProto与Operator句柄传入call_parse_node,实现 callback 返回值到SUCCESS/PARAM_INVALID/FAILED的映射。 - 解析器按需加载 bridge:
onnx_parser.cc的PrepareBeforeParse在AclParserInitialize成功后、ASCEND_CUSTOM_OPP_PATH非空时dlopen("libge_python_onnx_plugin_bridge.so")并dlsym调用InitOnnxPluginBridge。 OnnxNode切换为原生绑定: 删除纯 Python 的onnx_node.py,新增 pybind11 模块_ge_onnx_plugin_native将ge::onnx::NodeProto绑定为只读OnnxNode(name/origin_type/inputs/outputs/attrs),_bridge.call_parse_node改为直接接收借用的OnnxNode与 operator 句柄。Operator改为 ctypes 借用句柄并新增 C API:operator.py由后端对象改为 ctypesc_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::NodeProto(onnx_parser_unittest.cc新增OnnxPythonPluginBridge用例),覆盖成功、Python 异常、非 None 返回、C++ 注册优先四类场景,并新增 ctypes 测试桩FakeOperatorCapi。


atomgit-bot
11 天前 评论:
11 天前 评论:
11 天前 添加了label:stat/needs-squash
11 天前 添加了label:cann-cla/yes
此处折叠了1143条消息 查看更多
zhanj
6 天前 评论:
6 天前 评论:
/lgtm


6 天前 添加了label:lgtm
4 天前 添加了label:approved
4 天前 合入了pull request
描述
在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 bridgepy::cast(NodeProto*, reference)借用parser已有对象构造native OnnxNode,不取得所有权ge::Operator地址作为ctypes借用句柄传入Python callback,callback结束后失效(target, origin_type)键检查保持C++优先,Python不覆盖已有C++注册不包含ParseParamsByOperatorFn、ParseOpToGraphFn、ParseSubgraph、ES子图构图、Tensor/TensorDesc/DataType、通用PluginContext。
变更类型
关联的Issue
依赖PR1 #4421(native bindings),当前为stacked PR。
如何测试
ge_python_onnx_plugin_bridge和fmk_onnx_parser目标ut_parser并运行OnnxPythonPluginBridge测试用例ASCEND_CUSTOM_OPP_PATH指向测试Python插件,验证真实ONNX parser闭环核对清单
其他信息