已关闭
[Requirement|需求建议]: Cast 性能建模优化设计 #189
gaoxin创建于  7月17日关闭于  7月27日
gaoxin成员
7月17日 创建

总体概述

软件概述

项目介绍

Graph-autofusion 的 Autofuse 组件通过 ASCIR、codegen 和 ATT 性能模型评估融合图代价。CastV2 是 v35 AscendC RegBase 路径中的基础类型转换算子。近期 Cast 性能建模修改围绕 CastExtend(dst, src, output_dims, output_stride, input_stride) 展开,使性能模型能够读取 codegen 阶段确定的原始 Cast 参数,并按真实 MicroAPI 路径估算 Cast、Store、Pack、UnPack、Interleave、DeInterleave、UpdateMask 等成本。

产品环境介绍

本设计属于 Autofuse v35 ATT 性能评估路径,与 CANN Toolkit、AscendC RegBase API、ASCIR codegen 和 ATT 模型信息生成相关。它不新增 runtime/aclrt 调用,不改变运行包安装目录,不改变 Python 包导入方式。外部接口边界为仓内 C++ 性能建模接口和节点参数结构,未新增对用户可见的 Python/C API。

软件功能

本需求实现以下能力:

  • CastV2 codegen 将 CastExtend 的原始维度和 stride 参数传递到 ATT。
  • CastPerf 按 Cast 参数计算 repeat、call count、连续/跨步分支和特殊 dtype 路径成本。
  • 性能表支持同时按输入 dtype 和输出 dtype 查询 MicroAPI latency/throughput。
  • CastPerf 中 kCastkStore 能使用输入输出 dtype 映射表计算成本。

设计约束

  • 构建命令必须限制并行度,使用 -j 8,避免 Autofuse 编译 OOM。
  • 不修改对外 Python/C API,不改变 run 包或 wheel 交付内容。
  • 不新增芯片型号、平台类型或框架类型硬编码。
  • 性能公式必须可追溯到 CastExtend API 参数、codegen 实参和源码 MicroAPI 路径。
  • NodeInfo 中的参数必须来自 codegen/merge 阶段原始表达式,不保存 tiler 展开字符串。
  • 高频路径不新增默认开启的大量日志,仅保留已有 debug 级查表日志。

假设和依赖关系

  • CastV2 的实际 API 参数顺序保持为 dstsrcoutput_dimsoutput_strideinput_stride
  • ATT 性能模型通过 NodeInfo 获取 Cast 节点输入输出 dtype、shape 和 codegen 透传参数。
  • ExprTernaryOpIfCase 等符号表达式能力能够表达动态 repeat 分支。
  • PerfParamTableV2 是 v35 CastPerf 使用的 V2 性能表来源。

需求分析与设计

整体介绍

整体数据流为:ASCIR CastV2 节点进入 codegen 后,CastV2ApiCall::Generate 根据 merge/loop 信息填充 Cast 节点参数;specific_params 在 ATT 解析阶段写入 NodeInfo.cast_node_params;CastPerf 从 NodeInfo 读取 dtype、dims、stride,计算 repeat 和 MicroAPI 次数;VfPerfUtils 通过普通单 dtype 表或输入输出 dtype mapping 表获取 latency/throughput;最终得到 VFHeadCost + max_latency + all_vf_instruct_cost 的 AIV_VEC 性能表达式。

功能需求

功能需求 1:CastV2 参数透传

  1. 介绍

    CastPerf 需要使用 codegen 阶段确定的 output_dimsoutput_stridesinput_strides,避免在 ATT 中凭 shape 重新推导 CastExtend 实参。

  2. 输入

    输入来自 CastV2 codegen 的 merge/loop 参数,包含输出维度、输出 stride 和输入 stride。输入中的表达式可以是静态常量,也可以是符号表达式。

  3. 处理

    CastV2ApiCall::Generate 填充 Cast 节点参数,AscirNodeParams::specific_params 承载该参数,ATT 解析阶段写入 NodeInfo.cast_node_params。缺失或无效参数时 CastPerf 回退到 shape 乘积和默认 repeat 计算路径。

  4. 输出

    NodeInfo 中新增可供 CastPerf 使用的 Cast 参数,性能模型可按实际 API 参数计算 repeat 和分支成本。

