已合并
【fix】: fix GetAllIrAttrs logic #4794
kantao1创建于 9月8日
【fix】: fix GetAllIrAttrs logic #4794
已合并
kantao1创建于 9月8日
kantao1成员
9月8日

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 类来源,性质不同:

来源 名值关系 典型场景
proto .ATTR(name, type, default) 注册(Operator API 建图) 名值俱全 FE/ATC 正常建图
proto .REQUIRED_ATTR(name, type) 注册 有名无值(无默认值,依赖用户显式 set) 建模遗漏即为错误
模型反序列化恢复(model_serialize.cc) 随原节点 om/图加载
IR 版本向后兼容恢复(ir_definitions_recover.cc kBackward) 有名无值(只补新增属性名) 旧版本图 + 新版本算子
es 构图声明(CompliantNodeBuilder) optional 属性等于默认值时有名无值(CreateFromIfNotEqual 省略,为 IR 层公开设计契约) PyTorch/eager 建图,如 Gather validate_indices、Reshape axis
测试/工具手工登记(AppendIrAttrName) 看写法 UT 故意缺属性走默认值(如 Moe 系列用例)

其中 REQUIRED 缺值是建模错误(必须报错);可选属性缺值是 IR 设计允许的合法状态(ir_definitions_recover.cc
中已有明确契约注释,框架在符号推导等路径也有对应的默认值回填机制 RecoverIrAttrDefaultValue,但 lowering 链路缺失
同等处理)。一刀切 return true(吞错)或一刀切 return false(误伤合法缺省,曾引发 ut_jit_execution/autofuse 等
ASan 崩溃与多处断言失败)都不正确。

二、修改思路

GetAllIrAttrs 改为三分支分级语义:

  1. REQUIRED 属性缺值 → 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 默认值精确回填)。

三、影响面说明

  • 生产建图(FE/ATC 经 Operator API)属性名值俱全,主路径零行为变化;
  • es 建图的"等于默认值的可选属性"将从省略变为显式包含在属性区(语义等价,对 tiling 无影响);

变更类型

关联的Issue

无

如何测试

  1. 本地 metadef UT:ut_exe_graph 全量 672 通过(含新增 CreateAttrBufferFailedWhenRequiredIrAttrLoss、
    CreateAttrBufferFillOptionalIrAttrWithProtoDefault 两个用例);
  2. 本地 GE UT 回归:ut_libge_symbol_infer_utest(512 通过,修复原 ASan 崩溃与 2 个断言失败)、
    ut_jit_execution(121 通过,修复原 ASan 崩溃)、ut_fast_runtime2_test(1772 通过,修复原 ShapeRuleOpUT
    4 个失败)、ut_libge_others_utest NodeMatcher/AutoFuse(33 通过);
  3. 流水线重跑 ut_rt / st_rt / ut_ge_common / st_hetero / ut_fe 确认。

核对清单

其他信息

  • 流水线 ut_fe_shape_common 的 heavy_format_distribution_fzg_01 SEGV 经分析为本 MR 无关的既有测试缺陷
    (SetUp 中 GetOpStoreAdapter 可能返回 nullptr 未判空,ut_heavy_format_propagation_fzg.cc:65;崩溃点位于
    OpStoreAdapter 注册层,与本 MR 无代码路径交集,且前置 12 个 suite 全部通过),属全局单例初始化顺序类
    flaky,建议另行修复测试判空。
likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 kantao1 的贡献)
Kkantao1成员
9月8日 添加了label:enhancement
Kkantao1成员
9月8日 创建了 pull request,commit 56105a77
Kkantao1成员
9月8日 关联了issue:[Bug-Report|缺陷反馈]: bg_ir_attrs.cc中GetAllIrAttrs接口,找不到任一ir属性就清空所有ir属性,报错流到下游
atomgit-bot
atomgit-bot
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 属性,使测试数据满足新逻辑下对属性完整性的要求。
likedislike
不准确?
atomgit-bot
atomgit-bot
9月8日 评论:

代码审查

✅ 未发现问题

likedislike
不准确?
此处折叠了74条消息 查看更多
CANN-robotCANN-robot成员
9月14日 添加了label:lgtm
yangyongqiang
yangyongqiang成员
9月14日 评论:

/approve

likedislike
CANN-robotCANN-robot成员
9月14日 添加了label:approved
CANN-robotCANN-robot成员
9月14日 关闭了关联的issue
CANN-robotCANN-robot成员
9月14日 合入了pull request