Pull Request已成功合入, 合并人@CANN-robot
(感谢 fary86 的贡献)变更摘要
本 PR 为 OM2 模型管线引入语言无关自定义算子(Custom Op)的完整支持,覆盖数据结构、打包、代码生成与运行时四个阶段。gert::Om2ModelData 新增 custom_kernel_binaries 与 custom_shared_libs 字段;Om2PackageHelper 在打包阶段收集并序列化图中使用的自定义算子内核二进制,同时封装自定义算子动态库;代码生成阶段新增 CustomTaskCodeBuilder、DISPATCH_CUSTOM_KERNEL 分发类型及 kCreateClassCustomOpFactory、kCustomTaskHelpers 两个 StablePart,生成 KernelCustTaskDistribute 与 DeserializeCustKernelBinaries 等辅助函数;运行时阶段通过 mmDlopen 加载自定义 so,并将自定义内核二进制合并到 kernel_bin_info 供反序列化使用。
主要改动
- 新增自定义算子内核与动态库的打包序列化流程:
Om2PackageHelper新增CollectUsedCustomOpTypes、BuildCustomKernelBinaries、BuildCustomSharedLibs与ReadCustomOpSoToBuffer,遍历 root 图及游离子图收集CustomOpFactory注册的自定义算子并调用PortableOp::Serialize序列化;om2_zip_saver.cc新增SerializeCustomKernelBinaries、SerializeCustomKernelSharedLibs,配合新增的OM2_CUSTOM_KERNELS_DIR_FORMAT路径常量写入data/custom_ops/下的 ZIP 条目。 - 新增自定义算子代码生成器与分发类型: 新增
CustomTaskCodeBuilder类处理MODEL_TASK_CUSTOM_KERNEL任务并生成DispatchCustomKernel分发逻辑;OpDispatchType扩展DISPATCH_CUSTOM_KERNEL = 21,TaskDispatchInfo联合体新增CustomDispatchInfo custom字段,Om2CodegenUtils的受支持任务类型集合同步加入MODEL_TASK_CUSTOM_KERNEL。 - 新增代码生成中的运行时辅助代码与条件嵌入:
stable_part_provider.cc新增kCreateClassCustomOpFactory与kCustomTaskHelpers,生成CustomOpFactory类声明以及BuildGeTensor、CustKernelContextHolder、KernelCustTaskDistribute、DeserializeCustKernelBinaries等辅助代码;program_generator.cc在存在自定义内核时引入graph/custom_op.h等头文件并嵌入相应 StablePart,LoadAndRunFileCodeGenerator增加SetHasCustomKernel与has_custom_kernel_控制逻辑。 - 统一构建接口以传递
Om2ModelData:Om2PackageHelper的BuildProgramBody、BuildKernelBinaries、BuildModelMeta、BuildConstantsData、BuildDebugInfo、BuildManifest及Om2Codegen::Om2CodegenAndCompile的接口由分散的参数改为统一接收gert::Om2ModelData引用,简化了数据传递并支持新字段。 - 运行时加载自定义 so 与内核反序列化:
om2_model_executor.cc新增CustSharedLibInfo结构体,HandleArchiveEntry解析data/custom_ops/shared_libs与data/custom_ops/binaries_*条目;模型加载时对自定义 so 执行mmDlopen,并将custom_kernel_binaries合并到kernel_bin_info供DeserializeCustKernelBinaries使用。