功能需求 2:CastPerf 公式重构与特殊路径建模

  1. 介绍

    CastPerf 需要覆盖普通 Cast、同 bit integer Cast、B4/B8/B64 特殊转换、uint8 -> int64 interleave、int64 -> uint8 pack 等分支。

  2. 输入

    输入为 NodeDetail 中的输入输出 dtype、shape、Cast 参数和 PerfOutputInfo 中的 ternary op 容器。

  3. 处理

    公式拆分为 repeat 计算、data copy 成本、特殊 Cast compute 成本和最终汇总。动态 stride 场景通过 TernaryOp 表达连续与跨步分支。同 bit integer Cast 只统计 DataCopy 和 UpdateMask 相关成本,不额外统计 Cast compute。

  4. 输出

    perf.pipe_res[PipeType::AIV_VEC] 写入 Cast 节点性能表达式,动态分支写入 perf.ternary_ops

功能需求 3:输入输出 dtype mapping 性能表

  1. 介绍

    单 dtype 查表无法表示 kCastkStore 的输入输出 dtype 组合成本,需要通用结构支持 micro_api + input_dtype + output_dtype 查找 latency/throughput。

  2. 输入

    输入为 MicroAPI 类型、input dtype、output dtype,以及 V2 性能表中配置的 VfInstructDtypeMappingPerf 条目。

  3. 处理

    查找顺序为精确 input/output、input/default、default/output、default/default。命中后返回表中 latency/throughput;未命中时保持 0AddVfInstructDtypeMappingPerf 使用 Max 更新最大 latency,并累加 throughput * repeat_time

  4. 输出

    CastPerf 中 kCastkStore 可按真实输入输出类型组合计算成本,默认回退策略保证表项缺失时不影响公式生成。

非功能需求

可维护性

CastPerf 拆分为多个小 helper,每个 helper 对应一类 Cast 分支或 MicroAPI 组合。dtype mapping 表是通用结构,后续其他 MicroAPI 可复用,不需要为 Cast 再定义私有表类型。

可测试性

CastPerf 可通过 ATT UT/ST 直接构造 NodeInfoTensorShapeInfo 和 Cast 参数验证表达式结果。dtype mapping 默认和特例可通过不同 input/output dtype 组合验证。

可移植性

本设计不依赖特定芯片型号字符串,不新增平台判断。依赖 C++17、现有 CMake、CANN Toolkit 和仓内 Autofuse v35 源码结构。

可靠性

符号除法前增加除数非零断言。dtype mapping 查表未命中时按 0 计算,避免空表导致失败。新增结构使用值语义和 std::vector<std::string>,无手工资源释放。

特性交叉影响

场景 适用性 分析说明
SuperKernel Python 接口 不适用 不修改 super_kernel Python 包、选项解析、pytest 或 wheel 内容。
SuperKernel C++/AOT 接口 不适用 不修改 libascendsk.so、AOT、RDV 或 SuperKernel ABI/API。
Autofuse 图优化 不适用 不新增 pass,不修改图改写逻辑,不改变 ASCIR 图等价性。
Autofuse Codegen/Backend 适用 修改 CastV2 codegen 参数填充路径,但不改变生成 kernel 语义,仅向 ATT 透传性能模型参数。
AscendC API / Runtime 交互 适用 建模依据 CastExtend 参数;不新增 runtime/aclrt/AscendC 调用,不改变资源生命周期。
Python/C++ 混合绑定 不适用 不修改 pyautofuse 或 CPython 扩展。
构建与打包 不适用 不修改 CMake、build.sh、第三方依赖或安装路径。
测试与覆盖率 适用 需要 ATT UT/ST 覆盖 Cast 表达式、特殊 dtype 和动态 stride 分支。
性能与日志 适用 影响 ATT 性能模型结果;新增查表逻辑为小表线性查找,日志为 debug 级。
兼容性 适用 不改变外部 API/ABI;新增内部结构体字段和虚接口只在仓内性能表继承体系使用。

