| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
feat: 支持Eager自定义算子辅流资源编译期统计 Co-authored-by: Chang-an-HW<machangan@huawei.com> # message auto-generated for no-merge-commit merge: !5158 merge eager-custom-op-attached-stream-report into develop feat: 支持Eager自定义算子辅流资源编译期统计 Created-by: Chang-an-HW Commit-by: Chang-an-HW Merged-by: cann-robot Description: # Pull Request ## 描述 为 Eager 自定义算子新增辅流资源编译期统计能力: - 新增 ge::ResourceReportingOp 能力接口与 gert::ResourceUsageContext 上下文(继承 ExtendedKernelContext,零成员变量、standard_layout 断言)。算子编译期按节点申报运行期将通过 RequestAttachedStream 请求的辅流 key(ReportAttachedStreamKeys(const std::vector<ge::AscendString>&),元素类型与运行期接口同型)。 - 框架在 ModelBuilder::BuildModelDefForStream 前遍历 device 侧自定义算子节点(跳过声明式 kAnnotatedArgs 节点防双计),按模型对 key 求 union 去重统计,写入模型属性 eager_custom_op_stream_num,随 OM/模型 cache 持久化(无上报算子不写属性,产物零变化);根/子模型聚合求和不去重(各执行实例独立建流)。 - CompiledGraphSummary::SummaryData 新增私有成员,GetStreamNum() 返回"框架流数 + Eager 辅流统计"(唯一合并点,置于动态图 early-return 之前);无上报算子的模型返回值逐一不变。 - 隔离不变量:统计不进入 ATTR_MODEL_STREAM_NUM、runtime_param.stream_num 与 V2 stream_resource,运行时 V1/V2 零改动,纯编译期旁路观测。 - 配套 API 参考文档:新增 ResourceReportingOp/ResourceUsageContext 两组共 8 篇,更新 GetStreamNum 行为说明与 README 索引(并补齐 EagerOpExecutionContext 遗漏的 RequestAttachedStream 索引行)。 ## 聚合与查询路径说明 针对"纯静态图的根模型 eager 属性聚合走哪条路径、summary 读到的是根模型还是子模型"(检视意见)的确认结论: - **在线/离线同一入口**:atc 离线(GeGenerator::GenerateModel → graph_manager_.BuildGraph,ge_generator.cc:1658-1662)与在线 Session 编译均走 GraphBuilder::Build(graph_builder.cc:302)。 - **纯静态图 = 单 GeModel**:Build 仅在 ATTR_NAME_DYNAMIC_SHAPE_PARTITIONED || GetGraphUnknownFlag() 时进入 BuildForDynamicShapeGraph(:323-324);纯静态走 BuildForKnownShapeGraph,整图仅产生一个 GeModel(:330-335)。引擎分区在 known-shape 路径的产物是任务级的(各引擎 TaskDef 下沉同一 DavinciModel),不产生多个子模型,故不存在"静态多子图独立聚合点"。 - **唯一聚合点**:多 GeModel 仅来自动静拆分(BuildForUnknownShapeAllGraphs :717),聚合点唯一为 RefreshInfoOfDynamicShapeGraph(全仓唯一调用点 :620);stream_num/event_num 的既有根模型聚合同在此处,eager 属性在同一循环内同型求和与溢出检查。 - **summary 读取同源**:GetCompiledGraphSummary 在 graph_manager.cc:5335 选取 ge_model 传入 Builder::Build,SetStreamNum 与 SetEagerCustomOpStreamNum 读取同一模型——静态图为 map 唯一 entry(即根模型),动态图为带聚合值的根模型;两属性任何路径下行为一致,无独立漏计面。 - **边界同构**:图展开场景(:619)跳过聚合(stream_num 亦然);单算子编译单模型(single_op_model.cc:874);ATC 动态离线空壳根模型(ge_generator.cc:668-672)两属性一同缺省 0。 ## 变更类型 - [x] ✨ 新功能 - [x] 📝 文档内容更新 ## 关联的Issue 无 ## 如何测试 1. 新增单元测试 14 个,全部通过: - ut_exe_graph --gtest_filter=ResourceUsageContextUT.*:key 上报/去重/空 key 粘滞错误/节点信息与 tensor 访问(5 个); - ut_libge_multiparts_utest --gtest_filter=UtestModelBuilderTest.CollectEagerCustomOpStreamNum*:per-node 按 shape 分桶申报 union 精确、跨节点去重、声明式/未实现接口/非自定义节点跳过、无命中不写属性、失败传播(含算子吞错误码拦截)(4 个); - ut_libge_multiparts_utest --gtest_filter=GraphBuilderTest.RefreshInfo*:聚合求和不去重、全缺省不写根属性、溢出失败(3 个); - ut_libge_common_utest --gtest_filter=UtestGraphCompileSummaryImpl.*:合并点求和、属性缺省 0 与基线一致、隔离回归(新增 2 个)。 2. 回归测试:ut_exe_graph 全量 681 个、UtestModelBuilderTest/GraphBuilderTest/UtestCustomOpFactory 共 79 个全部通过;lowering/stub_lowering/ge_compiler 增量编译零告警。 3. pre-commit(clang-format/codespell/OAT 等 12 项)全部通过。 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 - 对外接口面:新增 1 个能力接口(ResourceReportingOp::DeclareResourceUsage)+ 1 个上报方法(ReportAttachedStreamKeys);GetStreamNum 为行为变化(仅含上报算子的模型返回值增大),已在 API 文档声明,提请接口评审关注。 - std::vector<AscendString> 只读传引用参数与已发布的 AnnotatedKernelArgs::ExtractArgsData(9.2.0)跨界形态同类,无所有权/分配器跨界。 - 旧 OM 无新属性缺省按 0,旧算子 so 无需重编译,兼容性回归已覆盖。 See merge request: cann/ge!5158 | 9 天前 |