已合并
feat: 支持静态Shape根据ub大小过滤非法template #964
feat: 支持静态Shape根据ub大小过滤非法template #964
已合并
zhang_shengjie创建于 6月21日
zhang_shengjie成员
6月21日

Pull Request

描述

一、主要解决的问题

Autofuse 在 schedule 模板生成后,所有模板会进入 ATT 生成 tiling func 和 solver 阶段。部分模板在所有可调 tile 取最小值 1、动态轴取 1 时的最小 UB 占用已超过平台 UB 上限,属于必然无解模板,但仍消耗后续编译资源。

本 PR 在 BufQueAllocator().AllocBufQue() 之后新增 StaticUbTemplateFilter,提前丢弃必然无解的模板,减少无效编译开销。同时将 ATT 与 Schedule 共用的 UB 表达式构建逻辑抽取到 autofuse/common/ub_expr/,保证两端使用同一份 UB 表达式来源。

二、修改方案

2.1 新增 StaticUbTemplateFilter(optimize 层)

  • optimize.cppAllocBufQue 之后调用 StaticUbTemplateFilter().Filter()
  • 遍历 FusedScheduledResult 中每个 ScheduledResult 的 schedule group/impl graph
  • 通过公共 AscGraphUbExprBuilder 构建 UB 表达式上下文
  • 对 tile inner axis 替换为 1、动态轴替换为 1,执行静态求值得到 min_ub_usage
  • min_ub_usage > platform_info.ub_size 时丢弃模板
  • 平台信息不可用或求值失败时保留模板,不做激进过滤
  • 全部模板被过滤时沿用现有无候选模板失败路径

2.2 新增公共 UB 表达式层(common/ub_expr)

  • ub_expr_types.h:定义 UbExprContextUbExprBuildResultUbExprCmp 等公共类型
  • asc_graph_ub_expr_builder.{h,cpp}:基于 AscGraph 构建 UB 表达式上下文,覆盖 Queue/Buffer/TmpBuffer size 表达式、container 命名、tile 变量、动态轴变量等
  • ub_expr_utils.{h,cpp}:从 UbExprContext 获取原始 UB 表达式

2.3 扩展 PlatformContext

  • 新增 TryGetInitializedPlatformInfo:无副作用读取已初始化的平台信息,不触发 runtime 初始化
  • 新增 TryGetUbSizeOverride:支持上层通过 SetPlatformInfo 注入 UB size(soc_ver 为空时)
  • 保持 GetPlatformInfo/SetPlatformInfo 既有行为不变

2.4 ATT 侧适配

  • gen_model_info.cpp:新增 RefreshCommonUbExprContext,基于公共 AscGraphUbExprBuilder 刷新 UB 表达式上下文,替换旧的 container 表达式
  • ub_named_expr_builder.{h,cpp}:ATT 内部命名化 UB 表达式构建,复用公共 BuildUbExpr 获取原始表达式
  • axes_reorder_solver_gen.cpp:适配公共 UB 表达式接口

2.5 测试覆盖

  • 新增 UT:test_static_ub_template_filter(过滤器正向/异常/边界)、test_ub_expr_utils(BuildUbExpr)、test_platform_context(新接口)
  • 新增 ATT UT:test_gen_model_info(UB 刷新)、test_axes_reorder_gen(命名化 UB 表达式)
  • 更新 runtime stub 适配新接口
  • 已有 ST/UT 适配:optimize_stoptimize_st_v2test_optimizer_v2test_python_ascir

三、代码修改流程图

flowchart TD
    A[Optimize 生成 schedule 模板] --> B[BufQueAllocator::AllocBufQue]
    B --> C[StaticUbTemplateFilter::Filter]
    C --> D{PlatformInfo 可用且 ub_size > 0?}
    D -- 否 --> E[跳过过滤, 保留全部模板]
    D -- 是 --> F[遍历 ScheduledResult]
    F --> G[AscGraphUbExprBuilder::Build]
    G --> H[UbExprUtils::BuildUbExpr]
    H --> I[tile=1, 动态轴=1 替换]
    I --> J{静态求值成功?}
    J -- 否 --> K[WARNING, 保留模板]
    J -- 是 --> L{min_ub > ub_size?}
    L -- 是 --> M[丢弃模板]
    L -- 否 --> N[保留模板]
    M --> O[继续后续流程]
    N --> O
    K --> O
    E --> O
    style C fill:#90EE90,stroke:#006400,stroke-width:2px
    style G fill:#90EE90,stroke:#006400,stroke-width:2px
    style H fill:#90EE90,stroke:#006400,stroke-width:2px

变更类型

关联的Issue

如何测试

一、测试用例说明