性能

编译时长

修改 C++ 源文件和头文件会触发 ATT 相关目标增量编译,不新增 CMake 扫描或全量遍历逻辑。构建仍使用 -j 8 控制并行度。

执行性能

本设计只影响编译期/建模期的性能表达式计算,不影响实际 runtime 调度或 kernel launch。dtype mapping 查表是小规模 vector 线性扫描,对 ATT 性能模型总耗时影响可忽略。

内存和产物大小

新增少量 std::mapstd::vector 和字符串常量,常驻内存和动态库大小变化很小。未新增大数组、缓存或运行包产物。

接口设计

新增/修改接口描述

新增内部数据结构:

struct VfInstructDtypeMappingPerf {
  std::vector<std::string> input_dtypes;
  std::vector<std::string> output_dtypes;
  int32_t latency{0};
  int32_t throughput{0};
};

新增内部虚接口:

virtual const std::vector<VfInstructDtypeMappingPerf> &GetVfInstructDtypeMappingPerfTable(
    const std::string &micro_api_type) const;

新增工具函数:

static af::Status GetVfInstructDtypeMappingPerf(const std::string &vf_instruct_type,
                                                const std::string &input_dtype,
                                                const std::string &output_dtype,
                                                Expr &latency,
                                                Expr &throughput);

static af::Status AddVfInstructDtypeMappingPerf(const std::string &vf_instruct_type,
                                                const std::string &input_dtype,
                                                const std::string &output_dtype,
                                                Expr &latency,
                                                Expr &throughput,
                                                Expr repeat_time);

这些接口均为 Autofuse 内部 C++ 接口,不作为外部 ABI/API 承诺。

接口检查项

检查项 子检查项 是否涉及 说明
接口说明 是否需要接口评审 仅仓内 ATT 性能模型内部接口。
接口说明 是否需要补充文档 本设计文档说明新增结构和查表规则。
接口兼容 行为是否兼容 旧单 dtype 查表保留,新增 mapping 查表不影响其他调用方。
接口兼容 ABI/API 是否兼容 不修改对外导出接口;内部虚接口需随源码统一编译。
接口约束 约束不满足时是否清晰报错 除法非零断言;mapping 未命中按 0 回退。
接口测试 是否需要独立接口用例 通过 CastPerf UT/ST 间接覆盖 mapping 命中和默认回退。

软件设计

关键数据结构

  • CastNodeParams:承载 CastExtend 原始维度和 stride 参数,生命周期随 AscirNodeParams/NodeInfo
  • VfInstructDtypeMappingPerf:承载一个 MicroAPI 的输入 dtype 集、输出 dtype 集、latency 和 throughput。
  • PerfParamTableV2::vf_instruct_type_2_dtype_mapping_api_perf_:缓存 V2 dtype mapping 性能表。

关键技术/算法

Cast repeat 算法根据参数有效性分为 shape 乘积回退、一维输出、动态连续/跨步分支三类。dtype mapping 查表按精确到默认的顺序回退,保证特例优先、默认兜底。

流程设计

主流程:CastV2 codegen 填参 -> ATT 解析写入 NodeInfo -> CastPerf 计算 repeat -> 按分支累加 MicroAPI 成本 -> 写入 AIV_VEC 性能表达式。异常流程:Cast 参数缺失走 shape 回退;除数为 0 返回失败;mapping 未命中按 0 成本继续生成表达式。

对子模块的修改

  • autofuse/v35/codegen/reg_api_call/:CastV2 codegen 填充 Cast 参数。
  • autofuse/common/ascir_node_param/:新增或扩展 Cast 节点参数承载能力。
  • autofuse/att/gen_model_info/parser/:将 Cast specific params 写入 NodeInfo
  • autofuse/v35/att/api_perf_register/:重构 CastPerf 公式,扩展 V2 性能表。
  • autofuse/att/gen_model_info/api_perf_register/utils/:新增 dtype mapping 查表工具。
  • autofuse/att/base/:新增通用 dtype mapping 结构和默认字符串常量。