代码审查
所有关键发现已上报。以下为各变更文件的审查结论汇总。
审查结论汇总
已审查的 13 个文件:
base/common/helper/om2/om2_package_contants.h— 新增路径常量宏,无问题。base/common/helper/om2/om2_zip_saver.cc— 新增两个序列化函数并接入Save,与现有SerializeKernelBinaries模式一致,无问题。base/common/helper/om2_package_helper.cc— 发现 4 个问题(P2×1、P3×3)。base/common/om2/codegen/ast/ast_nodes.h— 新增两个 StablePartId 枚举值,无问题。base/common/om2/codegen/emitter/stable_parts/stable_part_provider.cc— 新增CustomDispatchInfo及两个 StablePart 生成字符串,无独立可确证问题。base/common/om2/codegen/file_code_generator/load_and_run_file_code_generator.cc— 新增DispatchCustomKernel映射与DeserializeCustKernelBinaries调用,无独立问题。base/common/om2/codegen/file_code_generator/load_and_run_file_code_generator.h— 新增 setter 与布尔成员,无问题。base/common/om2/codegen/om2_codegen.cc— 发现 1 个问题(P2:has_custom_kernel门控依据错误)。base/common/om2/codegen/om2_codegen.h— 签名收敛为Om2ModelData引用,include 替换正确,无问题。base/common/om2/codegen/om2_codegen_types.h— 新增枚举值与ToString()的sizeof循环,名称数组与枚举对齐,无问题。base/common/om2/codegen/om2_codegen_utils.cc— 将MODEL_TASK_CUSTOM_KERNEL加入支持集合,与已存在的CustomTaskCodeBuilder注册一致,无问题。base/common/om2/codegen/program_generator.cc— 条件注入自定义算子头文件与 StablePart,逻辑正确,无独立问题。base/common/om2/codegen/program_generator.h— 新增构造函数参数与成员,无问题。
问题数量统计:
- P0:0
- P1:0
- P2:2
- P3:3
整体风险评估: 本次变更主体为自定义算子的打包与代码生成支持,结构清晰、接口收敛合理。核心风险集中在“仅含不可序列化自定义算子”这一边界场景:门控标志 has_custom_kernel 依赖 custom_kernel_binaries 是否为空,与“是否存在自定义 kernel 任务”不一致,会导致生成代码缺失 KernelCustTaskDistribute 而编译失败;此外 CollectUsedCustomOpTypes 缺少对 ge_root_model 的空指针校验。其余为死代码与一处低概率的 memcpy 失败泄漏路径,属低优先级清理项。
审查总结
已逐一审查全部 13 个变更文件,共报告 6 项发现(其中 1 项为无害风格项,已在正文标注)。
按优先级统计:
- P0:0
- P1:0
- P2:2(自定义 so 句柄/memfd 卸载/重载泄漏;mmDlopen 失败路径泄漏 memfd)
- P3:4(workspace 参数被 dispatch 循环丢弃、args_size 的 size_t→uint32_t 窄化、Faker Clone 继承 inited_ 状态、命名空间多余分号)
各文件审查结论:
base/common/om2/codegen/task_code_builder/fe/custom_task_code_builder.cc— 发现 2 项(workspace 丢弃、size 窄化)base/common/om2/codegen/task_code_builder/fe/custom_task_code_builder.h— 无独立问题(size 窄化声明处已并入 .cc)base/common/om2/om2_model_data.h— 无问题inc/framework/common/helper/om2_package_helper.h— 无问题(接口重构与实现侧一致)runtime/om2/om2_model_executor.cc— 发现 2 项(资源泄漏)tests/framework/ge_runtime_stub/include/faker/custom_taskdef_faker.h— 无问题tests/framework/ge_runtime_stub/include/faker/task_def_faker.h— 无问题tests/framework/ge_runtime_stub/src/custom_taskdef_faker.cc— 发现 2 项(Clone 状态、多余分号)tests/framework/ge_runtime_stub/src/task_def_faker.cc— 无问题tests/ge/st/testcase/test_om2.cc— 无问题tests/ge/ut/ge/common/control_task_code_builder_unittest.cc— 无问题tests/ge/ut/ge/common/program_generator_unittest.cc— 无问题tests/ge/ut/ge/graph/load/om2_package_helper_unittest.cc— 无问题
整体风险判断: 中低风险。核心功能(打包、代码生成、运行时加载)逻辑基本自洽,最主要问题是运行时对自定义共享库的句柄与 memfd 缺少释放路径(P2),长期反复加载/卸载会累积 fd 与 dlopen 句柄,建议优先修复;其余为边界/一致性类的中低优先问题。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 0 |
| 🟡 建议 | 3 |
💬 仅评论


/lgtm


Pull Request
描述
变更摘要
此 PR 为 OM2 模型管线新增了自定义算子(Custom Op)的完整支持。在数据结构侧,
Om2ModelData新增custom_kernel_binaries与custom_shared_libs字段;在打包阶段,Om2PackageHelper新增CollectUsedCustomOpTypes遍历图中自定义算子类型并调用PortableOp::Serialize序列化算子二进制,同时封装自定义算子动态库入库;在代码生成阶段,新增MODEL_TASK_CUSTOM_KERNEL任务类型与CustomTaskCodeBuilder类,生成KernelCustTaskDistribute分发函数及DeserializeCustKernelBinaries反序列化辅助函数;在运行时阶段,om2_model_executor.cc新增对自定义 so 的mmDlopen加载及自定义内核二进制到kernel_bin_info的合并。主要改动
新增
CustomTaskCodeBuilder类与DISPATCH_CUSTOM_KERNEL分发类型:新增custom_task_code_builder.cc/h,实现CustomTaskCodeBuilder类处理MODEL_TASK_CUSTOM_KERNEL任务,生成RenderDispatchCustomKernel等分发逻辑;OpDispatchType枚举扩展增加DISPATCH_CUSTOM_KERNEL = 21,TaskDispatchInfo联合体新增CustomDispatchInfo custom字段新增自定义算子二进制收集与序列化逻辑:
Om2PackageHelper新增CollectUsedCustomOpTypes(遍历 root 图及游离子图收集CustomOpFactory注册的自定义算子类型)、BuildCustomKernelBinaries(调用PortableOp::Serialize序列化)、BuildCustomSharedLibs(读取自定义 op so 文件),并集成到BuildOm2ModelData流程中;同时重构多个 Build 方法接口,将分散的Om2ProgramBody/Om2ModelMeta/Om2ConstantsData等参数统一改为传递Om2ModelData引用新增代码生成中的自定义算子运行时辅助代码:
stable_part_provider.cc新增kCreateClassCustomOpFactory与kCustomTaskHelpers两个 StablePart,分别生成CustomOpFactory类声明和CustKernelContextHolder、KernelCustTaskDistribute、DeserializeCustKernelBinaries等辅助函数;program_generator.cc在存在自定义 kernel 时引入graph/custom_op.h头文件并嵌入相应 StablePart运行时支持自定义 so 加载与内核反序列化:
om2_model_executor.cc新增CustSharedLibInfo结构体,在HandleArchiveEntry中解析data/custom_ops/shared_libs和data/custom_ops/binaries_*条目;模型加载时对自定义 so 执行mmDlopen,并将custom_kernel_binaries合并到kernel_bin_info供后续DeserializeCustKernelBinaries使用新增
OM2_CUSTOM_KERNELS_DIR_FORMAT路径常量与 ZIP 序列化方法:om2_package_contants.h新增OM2_CUSTOM_KERNELS_DIR_FORMAT宏;om2_zip_saver.cc新增SerializeCustomKernelBinaries和SerializeCustomKernelSharedLibs,分别将自定义算子二进制和共享库写入data/custom_ops/目录下的 ZIP 条目变更类型
请选择本次引入的变更类型:
关联的Issue
如何测试
描述测试此变更的步骤和前提条件:
1.
2.
核对清单
其他信息
在此添加任何其他关于本次 PR 的说明。