1.1 单元测试

  • test_static_ub_template_filter:覆盖平台信息可用/不可用、UB 超限/未超限、表达式求值失败、全部模板被过滤等场景
  • test_ub_expr_utils:覆盖 BuildUbExpr 正向和空表达式场景
  • test_platform_context:覆盖 TryGetInitializedPlatformInfo 和 TryGetUbSizeOverride
  • test_gen_model_info:覆盖 UB 表达式刷新
  • test_axes_reorder_gen:覆盖命名化 UB 表达式构建

1.2 系统测试

  • optimize_stoptimize_st_v2:验证 optimize 全流程包含 UB 过滤
  • test_optimizer_v2:v35 optimize 流程适配
  • test_python_ascir:Python ASCIR 测试适配

二、构建命令

sh build.sh -u --module=autofuse_framework -j 8

核对清单

其他信息

验证方法

  • 静态 shape 场景:构造 UB 超限模板,验证被正确过滤
  • 动态 shape 场景:动态轴取 1 后 UB 超限模板被过滤
  • 平台信息不可用:验证跳过过滤,保留全部模板
  • 表达式求值失败:验证 WARNING 日志和模板保留

注意事项

  • 本 PR 仅做必要条件过滤(保守过滤),不替换 ATT 最终 UB solver
  • 不修改对外 ABI/API,不新增 Python 绑定
  • 不引入新的用户配置项或环境变量
  • 不触发 runtime platform 初始化

提交记录

Commit 描述 修改文件数 修改行数
15856eb feat: add static ub template filter 28 +1790/-56
a8bd396 test: cover named ub expr builder 2 +17/-0
aedf707 fix: preserve platform info semantics for ub filter 5 +52/-12

修改文件清单

文件路径 修改类型 说明
autofuse/optimize/static_ub_template_filter.h 新增 静态 UB 模板过滤器头文件
autofuse/optimize/static_ub_template_filter.cpp 新增 过滤器实现:遍历模板、求值、剪枝
autofuse/common/ub_expr/ub_expr_types.h 新增 UbExprContext/UbExprBuildResult 等公共类型
autofuse/common/ub_expr/asc_graph_ub_expr_builder.h 新增 AscGraph UB 表达式构建器头文件
autofuse/common/ub_expr/asc_graph_ub_expr_builder.cpp 新增 Queue/Buffer/TmpBuffer UB 表达式构建实现
autofuse/common/ub_expr/ub_expr_utils.h 新增 UB 表达式工具类头文件
autofuse/common/ub_expr/ub_expr_utils.cpp 新增 BuildUbExpr 实现
autofuse/common/platform_context.cpp 修改 新增 TryGetInitializedPlatformInfo/TryGetUbSizeOverride
autofuse/inc/common/platform_context.h 修改 新增无副作用平台信息读取接口
autofuse/optimize/optimize.cpp 修改 AllocBufQue 后调用 StaticUbTemplateFilter
autofuse/att/gen_model_info/gen_model_info.cpp 修改 基于公共 UB builder 刷新 context
autofuse/att/.../ub_named_expr_builder.h 新增 ATT 命名化 UB 表达式头文件
autofuse/att/.../ub_named_expr_builder.cpp 新增 ATT 命名化 UB 表达式实现
autofuse/att/.../axes_reorder_solver_gen.cpp 修改 适配公共 UB 表达式接口
autofuse/tests/... (16 files) 新增/修改 UT/ST 测试用例和 runtime stub 适配
likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 zhang_shengjie 的贡献)
Zzhang_shengjie成员
6月21日 创建了 pull request,commit 00e3103c
CANN-robotCANN-robot成员
6月21日 添加了label:stat/needs-squash
CANN-robotCANN-robot成员
6月21日 添加了label:cann-cla/yes
CANN-robot
CANN-robot成员
6月21日 评论:

Thanks for your pull-request.
The full list of commands accepted by me can be found at here
You can get sig-info at here


PR Approval Progress

Congratulations! All modules have met the lgtm and approve requirements.

Module Approval Details

module lgtm status approve status
repo-cann/graph-autofusion zhanj, xchu42, xuyafei (3/2) zhanj (1/1)

💡 Tip:

  • Committer can comment /approve or /lgtm
  • Commenting /approve implies both code review (lgtm) and intent to merge (approve)

CLA Signature Pass

zhang_shengjie, thanks for your pull request. All authors of the commits have signed the CLA. 👍

likedislike
Zzhang_shengjie成员
6月21日 修改了pull request 的描述
此处折叠了131条消息 查看更多
xuyafei成员
7月6日 评论:

/lgtm

likedislike
CANN-robotCANN-robot成员
7月6日 添加了label:lgtm
zhanj
zhanj成员
7月7日 评论:

/approve

likedislike
CANN-robotCANN-robot成员
7月7日 添加了label:approved
CANN-robotCANN-robot成员
7月7日 合入了pull request