已合并
【fix】: OM2去除内核二进制重复加载 #4640
【fix】: OM2去除内核二进制重复加载 #4640
已合并
wangbin创建于 9 天前
wangbin成员
9 天前

Pull Request

描述

本 PR 的核心目的是去除内核二进制(kernel binary)的重复加载:新增一个按 bin_id 全局缓存 aclrtBinHandle 的存储(store),并通过引用计数管理其生命周期。改动引入 runtime/om2/om2_kernel_handles.cc/h 新模块,扩展 GertModelCallbacks 回调集,同时在 codegen 生成侧(Om2Model 构造、内核注册与资源释放逻辑)接入该缓存,注册内核时先查询缓存、命中则复用、未命中才真正加载并保存;释放资源时依据引用计数决定是否卸载。该改动贯穿运行时执行器(om2_model_executor.cc)、稳定代码生成(stable_part_provider.cc)及各 codegen 文件生成器。

变更类型

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

关联的Issue

如何测试

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

核对清单

其他信息

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

likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 wangbin 的贡献)
Wwangbin成员
9 天前 添加了label:enhancement
Wwangbin成员
9 天前 创建了 pull request,commit 8c424ca6
atomgit-bot
atomgit-bot
9 天前 评论:

变更摘要

本 PR 的核心目的是去除内核二进制(kernel binary)的重复加载:新增一个按 bin_id 全局缓存 aclrtBinHandle 的存储(store),并通过引用计数管理其生命周期。改动引入 runtime/om2/om2_kernel_handles.cc/h 新模块,扩展 GertModelCallbacks 回调集,同时在 codegen 生成侧(Om2Model 构造、内核注册与资源释放逻辑)接入该缓存,注册内核时先查询缓存、命中则复用、未命中才真正加载并保存;释放资源时依据引用计数决定是否卸载。该改动贯穿运行时执行器(om2_model_executor.cc)、稳定代码生成(stable_part_provider.cc)及各 codegen 文件生成器。

主要改动

  • 新增全局 BinHandle 缓存管理:新增 om2_kernel_handles.cc/h,实现单例 Om2KernelHandlesManager(内部以 recursive_mutex 加锁、unordered_map 存储 BinHandleInfo{bin_handle, refer_count}),对外导出 LockBinHandleStoreUnlockBinHandleStoreQueryBinHandleFromStoreQueryBinHandleReferCountFromStoreSaveBinHandleToStoreEraseBinHandleFromStore 六个 C 接口,查询命中自动加引用计数、擦除时递减至 0 才移除。

  • 扩展 GertModelCallbacks 回调接口:在 gert_model_executor_types.h 与稳定代码模板 stable_part_provider.cc 中为 GertModelCallbacks 新增上述六个 bin handle 存储相关回调字段;om2_model_executor.cc 在构造 GertModelCallbacks 时将六个字段绑定到 om2_kernel_handles 的实现。

  • 内核注册去重逻辑kernel_reg_file_code_generator.ccRegisterAicoreKernelRegisterAicpuKernelRegisterCustAicpuKernel 新增 bin_idcallbacks 参数,注册前先 lock_bin_handle_storequery_bin_handle_from_store,仅在查询为空时才调用 AclrtBinaryLoadFromData/AclrtBinaryLoadFromFile 加载并 save_bin_handle_to_store,实现重复加载的消除。

  • 生成代码侧结构扩展interface_file_code_generator.ccresources_file_code_generator.ccom2_model_class_generator_base.cc/hOm2Model 增加 callbacks 构造参数、callbacks_bin_ids_ 成员(构造时按 kernel_bin_num resize);BuildReleaseResourcesMethod 改为遍历 bin_ids_ 查询引用计数,仅当 refer_count > 1 才跳过卸载、否则 AclrtBinaryUnLoaderase_bin_handle_from_store

  • bin_id 生成与传递om2_codegen_model_builder.cc 为 aicore/aicpu/cust aicpu/TF aicpu 各类内核生成 bin_id(aicore 优先取 _memset_kernel_bin_idATTR_NAME_KERNEL_BIN_ID 算子属性,缺失时用 session graph id + 模型名 + 算子名拼装;其余类型按 op_typeso_name、哈希值等拼接),并将其写入新增字段 KernelBinaryRecord::bin_id,同时 BuildKernelRegistryForAicore 增加 task_def 参数用于判定分隔清理任务。

