已合并
feat: part2 完善HostCPU自定义算子运行时与常量折叠支持 #4538
duhua创建于 8 天前
feat: part2 完善HostCPU自定义算子运行时与常量折叠支持 #4538
已合并
duhua创建于 8 天前
duhua
duhua成员
8 天前

Pull Request

描述

本 PR 完善后端感知自定义算子的 HostCPU 执行链路,打通编译期识别与分流、Runtime V2 下沉执行、ShapeInfer、常量折叠及配套单元测试。HostCPU 自定义算子使用独立的 lowering 标识和执行上下文,避免被当作 Device 自定义算子编译或按 AI Core 归属分区。

主要修改点

1. HostCPU 自定义算子编译与分区

  • DNNEngineManager 中识别注册到 OpBackend::kHostCPU 的自定义算子,并将其设置为 Custom Engine、Custom Op Kernel Lib,同时写入 host_cpu_custom_op_lower_func lowering 属性。
  • HostcpuEngineUpdatePass 中保留 HostCPU 自定义算子的 Custom Engine 归属,避免被错误迁移到普通 HostCPU 或 Device 执行路径。
  • EnginePartitioner 二次分区时区分 Device 自定义算子和 HostCPU 自定义算子:前者跟随 AI Core,后者跟随 DNN_VM_HOST_CPU
  • 在动态 Shape 分区及未知 Shape 标记流程中,将 HostCPU 自定义算子按 HostCPU 节点处理。
  • 在 Custom Engine 编译任务生成阶段跳过 HostCPU 自定义算子的 Device 编译;算子支持性检查改为使用后端感知注册信息。

2. Runtime V2 HostCPU 自定义算子执行

  • 新增 HostCPU 自定义算子 converter:
    • 从 Host 侧 lowering 结果构造输入 Tensor 和地址;
    • 使用 Host allocator 分配输出;
    • 注册 host_cpu_custom_op_lower_func 对应的节点 converter;
    • 增加输出内存释放及输入地址生命周期依赖。
  • 新增 HostCPU 自定义算子 kernel:
    • 查找 HostCPU 自定义算子实例;
    • 支持 ExecuteHostCustomOpExecuteHostCustomOpWithInferShape
    • 使用 HostCpuOpExecutionContext 调用 HostCpuExecuteOp::Execute
    • 补充输出创建、Trace 和 Profiling 逻辑。
  • ShapeInfer 链路改为通过 kShapeInfer 能力获取 ShapeInferOp,新增 FindCustomShapeInferOp kernel,避免先获取通用 BaseCustomOp 再转换。
  • 抽取公共输出模板 Tensor 处理逻辑,兼容 Device 和 HostCPU 两类自定义算子执行路径。

3. HostCPU 自定义算子常量折叠

  • 在常量折叠阶段优先尝试执行注册为 HostCpuExecuteOp 的自定义算子。
  • 新增 HostCPU 常量折叠专用内存分配器、TensorData 管理和 HostCpuOpExecutionContext 构造逻辑。
  • 将 GE Tensor 转换为 GERT Tensor,执行 HostCPU 自定义算子后再转换回 GE Tensor。
  • HostCPU 自定义算子执行失败时,继续回退到已有 HostCPU Kernel 和内置 Kernel 路径。

4. 执行上下文、构建及可观测性

  • MakeOutputRefInput 调整为非 const 接口,移除内部 const_cast,同步更新实现、头文件及离线 stub。
  • 增加 HostCPU 自定义算子 lowering 常量、Profiler 类型注册及 compiler 对 gert 的链接依赖。
  • 更新相关 Runtime V2、编译器和 ShapeInfer 接口声明。

5. 测试覆盖

新增或扩展以下单元测试:

  • HostCPU 自定义算子引擎更新、DNN Engine 选择及图分区;
  • 动态/未知 Shape 分区;
  • HostCPU 自定义算子常量折叠;
  • Runtime V2 custom converter、kernel 及 ShapeInfer;
  • 自定义算子 Kernel Info Store 后端感知检查。

变更类型

如何测试

  • 编译 GE compiler、Runtime V2 及相关单元测试目标。
  • 执行 HostCPU 自定义算子引擎更新、图分区、常量折叠、Runtime V2 converter/kernel 相关 UT。
  • 验证 Device 自定义算子路径保持原有编译、分区和执行行为。

核对清单

其他信息

本 PR 相对目标分支涉及 33 个文件,新增约 1384 行、删除约 50 行。Device 自定义算子与 HostCPU 自定义算子通过后端注册信息和 lowering 属性区分,HostCPU 路径不会进入 Device 自定义算子编译流程。

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

