| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
feat: AddV2 算子 Ascend950 arch35 regbase 实现(无 aclnn 接口) Co-authored-by: raoliang_sac<raoliang4@huawei.com> # message auto-generated for no-merge-commit merge: !4362 merge add-v2-arch35-no-aclnn into master feat: AddV2 算子 Ascend950 arch35 regbase 实现(无 aclnn 接口) Created-by: raoliang_sac Commit-by: raoliang_sac Merged-by: cann-robot Description: ## 描述 在 math/add_v2/ 新建 AddV2 算子,实现 Ascend950 (arch35) regbase 版本的逐元素加法。基于 atvoss broadcast DAG 框架,支持 11 种 dtype(含 4 种混合精度组合),共 15 个预编译 binary。算子仅支持图模式调用,不提供 aclnn 接口。 ### 改动原因 ops-math 仓缺少 AddV2 算子的 Ascend950 (arch35) 实现。本 PR 在 math/add_v2/ 新建算子,仅包含 950 arch35 regbase 实现。 ### 改动方法 - op_host: def(单一 950 配置)、infershape(broadcast)、arch35 tiling(BroadcastBaseTiling 框架分发) - op_kernel/arch35: kernel entry(BroadcastSch)、dag(4 种 Compute: AddWithoutCast/AddWithCast/AddMixDtype/AddBool)、struct(tiling key 声明) - op_graph: proto.h(REG_OP(AddV2))、graph_infer(类型提升推导 PromoteType 查表) - tests/assets/golden.py: kernel 模式 golden(bool 语义 logical_or) - CMakeLists.txt: ACLNNTYPE 配置为 aclnn_exclude,不生成 aclnn 接口 - tiling 校验使用 OP_LOGE_FOR_INVALID_* 结构化宏 ### 产品支持情况 - Ascend 950PR/950DT: 本 PR 实现 - A2/A3/推理/训练系列: 通过 canndev Add 算子复用支持(tf_plugin 将 AddV2 映射到 Add) ## 关联的Issue - #2379 ## 测试 - TTK kernel 990/990 precision PASS - 三方性能 200/200 全部达标 - ophost UT 21/21 PASS(覆盖全部 11 种 dtype) - run_example graph 模式 PASS ## 文档更新 - README.md: 算子对外资料(产品支持情况、参数说明、约束说明、调用说明) ## 类型标签 - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!4362 | 1 个月前 | |
fix(add_v2): 补充 add_v2_proto.h 算子注册去重宏 Co-authored-by: songkai111<songkai16@huawei.com> # message auto-generated for no-merge-commit merge: !4838 merge master into master fix(add_v2): 补充 add_v2_proto.h 算子注册去重宏 Created-by: songkai111 Commit-by: songkai111 Merged-by: cann-robot Description: ## 描述 math/add_v2/op_graph/add_v2_proto.h 中 REG_OP(AddV2) 注册块此前未包含去重宏。仓库内已有 22 个 *_proto.h 采用 #ifndef OPS_PROTO_DEF_<NAME> 惯例(如 clip_by_norm_no_div_sum_proto.h、matrix_diag_part_proto.h 等),add_v2 属于遗漏项。 当该头文件被同一编译单元重复包含(直接或间接)时,REG_OP(AddV2) 宏展开多次,导致算子重复注册。本 PR 按仓库既有惯例补齐 include guard: c++ #ifndef OPS_PROTO_DEF_ADDV2 #define OPS_PROTO_DEF_ADDV2 REG_OP(AddV2) ... .OP_END_FACTORY_REG(AddV2) #endif ## 关联的Issue fixes #2731 ## 测试 纯头文件宏修改,无逻辑变更;通过编译验证头文件重复包含场景下 REG_OP(AddV2) 仅展开一次。 ## 文档更新 无。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!4838 | 1 个月前 | |
fix: 修复AddV2和TensorRedirect误校验OriginShape Co-authored-by: raoliang_sac<raoliang4@huawei.com> # message auto-generated for no-merge-commit merge: !5884 merge fix/add-v2-scalar-origin-rank into master fix: 修复AddV2和TensorRedirect误校验OriginShape Created-by: raoliang_sac Commit-by: raoliang_sac Merged-by: cann-robot Description: ## 描述 本 PR 修复 Ascend 950PR/Ascend 950DT(arch35)实现中 AddV2 和 TensorRedirect 对 OriginShape 进行 Tiling rank 校验而误拒绝合法输入的问题。 ### 问题场景 - TensorFlow 场景 tf.add(x, 1) 中,常量 1 的框架逻辑形态(OriginShape)是 []、rank 为 0;GE 运行时可将其规整为单元素存储形态(StorageShape)[1]。原实现同时按 [1, 8] 校验 OriginShape 和 StorageShape,导致合法标量广播在进入 Tiling 时失败。 - TensorRedirect 也存在同类问题:OriginShape 描述框架逻辑形态,StorageShape 才是 Tiling 和 Kernel 实际使用的计算形态;对 OriginShape 再做一遍 rank 限制会误伤合法的 shape 转换场景。 - StorageShape 本身为 rank 0 时表示单元素标量,元素个数为 1;原校验将其按 rank 下界 1 拒绝,与同类算子的标量处理不一致。 ### 修复方案 - AddV2、TensorRedirect 均不再在 Tiling 中单独校验 OriginShape,仅校验实际参与切分和计算的 StorageShape。 - 两个算子的 StorageShape rank 范围统一为 [0, 8],保留 rank 上界、负维、shape/广播关系、dtype、元素个数溢出等既有校验。 - AddV2 的 rank-0 StorageShape 在进入 ATVOSS Broadcast 模板后,由 EnsureNotScalar 以等价的 [1] 形态参与合轴和切分;该函数不修改 OriginShape 或 TilingContext 中的原始 StorageShape。 - 补充 origin/storage 不一致、TF 标量、rank-0 storage 标量及标量广播回归用例。该修复由 TensorFlow 标量场景暴露,但校验原则不限定于 TensorFlow。 ### 文件修改 - conversion/tensor_redirect/op_host/arch35/tensor_redirect_tiling_arch35.cpp:删除输入/输出 OriginShape rank 校验;StorageShape 支持 rank 0,继续校验 rank 上界、非负维和输入输出 storage shape 一致性。 - conversion/tensor_redirect/tests/ut/op_host/arch35/test_tensor_redirect_tiling_arch35.cpp:将 rank-0 StorageShape 改为成功用例,补充输入/输出 OriginShape 与 StorageShape rank 不一致的成功回归用例。 - math/add_v2/README.md:将 Ascend 950PR/Ascend 950DT 的 rank 范围更新为 [0, 8],说明 rank 0 表示标量。 - math/add_v2/op_host/arch35/add_v2_tiling_arch35.cpp:删除 x1、x2、y 的 OriginShape rank 校验;StorageShape 支持 rank 0,并继续执行实际 shape、广播及溢出校验。 - math/add_v2/tests/ut/op_host/arch35/test_add_v2_tiling.cpp:补充 TF 标量位于左右输入、标量与标量、rank-0 StorageShape 及其广播、OriginShape 不参与 Tiling rank 校验等用例。 ## 关联的Issue - 历史质量加固 Issue:https://gitcode.com/cann/ops-math/issues/3195。本 PR 修复该轮加固后暴露的标量 shape 校验回归。 ## 测试 - 使用工作目录 CANN:/workspace/July-Changwei-math/Ascend/cann-9.2.0。 - 分支已 rebase 到 cann/ops-math:master@968d685af5c6c5d95f207eb73126cca9b90745ee,并 squash 为 1 个提交:75d3c5deb29740b61560d09125aa05be424a6226。 - 定向 Host UT:AddV2 37 个、TensorRedirect 55 个,共 92/92 通过。 - 最新定向本地 CI(固定上述 master 快照、-j8)全部通过: - pre-commit:PASS; - 隔离 oat-py==1.0.3 一次检查完整 5 个变更文件:PASS; - README Markdown 链接:PASS; - Ascend 950:AddV2、TensorRedirect 定向 package 与 ophost UT:PASS; - Ascend 910B:AddV2、TensorRedirect 定向 package 与 ophost UT:PASS。 ## 文档更新 - 已更新 math/add_v2/README.md 中 Ascend 950PR/Ascend 950DT 的 rank-0 标量说明。 - TensorRedirect 的公开逻辑 rank 规格未在本 PR 中改动;本次只修正 Tiling 对实际 StorageShape 的校验对象与标量处理。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!5884 | 9 天前 | |
fix: TensorRedirect 交付件规范对齐(issue #4553),并删除 AddV2 不可达的混合 dtype 组合 Co-authored-by: raoliang_sac<raoliang4@huawei.com> Co-authored-by: Claude<noreply@anthropic.com> # message auto-generated for no-merge-commit merge: !4505 merge fix/review-and-issue-4553 into master fix: TensorRedirect 交付件规范对齐(issue #4553),并删除 AddV2 不可达的混合 dtype 组合 Created-by: raoliang_sac Commit-by: raoliang_sac;Claude Merged-by: cann-robot Description: ## 描述 本 PR 包含三部分改动,均针对 conversion/tensor_redirect 与 math/add_v2 两个新增算子。 ### 一、TensorRedirect 对齐 issue #4553 的两条交付件规范 issue 提出两条要求,TensorRedirect **两条都不满足**: 1. **InferDataType 须交付在 op_graph 目录**(仅图场景使用);InferShape 图与算子双用,保留在 op_host。 - 原实现把 InferDataType4TensorRedirect 和 InferShape 一起注册在 op_host/tensor_redirect_infershape.cpp。 - 现新增 op_graph/tensor_redirect_graph_infer.cpp 承载 InferDataType,op_host 只保留 IMPL_OP_INFERSHAPE(TensorRedirect).InferShape(...)。 - 顺带修复:InferDataType 原先丢弃 SetOutputDataType 返回值无条件返回 SUCCESS,现改为透传。 2. **原型从 legacy 挪出后须补防重定义宏**。 - canndev ops/built-in/op_proto/inc/ops_proto_legacy.h:13857 确实存在 REG_OP(TensorRedirect),且已用 OPS_PROTO_DEF_TENSORREDIRECT 包裹;本仓 op_graph/tensor_redirect_proto.h 无守卫。 - 已实测:构造同时包含两份定义的 TU,加守卫前报 error: redefinition of 'class ge::op::TensorRedirect',加守卫后编译通过。 - 现补同名守卫 OPS_PROTO_DEF_TENSORREDIRECT,与 legacy 侧配对。 > AddV2 这两条**本来就满足**,未作改动:InferDataType 一直在 op_graph/add_v2_graph_infer.cpp;AddV2 不在 ops_proto_legacy.h 中(仅在 elewise_calculation_ops.h),按 issue 条件不需要加守卫。 **两个算子的 REG_OP 均未改动**,与 canndev 保持逐字符一致(忽略空白后比对:AddV2 vs elewise_calculation_ops.h:1390;TensorRedirect vs elewise_calculation_ops.h:3779 及 ops_proto_legacy.h:13857)。 ### 二、代码检视报告问题修复 | 级别 | 问题 | 修复 | |---|---|---| | P1 | TensorRedirect Tiling 不拒绝负维与 shape 乘积溢出,负 numel 可穿透到 DoTiling 产生 usedCoreNum == 0 / SetBlockDim(0) | 逐维拒绝 < 0;GetShapeSize() 后拦截溢出哨兵 kInvalidDimValue,且置于 numel == 0 判断之前 | | P1 | TensorRedirect PrecisionReduceFlag(true) 与 bit-exact 语义冲突:allow_mix_precision 下允许把 FP32 节点降为 FP16,破坏 README 声明的逐 bit 相等(含负零 / NaN payload / 非规格化数) | 改为 PrecisionReduceFlag(false) | | P1 | AddV2 注册的 4 个混合 dtype 组合在 GE 图通路上不可达 | 删除,详见下 | | P2 | 文档与实现不一致 | docs/zh/op_list.md 删除 add_v2 已不存在的 bool logical_or 声明;README 删除混合精度组合表 | **关于 AddV2 的 4 个混合 dtype 组合(FP16+FP32、FP32+FP16、BF16+FP32、FP32+BF16):** canonical AddV2 契约要求 x1/x2 同 dtype —— canndev ops/built-in/op_proto/elewise_calculation_ops.cc:475 的 AddV2Verify 调用 CheckTwoInputDtypeSame,原型注释也写明 x2: A tensor of the same dtype as "x1"。既然本仓 REG_OP 与 canndev 保持一致,OpDef 里注册异类型组合就与自身原型契约矛盾。 已实测复现:FP16+FP32 离线构图被 Verifier 拒绝(The AddV2_0 op dtype is not same, type1:DT_FLOAT16, type2:DT_FLOAT),FP16+FP16 对照组构图成功。本算子无 ACLNN,因此这 4 个已编译 binary 对公开调用方实际不可达。 删除范围(REG_OP 不动): - add_v2_def.cpp:x1/x2/y 的 DataType 列表 13 → 9 组同 dtype,ADD_V2_FORMAT_LIST 同步收缩 - add_v2_binary.json:删除 4 个混合 binary,13 → 9 - add_v2_graph_infer.cpp:删除 34×34 类型提升表,InferDataType 改为 y 与 x1 同 dtype,并显式拒绝异类型输入 - add_v2_tiling_arch35.cpp:IsMixedDtype 与 4 个混合分支改为 CheckDtype 前置校验 - add_v2.cpp / add_v2_dag.h:删除 isMixDtype 分支与 AddMixDtypeCompute 模板 - tests/assets/golden.py:删除已不注册的 bool logical_or 死分支;对异类型输入直接抛错,避免静默按 x1.dtype 生成错误标杆 ### 三、AddV2 支持空 Tensor 上板回归时补的空张量用例暴露出一个既有能力缺口:**AddV2 对 numel == 0 的输入一律 OPTILING_FAILURE**,9 种 dtype × 4 种空场景 36/36 全挂。根因是 ATVOSS 的 BroadcastBaseTiling 在合轴之后显式拒绝 0 元素(broadcast_tiling.h 的 "tensor check is empty, check failed"),空 Tensor 根本落不到 DoTiling。 > 对比:同批提交的 TensorRedirect 本来就支持(Tiling 里有 HandleEmptyTensor 早返回,README 也声明了"支持空Tensor")。AddV2 此前既没实现也没声明。 按 math/select 的既有惯例另开一条自定义模板分支承接: - add_v2_struct_arch35.h:新增 userDef 模板键(0 常规 / 1 空 Tensor),空分支复用 BRC_TEMP_SCH_CUSTOM_MODE_KEY_SEL 的 schMode 999;并补 AddV2EmptyTilingData —— opc 靠 kernel 里的 GET_TILING_DATA_WITH_STRUCT 反推每个模板实例的 tiling 结构体大小,自定义分支不引用任何结构体会导致编译期 tiling_struct_size 未定义。 - add_v2.cpp:kernel 增加 userDef 模板参数,userDef == 1 时直接返回。 - add_v2_tiling_arch35.cpp:抽出 SetWorkspace(),新增 HandleEmptyTensor();按输出 y 的元素数判空,blockDim = 1、tilingKey 走自定义分支。判空**之前**先拦截 GetShapeSize() 的溢出哨兵(负值),否则负的 numel 会被当成非空穿透到 DoTiling。 - 常规通路的 tilingKey 统一补 userDef = 0,编码后取值不变(仍为 8),原有 UT 的 expectTilingKey 无需调整。 ## 关联的Issue - https://gitcode.com/cann/ops-nn/issues/4553 —— INTrainingReduceV2 / NormalizeBBox / SGD 原型重定义与 inferdatatype 放置问题(本 PR 按同一规范修正 ops-math 侧的 TensorRedirect) ## 测试 ### 单元测试 - ./build.sh -u --ophost --soc=ascend950 --ops=add_v2:**22/22 通过**(10 条 tiling,含新增 4 条空 Tensor;12 条 infershape)。 - op_host 全量 UT 75/75 通过(前两个 commit 时验证)。 ### 上板回归(Ascend950PR,TTK kernel 模式) 全部以 --binary-only(-d=false -b=release)+ --pc=1 串行执行,**只采信 BIN_* 列**(bin_compile_s = BINARY_MATCH 才算真正匹配到部署的 .o,而非 JIT 现编兜底)。 | 算子 | 用例数 | BINARY_MATCH | 精度通过率 | |---|---:|---:|---:| | AddV2 | 1735 | 1735 | **100.00%** | | TensorRedirect | 900 | 900 | **100.00%** | | **合计** | **2635** | **2635** | **100.00%** | 其中 36 条空 Tensor 用例全部 BINARY_MATCH + 100%,tiling_key = 65550 (0x1000e)、block_dim = 1,确认走的是新增的自定义分支(改动前为 36/36 INVALID_TILING)。 ### 负向对照 add_v2_removed_mixed_dtype.csv 12 条(已删除的 4 组混合 dtype)如期 **全部 BINARY_MATCH_FAILURE**。历史交付件里这 4 组是 BINARY_MATCH + 100% PASS —— 前后翻转,可作为"部署的确实是本 PR 代码"的直接证据。 ### 编译 - ./build.sh --pkg --soc=ascend950 --ops=add_v2,tensor_redirect:AddV2 产出 **9** 个 binary(原 13),TensorRedirect **4** 个,无残留混合 dtype binary。 - 原型防重定义:构造同时包含 legacy 与本仓两份 REG_OP(TensorRedirect) 的 TU,加守卫前编译失败、加守卫后通过。 ### 需要评审者注意的测试局限(如实说明) 1. 本 PR 为 TensorRedirect 新增的 4 个负维 / 溢出 UT,**在打补丁前也是通过的** —— 当前 UT faker 构造这类 context 时本就返回 GRAPH_FAILED(并非因为走到了新增的显式校验)。这些用例锁定了契约,但**不能证明新增守卫本身生效**;真实 GE 通路的行为需由 GEIR 测试覆盖。 2. 两个算子的 InferDataType **均无单元覆盖** —— 仓内 UT harness 只有 InferShape executor,没有 InferDataType 的对应设施,本 PR 未为此新造 harness。AddV2 新增的"x1/x2 异类型返回 GRAPH_FAILED"这条也因此未被测到。 3. TensorRedirect 的 900 条回归是在**前一版**代码上跑的,本次 AddV2 改动后未复跑。依据:conversion/tensor_redirect 源码相对该版本零改动,且重新编译产出的 4 个 binary 配置 json 与已部署版本**逐字段一致**(仅豁免随构建变化的 sha256;.o 本身构建不可复现,MD5 不具可比性)。 4. 性能仅有 TTK 采集的 cycle 数,未做三方对标。 ## 文档更新 - math/add_v2/README.md:删除混合精度组合表;x2/y 描述改为"与 x1 一致";约束说明补充"输入 x1 和 x2 的数据类型需相同" - docs/zh/op_list.md:删除 add_v2 条目中已不存在的"bool 输入按 logical_or 处理";描述补充"支持空Tensor" - math/add_v2/README.md:约束说明补充"支持空Tensor。当输出y的元素个数为0时,算子不下发有效计算,直接返回成功。" ## 类型标签 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [x] 其他,请描述:交付件目录规范对齐(issue #4553)、删除不可达的 dtype 注册组合 See merge request: cann/ops-math!4505 | 1 个月前 | |
fix: 修复AddV2和TensorRedirect误校验OriginShape Co-authored-by: raoliang_sac<raoliang4@huawei.com> # message auto-generated for no-merge-commit merge: !5884 merge fix/add-v2-scalar-origin-rank into master fix: 修复AddV2和TensorRedirect误校验OriginShape Created-by: raoliang_sac Commit-by: raoliang_sac Merged-by: cann-robot Description: ## 描述 本 PR 修复 Ascend 950PR/Ascend 950DT(arch35)实现中 AddV2 和 TensorRedirect 对 OriginShape 进行 Tiling rank 校验而误拒绝合法输入的问题。 ### 问题场景 - TensorFlow 场景 tf.add(x, 1) 中,常量 1 的框架逻辑形态(OriginShape)是 []、rank 为 0;GE 运行时可将其规整为单元素存储形态(StorageShape)[1]。原实现同时按 [1, 8] 校验 OriginShape 和 StorageShape,导致合法标量广播在进入 Tiling 时失败。 - TensorRedirect 也存在同类问题:OriginShape 描述框架逻辑形态,StorageShape 才是 Tiling 和 Kernel 实际使用的计算形态;对 OriginShape 再做一遍 rank 限制会误伤合法的 shape 转换场景。 - StorageShape 本身为 rank 0 时表示单元素标量,元素个数为 1;原校验将其按 rank 下界 1 拒绝,与同类算子的标量处理不一致。 ### 修复方案 - AddV2、TensorRedirect 均不再在 Tiling 中单独校验 OriginShape,仅校验实际参与切分和计算的 StorageShape。 - 两个算子的 StorageShape rank 范围统一为 [0, 8],保留 rank 上界、负维、shape/广播关系、dtype、元素个数溢出等既有校验。 - AddV2 的 rank-0 StorageShape 在进入 ATVOSS Broadcast 模板后,由 EnsureNotScalar 以等价的 [1] 形态参与合轴和切分;该函数不修改 OriginShape 或 TilingContext 中的原始 StorageShape。 - 补充 origin/storage 不一致、TF 标量、rank-0 storage 标量及标量广播回归用例。该修复由 TensorFlow 标量场景暴露,但校验原则不限定于 TensorFlow。 ### 文件修改 - conversion/tensor_redirect/op_host/arch35/tensor_redirect_tiling_arch35.cpp:删除输入/输出 OriginShape rank 校验;StorageShape 支持 rank 0,继续校验 rank 上界、非负维和输入输出 storage shape 一致性。 - conversion/tensor_redirect/tests/ut/op_host/arch35/test_tensor_redirect_tiling_arch35.cpp:将 rank-0 StorageShape 改为成功用例,补充输入/输出 OriginShape 与 StorageShape rank 不一致的成功回归用例。 - math/add_v2/README.md:将 Ascend 950PR/Ascend 950DT 的 rank 范围更新为 [0, 8],说明 rank 0 表示标量。 - math/add_v2/op_host/arch35/add_v2_tiling_arch35.cpp:删除 x1、x2、y 的 OriginShape rank 校验;StorageShape 支持 rank 0,并继续执行实际 shape、广播及溢出校验。 - math/add_v2/tests/ut/op_host/arch35/test_add_v2_tiling.cpp:补充 TF 标量位于左右输入、标量与标量、rank-0 StorageShape 及其广播、OriginShape 不参与 Tiling rank 校验等用例。 ## 关联的Issue - 历史质量加固 Issue:https://gitcode.com/cann/ops-math/issues/3195。本 PR 修复该轮加固后暴露的标量 shape 校验回归。 ## 测试 - 使用工作目录 CANN:/workspace/July-Changwei-math/Ascend/cann-9.2.0。 - 分支已 rebase 到 cann/ops-math:master@968d685af5c6c5d95f207eb73126cca9b90745ee,并 squash 为 1 个提交:75d3c5deb29740b61560d09125aa05be424a6226。 - 定向 Host UT:AddV2 37 个、TensorRedirect 55 个,共 92/92 通过。 - 最新定向本地 CI(固定上述 master 快照、-j8)全部通过: - pre-commit:PASS; - 隔离 oat-py==1.0.3 一次检查完整 5 个变更文件:PASS; - README Markdown 链接:PASS; - Ascend 950:AddV2、TensorRedirect 定向 package 与 ophost UT:PASS; - Ascend 910B:AddV2、TensorRedirect 定向 package 与 ophost UT:PASS。 ## 文档更新 - 已更新 math/add_v2/README.md 中 Ascend 950PR/Ascend 950DT 的 rank-0 标量说明。 - TensorRedirect 的公开逻辑 rank 规格未在本 PR 中改动;本次只修正 Tiling 对实际 StorageShape 的校验对象与标量处理。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!5884 | 9 天前 | |
fix(add_v2,tensor_redirect): 加固边界校验、搬运与测试覆盖 Co-authored-by: raoliang_sac<raoliang4@huawei.com> # message auto-generated for no-merge-commit merge: !5612 merge fix/addv2-tensorredirect-quality-hardening-20260911 into master fix(add_v2,tensor_redirect): 加固边界校验、搬运与测试覆盖 Created-by: raoliang_sac Commit-by: raoliang_sac Merged-by: cann-robot Description: ## 描述 本PR对AddV2和TensorRedirect的Ascend 950PR/Ascend 950DT Ascend C实现进行质量加固,不修改其他产品的既有实现。实际变更17个文件(+1121/-237);正式ST保存在质量加固交付件中, tests/st及tests/ut/common公共辅助文件均不纳入本PR。 ### 改动概览 - AddV2补充输入输出origin/storage rank、shape、dtype、广播关系、空Tensor、负维及整数溢出校验;workspace改为读取编译信息或平台能力,并增加编译信息布局约束。 - TensorRedirect补充输入输出rank、shape、dtype、空Tensor及溢出校验;修正双缓冲空间对齐和DataCopyPad搬运边界,增加初始化失败与空Tensor提前返回,并规范化kernel入口文件名。 - 两个算子的TestSpec保留现有PyTorch golden实现,同时注册Torch和TensorFlow三方provider并分别验证。 - 两个算子的README补充逐产品dtype、静态/动态shape、rank及空Tensor差异,并明确实际调用方式。 ### 逐文件修改 #### TensorRedirect(11个文件) - conversion/tensor_redirect/CMakeLists.txt:规范License Header;仅为TensorRedirect Host UT目标补充CANN注册表头文件目录,不修改公共UT辅助文件。 - conversion/tensor_redirect/README.md:统一输出参数名为output_x,修正恒等传递语义,补充逐产品dtype、动态shape、rank及空Tensor差异,并明确仅支持GE图模式调用。 - conversion/tensor_redirect/op_host/arch35/tensor_redirect_tiling_arch35.cpp:补齐origin/storage rank、dtype、shape、负维、空Tensor和字节数溢出校验;空Tensor在shape乘积前识别;限制双缓冲UB及DataCopyPad块长,校验派生tiling参数,并从CompileInfo或平台读取核数、UB和workspace。 - conversion/tensor_redirect/op_host/tensor_redirect_def.cpp:将opFile.value从tensor_redirect_apt调整为规范化后的tensor_redirect入口名。 - conversion/tensor_redirect/op_kernel/arch35/tensor_redirect.h:让Init返回初始化结果;为GM Tensor设置每核有效长度;按对齐后的双缓冲容量初始化队列,并安全计算DataCopyPad字节长度。 - conversion/tensor_redirect/op_kernel/arch35/tensor_redirect_tiling_data.h:去除字段默认初始化,保持TilingData为可按字节初始化和序列化的trivial、standard-layout POD结构。 - conversion/tensor_redirect/op_kernel/tensor_redirect.cpp:由tensor_redirect_apt.cpp重命名;在创建TPipe前处理空Tensor和空workspace,并在各字节宽分支中检查InitBuffer初始化结果。 - conversion/tensor_redirect/tests/assets/golden.py:删除“独立PyTorch参考”的错误表述,在TestSpec中同时注册torch.clone和tf.identity三方provider。 - conversion/tensor_redirect/tests/ut/op_host/arch35/test_tensor_redirect_tiling_arch35.cpp:补充空context、origin rank、末尾零维空Tensor、字节数溢出、小/大UB、DataCopyPad上限等Host Tiling边界用例及通用不变量检查。 - conversion/tensor_redirect/tests/ut/op_kernel/CMakeLists.txt:新增Ascend 950 TensorRedirect Kernel UT目标并接入对应Host Tiling源码。 - conversion/tensor_redirect/tests/ut/op_kernel/test_tensor_redirect.cpp:新增空Tensor提前返回和单块正常搬运路径Kernel UT,验证零长度buffer不会初始化且正常路径可执行。 #### AddV2(6个文件) - math/add_v2/CMakeLists.txt:仅为AddV2 Host UT目标补充CANN注册表头文件目录,用于注册入口空context测试。 - math/add_v2/README.md:补充V2命名与广播语义、逐产品dtype/动态shape/rank/空Tensor差异,完善参数和广播说明,并明确仅支持GE图模式调用。 - math/add_v2/op_host/arch35/add_v2_tiling_arch35.cpp:新增支持dtype白名单、origin/storage rank、负维、元素数溢出和逐维广播结果校验;保证校验先于空Tensor早返;workspace改从CompileInfo或平台读取,并强化空context及平台资源检查。 - math/add_v2/op_host/arch35/add_v2_tiling_arch35.h:调整CompileInfo字段以匹配BroadcastCompileInfo前缀布局,新增isAscendC和libApiWorkspaceSize,并由静态断言约束字段偏移和结构大小。 - math/add_v2/tests/assets/golden.py:删除“独立PyTorch参考”的错误表述,在TestSpec中同时注册torch.add和tf.raw_ops.AddV2三方provider。 - math/add_v2/tests/ut/op_host/arch35/test_add_v2_tiling.cpp:适配新CompileInfo,补充workspace来源、空context、rank边界、dtype一致性、广播结果、负维、空Tensor、超大维及shape溢出等Host Tiling用例。 ## 关联的Issue - Closes #3195 ## 测试 - pre-commit:格式、clang-format、ruff、codespell通过;隔离固定oat-py==1.0.3一次检查17个完整变更文件,OAT通过。 - Host UT:111/111 PASS,其中AddV2 45个、TensorRedirect 66个。 - TensorRedirect Kernel UT:2/2 PASS。 - AddV2 release binary:L0 42/42、L1 509/509,精度、BINARY_MATCH和memory_oob均通过。 - TensorRedirect release binary:L0 30/30、L1 512/512,精度、BINARY_MATCH和memory_oob均通过。 - Torch/TensorFlow provider:AddV2各42/42,浮点适用集各18/18;TensorRedirect各30/30,浮点适用集各15/15。 - AddV2和TensorRedirect的动态源码JIT、GEIR验证均各1/1通过。 - README结构、Markdown、HTML标签、相对链接及OAT检查通过。 - 本地CI统一入口(定向、非全量):Ascend 950、Ascend 910B下的定向package构建及Host/API/Graph/Kernel UT目标均通过,未触发FULL_REQUIRED。 - 线上CI流水线bd81a7c634f54f869df1fdacbc66b796全量通过:PreBuild 5/5、Compile 35/35、UT 7/7、PreSmoke 3/3、后处理2/2。 - 未采集到有效device_us,不对性能作PASS结论;测试结论不外推到其他产品实现。 ## 文档更新 - [x] 更新math/add_v2/README.md。 - [x] 更新conversion/tensor_redirect/README.md。 - [x] 补充多产品能力差异及真实GE图模式调用说明。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [x] 其他:质量加固与测试覆盖 See merge request: cann/ops-math!5612 | 14 天前 | |
fix: 修复AddV2和TensorRedirect误校验OriginShape Co-authored-by: raoliang_sac<raoliang4@huawei.com> # message auto-generated for no-merge-commit merge: !5884 merge fix/add-v2-scalar-origin-rank into master fix: 修复AddV2和TensorRedirect误校验OriginShape Created-by: raoliang_sac Commit-by: raoliang_sac Merged-by: cann-robot Description: ## 描述 本 PR 修复 Ascend 950PR/Ascend 950DT(arch35)实现中 AddV2 和 TensorRedirect 对 OriginShape 进行 Tiling rank 校验而误拒绝合法输入的问题。 ### 问题场景 - TensorFlow 场景 tf.add(x, 1) 中,常量 1 的框架逻辑形态(OriginShape)是 []、rank 为 0;GE 运行时可将其规整为单元素存储形态(StorageShape)[1]。原实现同时按 [1, 8] 校验 OriginShape 和 StorageShape,导致合法标量广播在进入 Tiling 时失败。 - TensorRedirect 也存在同类问题:OriginShape 描述框架逻辑形态,StorageShape 才是 Tiling 和 Kernel 实际使用的计算形态;对 OriginShape 再做一遍 rank 限制会误伤合法的 shape 转换场景。 - StorageShape 本身为 rank 0 时表示单元素标量,元素个数为 1;原校验将其按 rank 下界 1 拒绝,与同类算子的标量处理不一致。 ### 修复方案 - AddV2、TensorRedirect 均不再在 Tiling 中单独校验 OriginShape,仅校验实际参与切分和计算的 StorageShape。 - 两个算子的 StorageShape rank 范围统一为 [0, 8],保留 rank 上界、负维、shape/广播关系、dtype、元素个数溢出等既有校验。 - AddV2 的 rank-0 StorageShape 在进入 ATVOSS Broadcast 模板后,由 EnsureNotScalar 以等价的 [1] 形态参与合轴和切分;该函数不修改 OriginShape 或 TilingContext 中的原始 StorageShape。 - 补充 origin/storage 不一致、TF 标量、rank-0 storage 标量及标量广播回归用例。该修复由 TensorFlow 标量场景暴露,但校验原则不限定于 TensorFlow。 ### 文件修改 - conversion/tensor_redirect/op_host/arch35/tensor_redirect_tiling_arch35.cpp:删除输入/输出 OriginShape rank 校验;StorageShape 支持 rank 0,继续校验 rank 上界、非负维和输入输出 storage shape 一致性。 - conversion/tensor_redirect/tests/ut/op_host/arch35/test_tensor_redirect_tiling_arch35.cpp:将 rank-0 StorageShape 改为成功用例,补充输入/输出 OriginShape 与 StorageShape rank 不一致的成功回归用例。 - math/add_v2/README.md:将 Ascend 950PR/Ascend 950DT 的 rank 范围更新为 [0, 8],说明 rank 0 表示标量。 - math/add_v2/op_host/arch35/add_v2_tiling_arch35.cpp:删除 x1、x2、y 的 OriginShape rank 校验;StorageShape 支持 rank 0,并继续执行实际 shape、广播及溢出校验。 - math/add_v2/tests/ut/op_host/arch35/test_add_v2_tiling.cpp:补充 TF 标量位于左右输入、标量与标量、rank-0 StorageShape 及其广播、OriginShape 不参与 Tiling rank 校验等用例。 ## 关联的Issue - 历史质量加固 Issue:https://gitcode.com/cann/ops-math/issues/3195。本 PR 修复该轮加固后暴露的标量 shape 校验回归。 ## 测试 - 使用工作目录 CANN:/workspace/July-Changwei-math/Ascend/cann-9.2.0。 - 分支已 rebase 到 cann/ops-math:master@968d685af5c6c5d95f207eb73126cca9b90745ee,并 squash 为 1 个提交:75d3c5deb29740b61560d09125aa05be424a6226。 - 定向 Host UT:AddV2 37 个、TensorRedirect 55 个,共 92/92 通过。 - 最新定向本地 CI(固定上述 master 快照、-j8)全部通过: - pre-commit:PASS; - 隔离 oat-py==1.0.3 一次检查完整 5 个变更文件:PASS; - README Markdown 链接:PASS; - Ascend 950:AddV2、TensorRedirect 定向 package 与 ophost UT:PASS; - Ascend 910B:AddV2、TensorRedirect 定向 package 与 ophost UT:PASS。 ## 文档更新 - 已更新 math/add_v2/README.md 中 Ascend 950PR/Ascend 950DT 的 rank-0 标量说明。 - TensorRedirect 的公开逻辑 rank 规格未在本 PR 中改动;本次只修正 Tiling 对实际 StorageShape 的校验对象与标量处理。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!5884 | 9 天前 |
AddV2
产品支持情况
| 产品 | 是否支持 |
|---|---|
| Ascend 950PR&950DT系列产品 | √ |
| Atlas A3系列产品 | √ |
| Atlas A2系列产品 | √ |
| Atlas 200I/500 A2推理产品 | √ |
| Atlas推理系列产品 | √ |
| Atlas训练系列产品 | √ |
功能说明
-
算子功能:对输入张量
x1和x2执行逐元素加法,支持广播,兼容TensorFlow AddV2语义。 -
版本说明:名称中的V2用于对应TensorFlow AddV2图节点,并不表示加法或广播规则发生变化。在AddV2与Add共同支持的数据类型范围内,两者的数学语义一致;AddV2的数据类型和调用通路以本文为准。
-
计算公式:
yi=x1,i+x2,iy_i=x_{1,i}+x_{2,i} yi=x1,i+x2,i
其中 iii 遍历广播结果的全部元素,x1,ix_{1,i}x1,i 和 x2,ix_{2,i}x2,i 表示广播后对应位置的元素。
- 广播示例:
x1 shape (3, 4), x2 shape (1, 4) -> y shape (3, 4)
x1 shape (3, 1), x2 shape (1, 4) -> y shape (3, 4)
广播时从末尾维度向前对齐,每组对应维度的长度必须相等,或至少有一路的维度长度为1。
参数说明
| 参数名 | 输入/输出/属性 | 描述 | 数据类型 | 数据格式 |
|---|---|---|---|---|
| x1 | 输入 | 加法运算的第一个输入张量,对应公式中的x1。 | BFLOAT16、FLOAT16、FLOAT、INT32、INT16、UINT8、INT8、INT64、COMPLEX64 | ND |
| x2 | 输入 | 加法运算的第二个输入张量,对应公式中的x2。数据类型与x1一致。 | BFLOAT16、FLOAT16、FLOAT、INT32、INT16、UINT8、INT8、INT64、COMPLEX64 | ND |
| y | 输出 | 加法运算的输出张量,对应公式中的y。数据类型与x1一致,shape为x1与x2的广播结果。 | BFLOAT16、FLOAT16、FLOAT、INT32、INT16、UINT8、INT8、INT64、COMPLEX64 | ND |
产品差异说明
| 产品 | 数据类型 | 静态shape能力 | 动态shape能力 | shape/rank及空Tensor限制 |
|---|---|---|---|---|
| Ascend 950PR&950DT系列产品 | BFLOAT16、FLOAT16、FLOAT、INT32、INT16、UINT8、INT8、INT64、COMPLEX64 | 输入ND→输出ND | 输入ND→输出ND;支持固定rank动态shape和dynamic rank | rank取值范围为[0, 8],rank为0时表示标量;支持空Tensor,输出y的shape仍必须是两路输入的广播结果 |
| Atlas A3系列产品 Atlas A2系列产品 |
BFLOAT16、FLOAT16、FLOAT、INT32、INT64 | 输入ND→输出ND | 输入ND→输出ND;支持固定rank动态shape,不支持dynamic rank | rank取值范围为[0, 8],rank为0时表示标量;空Tensor仅支持两路输入shape相同,或其中一路输入为单元素张量的广播场景 |
| Atlas 200I/500 A2推理产品 Atlas推理系列产品 Atlas训练系列产品 |
FLOAT16、FLOAT、INT32、INT64 | 输入ND→输出ND | 输入ND→输出ND;支持固定rank动态shape,不支持dynamic rank | rank取值范围为[0, 8],rank为0时表示标量;空Tensor仅支持两路输入shape相同,或其中一路输入为单元素张量的广播场景 |
约束说明
无
调用说明
| 调用方式 | 调用样例 | 说明 |
|---|---|---|
| GE图模式 | test_geir_add_v2 | 通过算子IR构图方式调用AddV2算子。 |
本算子不提供同名aclnn接口,仅支持上表的GE图模式调用。