已合并
feat: 语言无关Custom Task Info 适配 OM2 #4407
fary86创建于 4 天前
feat: 语言无关Custom Task Info 适配 OM2 #4407
已合并
fary86创建于 4 天前
fary86
4 天前

Pull Request

描述

变更摘要

此 PR 为 OM2 模型管线新增了自定义算子(Custom Op)的完整支持。在数据结构侧,Om2ModelData 新增 custom_kernel_binariescustom_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 = 21TaskDispatchInfo 联合体新增 CustomDispatchInfo custom 字段

  • 新增自定义算子二进制收集与序列化逻辑Om2PackageHelper 新增 CollectUsedCustomOpTypes(遍历 root 图及游离子图收集 CustomOpFactory 注册的自定义算子类型)、BuildCustomKernelBinaries(调用 PortableOp::Serialize 序列化)、BuildCustomSharedLibs(读取自定义 op so 文件),并集成到 BuildOm2ModelData 流程中;同时重构多个 Build 方法接口,将分散的 Om2ProgramBody/Om2ModelMeta/Om2ConstantsData 等参数统一改为传递 Om2ModelData 引用

  • 新增代码生成中的自定义算子运行时辅助代码stable_part_provider.cc 新增 kCreateClassCustomOpFactorykCustomTaskHelpers 两个 StablePart,分别生成 CustomOpFactory 类声明和 CustKernelContextHolderKernelCustTaskDistributeDeserializeCustKernelBinaries 等辅助函数;program_generator.cc 在存在自定义 kernel 时引入 graph/custom_op.h 头文件并嵌入相应 StablePart

  • 运行时支持自定义 so 加载与内核反序列化om2_model_executor.cc 新增 CustSharedLibInfo 结构体,在 HandleArchiveEntry 中解析 data/custom_ops/shared_libsdata/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 新增 SerializeCustomKernelBinariesSerializeCustomKernelSharedLibs,分别将自定义算子二进制和共享库写入 data/custom_ops/ 目录下的 ZIP 条目

变更类型

请选择本次引入的变更类型:

关联的Issue

如何测试

描述测试此变更的步骤和前提条件:
1.
2.

核对清单

其他信息

在此添加任何其他关于本次 PR 的说明。

likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 fary86 的贡献)
Ffary86
4 天前 添加了label:enhancement
Ffary86
4 天前 创建了 pull request,commit 2ccaf216
atomgit-bot
atomgit-bot
4 天前 评论:

变更摘要

本 PR 为 OM2 模型管线引入语言无关自定义算子(Custom Op)的完整支持,覆盖数据结构、打包、代码生成与运行时四个阶段。gert::Om2ModelData 新增 custom_kernel_binariescustom_shared_libs 字段;Om2PackageHelper 在打包阶段收集并序列化图中使用的自定义算子内核二进制,同时封装自定义算子动态库;代码生成阶段新增 CustomTaskCodeBuilderDISPATCH_CUSTOM_KERNEL 分发类型及 kCreateClassCustomOpFactorykCustomTaskHelpers 两个 StablePart,生成 KernelCustTaskDistributeDeserializeCustKernelBinaries 等辅助函数;运行时阶段通过 mmDlopen 加载自定义 so,并将自定义内核二进制合并到 kernel_bin_info 供反序列化使用。

主要改动

  • 新增自定义算子内核与动态库的打包序列化流程: Om2PackageHelper 新增 CollectUsedCustomOpTypesBuildCustomKernelBinariesBuildCustomSharedLibsReadCustomOpSoToBuffer,遍历 root 图及游离子图收集 CustomOpFactory 注册的自定义算子并调用 PortableOp::Serialize 序列化;om2_zip_saver.cc 新增 SerializeCustomKernelBinariesSerializeCustomKernelSharedLibs,配合新增的 OM2_CUSTOM_KERNELS_DIR_FORMAT 路径常量写入 data/custom_ops/ 下的 ZIP 条目。
  • 新增自定义算子代码生成器与分发类型: 新增 CustomTaskCodeBuilder 类处理 MODEL_TASK_CUSTOM_KERNEL 任务并生成 DispatchCustomKernel 分发逻辑;OpDispatchType 扩展 DISPATCH_CUSTOM_KERNEL = 21TaskDispatchInfo 联合体新增 CustomDispatchInfo custom 字段,Om2CodegenUtils 的受支持任务类型集合同步加入 MODEL_TASK_CUSTOM_KERNEL
  • 新增代码生成中的运行时辅助代码与条件嵌入: stable_part_provider.cc 新增 kCreateClassCustomOpFactorykCustomTaskHelpers,生成 CustomOpFactory 类声明以及 BuildGeTensorCustKernelContextHolderKernelCustTaskDistributeDeserializeCustKernelBinaries 等辅助代码;program_generator.cc 在存在自定义内核时引入 graph/custom_op.h 等头文件并嵌入相应 StablePart,LoadAndRunFileCodeGenerator 增加 SetHasCustomKernelhas_custom_kernel_ 控制逻辑。
  • 统一构建接口以传递 Om2ModelData: Om2PackageHelperBuildProgramBodyBuildKernelBinariesBuildModelMetaBuildConstantsDataBuildDebugInfoBuildManifestOm2Codegen::Om2CodegenAndCompile 的接口由分散的参数改为统一接收 gert::Om2ModelData 引用,简化了数据传递并支持新字段。
  • 运行时加载自定义 so 与内核反序列化: om2_model_executor.cc 新增 CustSharedLibInfo 结构体,HandleArchiveEntry 解析 data/custom_ops/shared_libsdata/custom_ops/binaries_* 条目;模型加载时对自定义 so 执行 mmDlopen,并将 custom_kernel_binaries 合并到 kernel_bin_infoDeserializeCustKernelBinaries 使用。
