Pull Request已成功合入, 合并人@CANN-robot
(感谢 wangbin 的贡献)变更摘要
本 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}),对外导出LockBinHandleStore、UnlockBinHandleStore、QueryBinHandleFromStore、QueryBinHandleReferCountFromStore、SaveBinHandleToStore、EraseBinHandleFromStore六个 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.cc中RegisterAicoreKernel、RegisterAicpuKernel、RegisterCustAicpuKernel新增bin_id与callbacks参数,注册前先lock_bin_handle_store并query_bin_handle_from_store,仅在查询为空时才调用AclrtBinaryLoadFromData/AclrtBinaryLoadFromFile加载并save_bin_handle_to_store,实现重复加载的消除。 -
生成代码侧结构扩展:
interface_file_code_generator.cc、resources_file_code_generator.cc及om2_model_class_generator_base.cc/h为Om2Model增加callbacks构造参数、callbacks_与bin_ids_成员(构造时按kernel_bin_numresize);BuildReleaseResourcesMethod改为遍历bin_ids_查询引用计数,仅当refer_count > 1才跳过卸载、否则AclrtBinaryUnLoad并erase_bin_handle_from_store。 -
bin_id 生成与传递:
om2_codegen_model_builder.cc为 aicore/aicpu/cust aicpu/TF aicpu 各类内核生成bin_id(aicore 优先取_memset_kernel_bin_id或ATTR_NAME_KERNEL_BIN_ID算子属性,缺失时用 session graph id + 模型名 + 算子名拼装;其余类型按op_type、so_name、哈希值等拼接),并将其写入新增字段KernelBinaryRecord::bin_id,同时BuildKernelRegistryForAicore增加task_def参数用于判定分隔清理任务。


代码审查
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/BuildKernelRegistryForTFAicpuSession的KernelBinaryRecord聚合初始化在新增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 |
⛔ 需要修改


/lgtm


/approve


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 的说明。