变更摘要

本 PR 为自定义算子体系引入后端(kDevice / kHostCPU)维度,新增 Host CPU 自定义算子的注册、编译与运行时执行能力,并将自定义算子 pull registry ABI 升级到 V2(同时兼容历史 V1 SO 加载)。核心改动包括:CustomOpRegistry / CustomOpFactory 的注册与查询接口(RegisterCreatorCreateOrGetCustomOpHasCreatorFindCustomOp)新增 OpBackend 参数并按后端分层存储;新增 HostCpuExecuteOp 接口与 HostCpuOpExecutionContext(含 MallocOutputTensor / MakeOutputRefInput);引擎选择、图分区与优化 pass 识别并路由 host CPU 自定义算子(kHostCpuCustomOpLowerFunc);runtime v2 新增 FindHostCpuCustomOpExecuteHostCustomOpExecuteHostCustomOpWithInferShape 内核与 LoweringHostCustomNode 转换,并配套安装打包、profiling 类型与大量测试更新。

主要改动

  • 自定义算子注册表支持后端维度OpBackend 枚举(kDevice/kHostCPU)引入后,CustomOpRegistrycreators_/custom_ops_ 改为按 op_type -> backend -> creator/instance 分层存储,RegisterCreatorCreateOrGetCustomOpHasCreatorFindCustomOpHasCustomOp 等接口新增带 backend 的重载并校验非法后端;custom_op_registry_builder.cc 按 ABI 版本(kCustomOpCreatorPullAbiVersion / kCustomOpCreatorPullAbiVersionV2)分派加载 V1/V2 的 creator。
  • Pull registry ABI 升级到 V2custom_op_pull_registry.h/cc 新增带 backend 字段的 CustomOpTypeToCreatorV2(V1 布局保留用于加载历史 SO),GetRegisteredCustomOpCreators 导出 V2 结构并校验 OpBackend 合法性,GetRegisteredCustomOpCreatorAbiVersion 返回 kCustomOpCreatorPullAbiVersionV2
  • 新增 Host CPU 自定义算子执行接口与上下文custom_op.h 新增 HostCpuExecuteOp 接口、REG_OP_BACKEND 注册宏及 CustomOpCreatorRegister 的 backend 重载,cast.h 新增 kHostCpuExecute 能力位映射;新增 HostCpuOpExecutionContext(含 MallocOutputTensor 通过 host 分配器申请输出内存、MakeOutputRefInput 复用输入内存),并同步加入 cmake/package.cmakeGeExecutorInc.xml 的安装文件清单。
  • 引擎选择与图流程适配 host CPU 自定义算子DNNEngineManager::GetDNNEngineName 将 host CPU 自定义算子路由到 custom 引擎并设置 kAttrLowingFunc = kHostCpuCustomOpLowerFuncHostcpuEngineUpdatePassEnginePartitionerDynamicShapePartitionerMarkGraphUnknownStatusPass 新增 IsCustomOpExecOnHostCpu 识别逻辑(host 自定义算子保持 custom 引擎并标记为未知/主机执行,二次分区时挂靠 DNN_VM_HOST_CPU 流),CustomGraphOptimizer 跳过 host CPU 自定义算子的设备编译。
  • runtime v2 新增 Host CPU 执行链路与公共能力查询custom_node_converter.cc 新增 LoweringHostCustomNode(注册到 kHostCpuCustomOpLowerFunc 的 placement),custom_op_kernel.cc 新增 FindHostCpuCustomOpExecuteHostCustomOpExecuteHostCustomOpWithInferShape 内核并注册 ExecuteHostCustomOp 等 profiling 类型;同时 CustomOpRegistry 新增 GetCustomOpCommonCapabilitymodel_custom_kernels_helper.ccge_root_model.ccop_desc_utils_ex.ccbg_infer_shape.cc 等改为按 kPortable/kShapeInfer/kInferMeta 公共能力跨后端获取唯一实现(如不可序列化自定义算子不再报错而是标记为非可序列化)。
likedislike
atomgit-bot
atomgit-bot
8 天前 评论:

代码审查

✅ 未发现问题

likedislike
CANN-robotCANN-robot成员
8 天前 添加了label:stat/needs-squash
此处折叠了385条消息 查看更多
张德鹏成员
5 天前 评论:

/approve cancel

likedislike
shengnan成员
4 天前 评论:

/lgtm

likedislike
shengnan成员
4 天前 评论:

/approve

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