| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
feat: Eager自定义算子RT2路径辅流申请功能 Co-authored-by: Chang-an-HW<machangan@huawei.com> # message auto-generated for no-merge-commit merge: !5139 merge eager-custom-op-attached-stream-RT2 into develop feat: Eager自定义算子RT2路径辅流申请功能 Created-by: Chang-an-HW Commit-by: Chang-an-HW Merged-by: cann-robot Description: # Pull Request ## 描述 2026829评审通过 为 Eager 自定义算子( EagerExecuteOp)在 **RT2 动态图执行链路** 补齐按 key 申请框架托管物理辅流的能力。此前该能力只在 V1 静态图链路可用,RT2 下 EagerOpExecutionContext::RequestAttachedStream 因 EagerArgsHandler 未提供 provider 而恒返回 nullptr。 **公共 API 与 ABI 零改动,用户算子代码零改动**:RequestAttachedStream 签名、AdditionalInputIndex/AdditionalOutputIndex 布局、ArgsHandler::GetAttachedStreamProvider() 均不变,仅扩展 v2 内部枚举 CustomOpInput。 ### 核心链路 text LoweringCustomNode(Main 帧) └─ bg::GetAttachedStreamProvider → Init 图 CreateAttachedStreamProvider(每模型一份) └─ 作为 ExecuteCustomOp 附加输入 CustomOpInput::kAttachedStreamProvider ExecuteCustomOpImpl → 首轮 !IsInitialized() 时注入 EagerArgsHandler 用户 Execute(ctx) → RequestAttachedStream(key) → Rt2AttachedStreamCollection ### 关键设计 - **归属层级 per-ModelV2Executor**:容器由 Init 图节点的输出 Chain 持有。StreamExecutor 为每条 aclrtStream 各建一个执行器,故不同执行流即使用相同 key 也拿到不同辅流;换来天然隔离且**无需加锁**(ExecuteCustomOp 已注册 kKernelUseMemory,固定在唯一 memory worker 上串行执行)。 - **与 V1 的差异**:RT2 无 rtModel_t,不做 aclmdlRIBindStream;StreamActive 在 RT2 已退化为透传,不存在 V1 的 WAIT_ACTIVE 激活坑,按默认 flag 建流即可。 - **生命周期**:执行器析构时 Chain deleter 触发 Destroy()(先 aclrtSynchronizeStream 再 aclrtDestroyStream,幂等)。现有卸载路径(UnloadRt2Model → DeleteExecutor、StreamExecutor::Erase)都在 UnLoad() 后立即销毁执行器,故无需额外 DeInit 节点。 - **执行期开销**:RT2 下 Execute 每轮都会被调用(V1 只在下沉期一次),故 key 查找用透明比较容器(std::less<> + string_view),命中路径零堆分配,host 微基准约 25.3 ns/次。 - **不做数量限制**:单执行实例的辅流数量不设上限(与 V1 实现一致);建流失败时打印 error 日志并返回 nullptr,由算子自行降级。 - **内存回收契约**:辅流不是框架逻辑流,RT2 多流 L2 回收不感知它,故算子必须在 Execute 返回前用 event 把辅流 join 回 ctx->GetStream(),已写入 API 文档约束说明。 ### 顺带修复的既存缺陷 RT2 内嵌 V1 静态子图场景下 Eager 算子申请的辅流**确定性泄漏**:DavinciModelFinalizer 未清理辅流,而 DestroyResources() 会置 has_finalized_ = true,导致 ~DavinciModel() 中含 UnbindAndDestroy() 的兜底清理块被整体跳过。修复:新增幂等的 DavinciModel::UnbindAndDestroyAttachedStreams(),由 Finalizer 在 DestroyStream() 之前调用。 ### 行为变化(需评审确认) 1. RT2 下 RequestAttachedStream 由恒 nullptr 变为可返回有效句柄——对以 nullptr 判定"链路不支持"的算子属行为变化。 2. 取消 CANN-FMK- 前缀的**硬拦截**(后续 HCCL 等框架组件也要通过本接口建流),改为 API 文档中的命名约定,key 校验统一为"仅判空"。属放宽型变化,原被拒绝的 key 现在会成功。 ### 对既有动态图流程的影响 - **不含 device 自定义算子的图:零影响**。bg::GetAttachedStreamProvider 全仓唯一调用点在 LoweringCustomNode,而它只注册给 kCustomOpKernelLibName + kOnDeviceHbm,这类图不会新增任何节点或输入。 - **含 device 自定义算子的图**:Init 图 +1 个 no-op 节点(每模型一份)、每个算子节点 +1 条输入边、Main 帧 +1 个 InnerData、每执行器 +1 个约 64B 容器对象;**每轮执行开销为 0**(provider 只在首轮读取一次)。 - Host CPU 自定义算子路径未触碰;OM/OM2 序列化不受影响(SerializeComputeNodeInfo 只遍历 IR 计算节点);profiling/dump/trace 只按 IR 输入数遍历,不受附加输入影响。 ### 本 PR 不包含 Python 绑定(因 ST fallback 编译问题临时移除)、动态 shape 端到端样例、OM2 路径(其 context 由 codegen SO 内部构造且跨 OM2 C ABI)。 ## 变更类型 - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [x] 📝 文档内容更新 ## 关联的Issue 无 ## 如何测试 1. 以动态 shape 图验证:Execute 每轮都被调用(RT2 链路生效)、辅流句柄多轮恒定不变(跨轮次跨 shape 复用)、异 key 隔离、每轮精度全部通过。 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 无 See merge request: cann/ge!5139 | 3 天前 | |
feat: part2 完善HostCPU自定义算子运行时与常量折叠支持 Co-authored-by: du-hua1024<duhua2@huawei.com> # message auto-generated for no-merge-commit merge: !4538 merge new into develop feat: part2 完善HostCPU自定义算子运行时与常量折叠支持 Created-by: du-hua1024 Commit-by: du-hua1024 Merged-by: cann-robot Description: # 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 自定义算子实例; - 支持 ExecuteHostCustomOp 和 ExecuteHostCustomOpWithInferShape; - 使用 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 后端感知检查。 ## 变更类型 - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 如何测试 - 编译 GE compiler、Runtime V2 及相关单元测试目标。 - 执行 HostCPU 自定义算子引擎更新、图分区、常量折叠、Runtime V2 converter/kernel 相关 UT。 - 验证 Device 自定义算子路径保持原有编译、分区和执行行为。 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已补充相关单元测试 - [x] 我已更新全部相关文档 - [x] 我在标题中使用了合适的类型标签(如:feat:、fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守其中的相关规定 ## 其他信息 本 PR 相对目标分支涉及 33 个文件,新增约 1384 行、删除约 50 行。Device 自定义算子与 HostCPU 自定义算子通过后端注册信息和 lowering 属性区分,HostCPU 路径不会进入 Device 自定义算子编译流程。 See merge request: cann/ge!4538 | 30 天前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 3 天前 | ||
| 30 天前 |