错误处理

系统错误

本设计不新增文件、内存、runtime 或设备资源申请。编译失败由 CMake/编译器报告;性能模型中的断言沿用 GE_ASSERT_* 返回错误状态。

接口错误

Cast 参数缺失或无效时使用回退路径;除数为 0 时返回失败并打印表达式;mapping 查表未命中时按 0 成本处理,避免表项未覆盖导致性能模型构造失败。

安全检查

  • 敏感信息和公网地址硬编码:未新增密钥、Token、账号、公网地址或大数组。
  • 外部输入作为索引、长度、偏移:dtype 查表使用 map/vector 遍历,不用外部输入直接索引;Cast 参数在使用前检查必要字段。
  • 整数溢出、反转、除 0:符号除法前新增非零断言;shape 乘积沿用现有 Expr 符号计算。
  • 资源生命周期和异常分支释放:未新增手工资源管理。
  • ABI/API 兼容:不修改对外 Python/C API;内部 C++ 接口随源码统一编译。
  • 图改写等价性和确定性:不新增图改写 pass,不改变图结构。
  • runtime/aclrt/AscendC 接口生命周期约束:不新增 runtime/aclrt/AscendC 调用。

兼容性检查

本设计不影响脚本参数、配置文件、安装目录、动态库文件名、Python 包、旧 run 包布局或用户代码。内部虚接口和结构体变更需要相关 Autofuse 目标同步编译,不支持新旧对象文件混用。

测试设计

测试边界

测试入口为 ATT UT/ST 中 CastPerf 表达式用例。测试出口为 perf.pipe_res[PipeType::AIV_VEC] 和动态 ternary_ops 表达式。测试打桩使用现有 ATT 测试框架和 runtime/model info stub。

测试用例设计

测试类别 关键测试项 测试方法 用例类型
功能 CastV2 基础 float32 -> float16 表达式 构造 input/output shapes,比较 Str(res) UT/ST
功能 同 bit integer Cast 只统计 DataCopy 成本 构造 int8 -> uint8 Cast 参数,比较表达式 UT
功能 uint8 -> int64 store mapping 特例 构造 Cast 参数,比较表达式 UT
功能 int64 -> uint8 pack 分支 构造 Cast 参数,比较表达式含 update mask UT
异常 除数非零保护 通过合法 one_rep_size 用例验证正常路径,非法路径由断言保护 UT
性能 查表开销 小表线性查找,人工评估为可忽略 手工验证
兼容性 非 Cast MicroAPI 单 dtype 查表 保留旧接口并运行相关 ATT 用例 UT/ST
特性交叉 ST CastV2 表达式同步 更新 ST 预期并编译到 .o ST

验收标准

  • CastV2 codegen 能将 CastExtend 原始参数透传到 ATT NodeInfo
  • CastPerf 能按普通、同 bit、B4/B8/B64、uint8/int64 特殊路径生成可解释性能表达式。
  • kCastkStore 能按输入输出 dtype mapping 查表,默认回退行为符合设计。
  • CastPerf 符号除法有除数非零保护,表达式构造不触发除 0 风险。
  • cmake --build build --target att -j 8cmake --build build --target att_ut -j 8 通过。
  • Cast 相关 ATT UT 通过;ST Cast 预期与新模型保持一致。

设计文档检查结果

likedislike
Ggaoxin成员
7月17日 将 gcw_V3YyYBt1 设为负责人
Ggaoxin成员
7月17日 issue类型由 任务 改变为 需求
Ggaoxin成员
7月17日 添加了label:feature
Ggaoxin成员
7月17日 修改了issue 的描述
Ggaoxin成员
7月17日 修改标题为 “[Requirement|需求建议]: Cast 性能建模优化设计”,原标题为“Cast 性能建模优化设计”
Ggaoxin成员
7月17日 修改了issue 的描述
CANN-robotCANN-robot成员
7月27日 关闭了 issue
CANN-robotCANN-robot成员
7月27日 添加了label:resolved