likedislike
不准确?
atomgit-bot
atomgit-bot
9 天前 评论:

代码审查

I have completed my review. All findings have been reported. Here is the closing summary.

关闭总结

变更总体风险评估

本 PR 的目标是在 OM2 模型执行路径中引入全局 BinHandle 缓存(按 bin_id 去重、引用计数管理、mutex 保护),避免同一内核二进制被重复加载。整体设计(register 路径的 lock/query/save 与 ReleaseResources 的 query_refer_count/unload/erase 配对、递归互斥锁串行化加载)经逐条推演在正常流程下是自洽的,但引入了一个确定的 P1 级字段错位 bug,会让所有 TF Aicpu 内核的注册表数据错乱;另有 aicpu 缓存键粒度不足、多个 C 接口健壮性缺口、以及高风险的并发/引用计数逻辑完全没有测试覆盖。

按优先级的 finding 统计

  • P1:1 个BuildKernelRegistryForTFAicpu / BuildKernelRegistryForTFAicpuSessionKernelBinaryRecord 聚合初始化在新增 bin_id 字段后少补 file_name 占位,9 个初值错位填 10 个字段:op_type/so_name/op_kernel_lib 全部串位,magic 收到 0U(构造 nullptr 的 UB),func_handle_index 恒为 0,导致 TF Aicpu 内核注册槽位冲突、aicpu JSON 加载参数错误。
  • P2:1 个 — aicpu 的 bin_id 缓存键只含 op_type + so_name,遗漏 kernel_name/op_kernel_lib,同 op_type+so 的不同内核会误复用按第一份参数加载的 bin_handle,可能执行错误内核。
  • P3:3 个QueryBinHandleFromStore 未校验 bin_handle 输出指针;生成的 Om2Model 构造函数对 callbacks 无条件解引用、Om2ModelCreate 缺 null 校验;BinHandle 缓存引用计数/释放配对逻辑无任何测试覆盖。

各文件审查结论

  • stable_part_provider.cc — 已审;新增 callbacks 参数与 6 个回调字段,与 gert_model_executor_types.h 布局一致;仅 Om2ModelCreate 缺 callbacks 判空(并入 P3 finding)。
  • interface_file_code_generator.cc — 已审;构造函数签名、callbacks_/bin_ids_ 字段与生成代码一致,无问题。
  • kernel_reg_file_code_generator.cc — 已审;三个注册函数的 lock/query/save/guard 流程与引用计数配对推演一致,无独立问题。
  • kernel_reg_file_code_generator.h — 已审;签名与实现一致,无问题。
  • resources_file_code_generator.cc — 已审;构造函数 callbacks_(*callbacks) 解引用缺防护(已报 P3),ReleaseResources 引用计数逻辑自洽。
  • om2_codegen_model_builder.cc — 已审;P1(TF Aicpu 初始化错位)与 P2(aicpu 缓存键粒度)均在此文件
  • om2_codegen_model_builder.h — 已审;签名同步,无问题。
  • om2_codegen_types.h — 已审;bin_id 字段插入位置确认了 P1 错位根因,无独立问题。
  • om2_model_class_generator_base.cc / .h — 已审;bin_ids_/callbacks_ VarRef 与各生成器用法一致,无问题。
  • gert_model_executor_types.h — 已审;新回调类型/字段与生成代码 struct 逐字段对齐,无问题。
  • om2_kernel_handles.cc — 已审;QueryBinHandleFromStore 缺输出指针判空(P3),引用计数实现本身一致。
  • om2_kernel_handles.h — 已审;接口声明与实现一致,无问题。
  • om2_model_executor.cc — 已审;回调填充完整、生命周期(局部 callbacks 被构造函数拷贝)安全,无问题。

总体判断:此变更存在 1 个高置信度 P1 数据错位 bug(TF Aicpu 路径),在合并前必须修复;其余为 P2/P3 级风险,建议一并处理(尤其 aicpu 缓存键粒度与引用计数测试)。

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

⛔ 需要修改

likedislike
不准确?
CANN-robotCANN-robot成员
9 天前 添加了label:cann-cla/yes
此处折叠了262条消息 查看更多
GengChao
GengChao成员
8 天前 评论:

/lgtm

likedislike
CANN-robotCANN-robot成员
8 天前 添加了label:lgtm
yangyongqiang
yangyongqiang成员
8 天前 评论:

/approve

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