已合并
【fix】: fix GetAllIrAttrs logic #4794
kantao1创建于 9月8日
【fix】: fix GetAllIrAttrs logic #4794
已合并
Pull Request已成功合入, 合并人@CANN-robot
(感谢 kantao1 的贡献)atomgit-bot
9月8日 评论:
9月8日 评论:
变更摘要
本 PR 主要修复 GetAllIrAttrs 的错误处理逻辑:此前当节点缺失某个 IR 属性时会清空全部 runtime_attrs 并返回成功(true),这大概率会在 tiling 阶段报错;现改为记录错误日志并返回失败(false),让缺失属性的情况能提前、显式地暴露出来。同时顺带修正了 KernelContextHolder 移动构造/赋值中 buffer_pool_ 的转移方式、在 ExeGraphSerializer 增加对 compute_node_info 的空指针断言,并同步更新了相关单测以覆盖新的失败路径。
主要改动
- 修复
GetAllIrAttrs缺失属性处理(graph_metadef/exe_graph/lowering/bg_ir_attrs.cc):当属性查找失败时,由原来的runtime_attrs.clear()+ 返回true改为GELOGE(ge::FAILED, ...)并返回false,避免清空全部属性后遗留的隐性错误。 - 修正
KernelContextHolder的移动语义(kernel_run_context_builder.h):移动构造函数与移动赋值中将buffer_pool_由拷贝改为std::move(holder.buffer_pool_),确保资源所有权正确转移。 - 增加
compute_node_info空指针校验(runtime/v2/lowering/exe_graph_serializer.cc):在SerializeComputeNodeInfo创建节点信息后通过GE_ASSERT_NOTNULL断言,创建失败时立即报错而非继续使用空对象。 - 单测同步为失败路径断言(
bg_ir_attrs_unittest.cc、kernel_run_context_builder_unittest.cc):将原“清空属性后成功”的用例改为断言失败结果——GetAllIrAttrs返回false且runtime_attrs为空、CreateAttrBuffer返回nullptr、Build返回GRAPH_FAILED且compute_node_extend_holder_为空。 - 测试构造补充必需属性(
share_graph.cc与两处node_with_infer_rule_test.cc):为 placeholder 补充origin_format、storage_format、expand_dim_rules,为rule_op设置N属性,使测试数据满足新逻辑下对属性完整性的要求。


不准确?
atomgit-bot
9月8日 评论:
9月8日 评论:
此处折叠了74条消息 查看更多
9月14日 添加了label:lgtm
yangyongqiang
9月14日 评论:
9月14日 评论:
/approve


9月14日 添加了label:approved
9月14日 关闭了关联的issue
9月14日 合入了pull request
Pull Request
描述
一、问题背景
gert::bg::GetAllIrAttrs(graph_metadef/exe_graph/lowering/bg_ir_attrs.cc)负责在 lowering/序列化阶段把节点声明的 IR 属性(
OpDesc::GetIrAttrNames(),按 IR 顺序)序列化为运行时属性区(RuntimeAttrsDef),是 tiling/kernel 按索引读取属性的唯一数据源。
原实现中,若名单中某属性在属性 map(
AttrUtils::GetAllAttrs)中找不到值,会清空全部已收集属性并 return true:错误被静默吞掉,推迟到 tiling 阶段才暴露,报错点远离根因,且节点上其余真实属性一并失效。
经分析,"声明了 IR 属性但无值"共有 6 类来源,性质不同:
.ATTR(name, type, default)注册(Operator API 建图).REQUIRED_ATTR(name, type)注册validate_indices、Reshapeaxis其中 REQUIRED 缺值是建模错误(必须报错);可选属性缺值是 IR 设计允许的合法状态(ir_definitions_recover.cc
中已有明确契约注释,框架在符号推导等路径也有对应的默认值回填机制
RecoverIrAttrDefaultValue,但 lowering 链路缺失同等处理)。一刀切 return true(吞错)或一刀切 return false(误伤合法缺省,曾引发 ut_jit_execution/autofuse 等
ASan 崩溃与多处断言失败)都不正确。
二、修改思路
GetAllIrAttrs改为三分支分级语义:GELOGE+ 清空 +return false:fail-fast,错误在 lowering 阶段暴露(此前被推迟到tiling);该路径依赖
KernelContextHolder::context_初始化为 nullptr,保证调用方(如symbolic_shape_inference.cc 的判空)能确定性地接住失败,消除野指针(流水线曾出现的 ASan
heap-buffer-overflow/UAF 崩溃根因);
三个分支均不改变"只允许整体成功或整体失败"的索引对齐不变量(tiling 按索引读取,绝不能跳过单个属性)。
配套修改:
kernel_run_context_builder.h:KernelContextHolder默认构造初始化context_(nullptr)(REQUIRED 失败路径的确定性保障,1 行);
exe_graph_serializer.cc:CreateComputeNodeInfo返回 nullptr 时补判空断言,避免空指针进入AddBuf;ShapeRuleOp的REQUIRED_ATTR(N)在 UT/ST 建图中显式补值;stub 的ConstPlaceHolder补齐REQUIRED 属性(
origin_format/storage_format/expand_dim_rules);符号推导用例显式补设被 es 构图省略的默认值属性(Gather/Range/SoftmaxV2/Reshape);metadef UT 新增 2 个用例分别覆盖分支 1(REQUIRED 报错)与
分支 2(proto 默认值精确回填)。
三、影响面说明
变更类型
关联的Issue
无
如何测试
ut_exe_graph全量 672 通过(含新增CreateAttrBufferFailedWhenRequiredIrAttrLoss、CreateAttrBufferFillOptionalIrAttrWithProtoDefault两个用例);ut_libge_symbol_infer_utest(512 通过,修复原 ASan 崩溃与 2 个断言失败)、ut_jit_execution(121 通过,修复原 ASan 崩溃)、ut_fast_runtime2_test(1772 通过,修复原 ShapeRuleOpUT4 个失败)、
ut_libge_others_utestNodeMatcher/AutoFuse(33 通过);核对清单
其他信息
heavy_format_distribution_fzg_01SEGV 经分析为本 MR 无关的既有测试缺陷(SetUp 中
GetOpStoreAdapter可能返回 nullptr 未判空,ut_heavy_format_propagation_fzg.cc:65;崩溃点位于OpStoreAdapter 注册层,与本 MR 无代码路径交集,且前置 12 个 suite 全部通过),属全局单例初始化顺序类
flaky,建议另行修复测试判空。