likedislike
atomgit-bot
atomgit-bot
4 天前 评论:

代码审查

所有关键发现已上报。以下为各变更文件的审查结论汇总。

审查结论汇总

已审查的 13 个文件:

  1. base/common/helper/om2/om2_package_contants.h — 新增路径常量宏,无问题。
  2. base/common/helper/om2/om2_zip_saver.cc — 新增两个序列化函数并接入 Save,与现有 SerializeKernelBinaries 模式一致,无问题。
  3. base/common/helper/om2_package_helper.cc — 发现 4 个问题(P2×1、P3×3)。
  4. base/common/om2/codegen/ast/ast_nodes.h — 新增两个 StablePartId 枚举值,无问题。
  5. base/common/om2/codegen/emitter/stable_parts/stable_part_provider.cc — 新增 CustomDispatchInfo 及两个 StablePart 生成字符串,无独立可确证问题。
  6. base/common/om2/codegen/file_code_generator/load_and_run_file_code_generator.cc — 新增 DispatchCustomKernel 映射与 DeserializeCustKernelBinaries 调用,无独立问题。
  7. base/common/om2/codegen/file_code_generator/load_and_run_file_code_generator.h — 新增 setter 与布尔成员,无问题。
  8. base/common/om2/codegen/om2_codegen.cc — 发现 1 个问题(P2:has_custom_kernel 门控依据错误)。
  9. base/common/om2/codegen/om2_codegen.h — 签名收敛为 Om2ModelData 引用,include 替换正确,无问题。
  10. base/common/om2/codegen/om2_codegen_types.h — 新增枚举值与 ToString()sizeof 循环,名称数组与枚举对齐,无问题。
  11. base/common/om2/codegen/om2_codegen_utils.cc — 将 MODEL_TASK_CUSTOM_KERNEL 加入支持集合,与已存在的 CustomTaskCodeBuilder 注册一致,无问题。
  12. base/common/om2/codegen/program_generator.cc — 条件注入自定义算子头文件与 StablePart,逻辑正确,无独立问题。
  13. 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_ 状态、命名空间多余分号)

各文件审查结论:

  1. base/common/om2/codegen/task_code_builder/fe/custom_task_code_builder.cc — 发现 2 项(workspace 丢弃、size 窄化)
  2. base/common/om2/codegen/task_code_builder/fe/custom_task_code_builder.h — 无独立问题(size 窄化声明处已并入 .cc)
  3. base/common/om2/om2_model_data.h — 无问题
  4. inc/framework/common/helper/om2_package_helper.h — 无问题(接口重构与实现侧一致)
  5. runtime/om2/om2_model_executor.cc — 发现 2 项(资源泄漏)
  6. tests/framework/ge_runtime_stub/include/faker/custom_taskdef_faker.h — 无问题
  7. tests/framework/ge_runtime_stub/include/faker/task_def_faker.h — 无问题
  8. tests/framework/ge_runtime_stub/src/custom_taskdef_faker.cc — 发现 2 项(Clone 状态、多余分号)
  9. tests/framework/ge_runtime_stub/src/task_def_faker.cc — 无问题
  10. tests/ge/st/testcase/test_om2.cc — 无问题
  11. tests/ge/ut/ge/common/control_task_code_builder_unittest.cc — 无问题
  12. tests/ge/ut/ge/common/program_generator_unittest.cc — 无问题
  13. tests/ge/ut/ge/graph/load/om2_package_helper_unittest.cc — 无问题

整体风险判断: 中低风险。核心功能(打包、代码生成、运行时加载)逻辑基本自洽,最主要问题是运行时对自定义共享库的句柄与 memfd 缺少释放路径(P2),长期反复加载/卸载会累积 fd 与 dlopen 句柄,建议优先修复;其余为边界/一致性类的中低优先问题。

类型 数量
🔴 阻塞 0
🟡 建议 3

💬 仅评论

likedislike
CANN-robotCANN-robot成员
4 天前 添加了label:cann-cla/yes
此处折叠了53条消息 查看更多
yangyongqiang
yangyongqiang成员
4 天前 评论:

/lgtm

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

/approve

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