| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
format cpp Co-authored-by: yang-di52<yangdi52@huawei.com> # message auto-generated for no-merge-commit merge: !6784 merge issue_fix into master format cpp Created-by: yang-di52 Commit-by: yang-di52 Merged-by: cann-robot Description: ## 描述 批量刷新cpp代码格式 ## 关联的Issue [#3791](https://gitcode.com/cann/ops-nn/issues/3791) ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [x] 其他,请描述:代码格式化 ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!6784 | 30 天前 | |
format cpp Co-authored-by: yang-di52<yangdi52@huawei.com> # message auto-generated for no-merge-commit merge: !6784 merge issue_fix into master format cpp Created-by: yang-di52 Commit-by: yang-di52 Merged-by: cann-robot Description: ## 描述 批量刷新cpp代码格式 ## 关联的Issue [#3791](https://gitcode.com/cann/ops-nn/issues/3791) ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [x] 其他,请描述:代码格式化 ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!6784 | 30 天前 | |
format cpp Co-authored-by: yang-di52<yangdi52@huawei.com> # message auto-generated for no-merge-commit merge: !6784 merge issue_fix into master format cpp Created-by: yang-di52 Commit-by: yang-di52 Merged-by: cann-robot Description: ## 描述 批量刷新cpp代码格式 ## 关联的Issue [#3791](https://gitcode.com/cann/ops-nn/issues/3791) ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [x] 其他,请描述:代码格式化 ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!6784 | 30 天前 | |
format cpp Co-authored-by: yang-di52<yangdi52@huawei.com> # message auto-generated for no-merge-commit merge: !6784 merge issue_fix into master format cpp Created-by: yang-di52 Commit-by: yang-di52 Merged-by: cann-robot Description: ## 描述 批量刷新cpp代码格式 ## 关联的Issue [#3791](https://gitcode.com/cann/ops-nn/issues/3791) ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [x] 其他,请描述:代码格式化 ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!6784 | 30 天前 | |
fix(batch_norm/batch_norm_v3): 修复 arch35 上 ND 格式训练场景的结果错误与 tiling 失败 Co-authored-by: qianzehong<qianzehong@huawei.com> # message auto-generated for no-merge-commit merge: !8087 merge fix/batch-norm-nd-small-reduce into master fix(batch_norm/batch_norm_v3): 修复 arch35 上 ND 格式训练场景的结果错误与 tiling 失败 Created-by: qianzehong Commit-by: qianzehong Merged-by: cann-robot Description: ## 描述 两个算子上同一个根因的两种表现:**ND 格式的 x 落进了接不住它的 Welford 模板**。基类已把五种 format 统一折算成 (r1, a, r0),模板往下只消费这三个值,但模板选择和 Welford 自带的折算里仍按 format 做了过滤,导致 ND 被排除或直接失败。 ### batch_norm:ND 小归约长度结果错误 / VEC_ERROR x=[8,512,4] ND fp32 训练场景,batch_mean / batch_variance 恒为 0,reserve_space_2 恒为 1/sqrt(eps)=100,y 随之被放大约 100 倍。 - BatchNormFullReduceTilingBase / BatchNormRARBlockSplitRTiling 的 IsCapable 有 xFormat_ != FORMAT_NCHW && != FORMAT_NCDHW -> return false。NHWC/NDHWC 折算后 r0_ 恒为 1,会先被只收 RA pattern 的模板(优先级 10000/12000/15000)接走,所以这道门的净效果**仅仅是排除 ND**;ND 且 r0_ > 1 于是只剩兜底的 Welford(30000,IsCapable 恒 true)可选。 - Welford 的二分折叠要求 binaryAddQuotient 是整数个 vlLenFp32(kernel 侧按 dichotomyAddPower / VL_FP32 取整块循环次数),而 DoOpTiling 的算法是「先把下限兜到 vlLenFp32、再无条件折半」,parallelN <= vlLenFp32 时退化成半个 VL(32),dichotomyAddPowerLoopCount 恒为 0: - reminder 为 0 或下溢时,整块/尾块循环都跑 0 次,dichotomyAddLocal 从未被写过,且 binaryAddLastNum 也是 0,归约结果恒为 0; - reminder 为小正数时,整块循环次数 0 - 1 在 uint16_t 下下溢成 65535,按 VL 步进读 UB 越界,表现为 VEC_ERROR。 实测边界与该算式完全吻合:r1*r0 = 16/32 静默归零,40/48/64 越界,>= 65 正确。 另外 Welford 的 DoOpTiling 里 uint64_t ubRemain = totalUBSize - smallUbSize - ... 存在同样的无符号下溢(smallUbSize / blockSize_ 为 uint64_t,固定开销大于总 UB 时相减会在表达式内下溢成巨大值,仅改左值类型无效,算术转换发生在赋值之前),会算出无意义的切分参数却报 tiling 成功。一并改为统一按有符号数计算,并把校验放在向下对齐之后判 ubSizeAlign > 0——ubRemain 为负时 ubSizeAlign 同样不为正,为正但不足一个对齐单位(fp32 下 192 字节)时会被抹成 0,一条覆盖两种情况。 **方案**:去掉两处按 format 的过滤,模板选择只依据 (r1_, a_, r0_) + dtype + UB;Welford 的 IsCapable 增加 r1_ * r0_ <= vlFp32_ 拒收(该区间不存在合法的 binaryAddQuotient 取值),这类 shape 由 FullReduce 承接,其 kernel 侧按 CeilDiv + 掩码处理不足一个 VL 的归约。binaryAddQuotient 原算式不动,避免影响该模板在 parallelN > vlFp32 区间已在生效的行为。 ### batch_norm_v3:ND 大归约长度 tiling 失败 ND [2048,32,16] / [4096,32,8] / [1024,64,16] / [4096,16,8] / [8192,8,16] 报 OPTILING_FAILURE,算子无法运行。plog 根因: [batch_norm_v3_tiling_welford_arch35.cpp][GetShapeAttrsInfo] Parameter x of has incorrect format ND. It should be NCHW or NCDHW. BatchNormV3WelfordReduceTilingBase 直接继承框架 TilingBaseClass 而非本算子的 BatchNormV3RegbaseTilingBase,自带一份 GetShapeAttrsInfo,只写了 NCHW/NCDHW 两个分支、else 直接 GRAPH_FAILED;它又是优先级最低的兜底模板,失败即整个算子 tiling 失败。ND 自 !4921 起已在 config_950 注册,基类与 FullReduce 也都支持,本模板是唯一缺口。 **方案**: - Welford 的 GetShapeAttrsInfo 补齐 ND / NHWC / NDHWC 三个分支,折算与基类一致,报错文案改为完整五种 format。 - NHWC/NDHWC 的 r0 由 0 归一为 1(乘法/取模的单位元)。原先取 0 使得「r0 == 1 表示 RA pattern」对这两种 format 不成立,各模板只能额外按 format 特判;归一后 RAFullReduce / BlockSplitR / RAWelford 三处 if (format != NHWC && != NDHWC) { if (r0 != 1) ... } 简化为直接判 r0。这三个模板此前也只在该判断里读 r0,DoOpTiling 未使用,行为不变。 - RARBlockSplitR 的 IsCapable 去掉按 format 的过滤,理由同 batch_norm。 - Welford 的 IsCapable 增加 r1 * r0 <= vlFp32 拒收,与 batch_norm 一致。 - 修复 Welford DoOpTiling 中 ubRemain 的无符号下溢:smallUbSize / blockSize 为 uint64_t,固定开销大于总 UB 时相减会在表达式内下溢成巨大值(仅改左值类型无效,算术转换发生在赋值之前),进而算出无意义的切分参数却报 tiling 成功。改为统一按有符号数计算,并把校验放在向下对齐之后判 ubSizeAlign > 0。此前未暴露,是因为 NHWC 被 format 拒在前面。 ### 附带:TQue 的 depth 模板参数统一为 1 来自 Issue #4389(PR #8019 的检视意见,@fanqirui):TQue 的第二个模板参数是队列深度(depth),不是 buffer 个数,一般算子用 1 就够了。两个算子的 arch35 kernel 共 **60 处**把 DOUBLE_BUFFER / SINGLE_BUFFER / BUFFER_NUM 用在了该位置,一并改为 1: | 算子 | 文件 | 处数 | 原值 | |---|---|---|---| | batch_norm | batch_norm_welford.h | 10 | DOUBLE_BUFFER | | | batch_norm_full_reduce.h | 10 | DOUBLE_BUFFER | | | batch_norm_ra_full_reduce.h | 10 | DOUBLE_BUFFER | | | batch_norm_ra_welford.h | 2 | DOUBLE_BUFFER | | batch_norm_v3 | batch_norm_v3_welford.h | 10 | BUFFER_NUM | | | batch_norm_v3_ra_full_reduce.h | 10 | DOUBLE_BUFFER | | | batch_norm_v3.h | 6 | DOUBLE_BUFFER ×2 + SINGLE_BUFFER ×4 | | | batch_norm_v3_ra_welford.h | 2 | DOUBLE_BUFFER | **只改 TQue 的模板参数位**——InitBuffer 的缓冲个数、上述三个常量的定义、以及 host 侧 UB 估算均不改动,因此 UB 占用不变,不存在 host / kernel 深度系数不同步的问题(Issue 的 B 项所担心的同步下调,是针对"降 InitBuffer 缓冲个数"的场景)。两算子的 infer 系模板本来就是 depth=1 配 InitBuffer 缓冲个数 2,本次是与其对齐;改动后这三个常量只出现在 InitBuffer 位置上,语义不再有歧义。 未改动:regbase_common.h 的模板形参 QUEUE_DEPTH 由实参类型推导,调用方队列均已为 depth=1;infer 系的 BUFFER_DEPTH 与 block_split_r 系的裸字面量 1 本就正确。 对 Issue #4389 的两点补充:BUFFER_NUM 在 infer 系 5 个文件里是 InitBuffer 的缓冲个数、命名本来就对(与 BUFFER_DEPTH = 1 并存、各司其职),真用在 depth 位置的只有 batch_norm_v3_welford.h;另外 batch_norm 存在同样问题且范围更大(32 处 vs bnv3 28 处),Issue 中"只覆盖 batch_norm_v3"的范围偏窄。 ## 关联的Issue - #4389(PR #8019 检视意见的跟踪项,本 PR 落地了其中 TQue depth 收窄为 1 的部分) - #4443(本 PR 修复的 ND 格式 tiling 缺陷,即本 PR 主体改动) ## 测试 ### op_host tiling UT(--soc=ascend950) 全量 **70/70 通过**(batch_norm 15 + batch_norm_v3 51 + infershape 4),新增 13 条用例: | 用例 | 断言 | |---|---| | batch_norm_tiling_nd_r0_gt_one_full_reduce_arch35 | ND [8,512,4] / [8,512,8] / [8,512,5] / [8,512,4,1] → 200000 | | batch_norm_tiling_nd_nchw_equivalence_arch35 | 同 dims 的 ND 与 NCHW,tilingkey 相同**且 tiling data 逐字节相同** | | batch_norm_tiling_large_reduce_still_welford_arch35 | [2048,32,16] → 300000,守卫未误伤 Welford 本职 | | batch_norm_tiling_nd_rar_block_split_r_arch35 | ND [4096,16,8] 与 NCHW [4096,16,4,2] → 250000,tiling data 相同 | | batch_norm_v3_nd_format_ascend950_large_reduce_welford | ND [2048,32,16] → 300000(修前 GRAPH_FAILED) | | batch_norm_v3_nd_format_ascend950_small_reduce_full_reduce | ND [8,512,4] → 200000 | | batch_norm_v3_nchw_format_ascend950_large_reduce_welford | NCHW [2048,32,4,4] → 300000 | | batch_norm_v3_nd/nchw_format_ascend950_rar_block_split_r | ND [4096,16,8] / NCHW [4096,16,4,2] → 250000 | | batch_norm_v3_nhwc/ndhwc_format_ascend950_ra_pattern | NHWC [2,8,8,64] / NDHWC [2,2,4,8,64] → 400000,钉住 r0 归一后的路由 | | batch_norm_tiling_welford_ub_not_enough_arch35 | UB=1024 时 ND [256,512,8] 落到 Welford,断言 tiling 明确失败而非带着下溢参数报成功 | | batch_norm_tiling_welford_ub_align_to_zero_arch35 / batch_norm_v3_welford_ub_align_to_zero | UB=2624 时 ubRemain = 64 > 0 但 ubSizeAlign 被抹成 0,断言 tiling 明确失败 | 关键用例均做过区分力自检:撤销对应改动后精确失败(路由到错误模板,或 tiling_func 返回 GRAPH_FAILED)。 ### Ascend950 上板(TTK,内置包与自建包 A/B) **batch_norm(30 条)** | shape | 修前 | 修后 | |---|---|---| | [8,512,4] ND fp32 | 五个输出逐元素通过率 **0%** | tilingkey 200000,全部 **100%** | | r1*r0 = 16 / 32 | 归零 | 正确 | | r1*r0 = 40 / 48 / 64 | **VEC_ERROR** | 正确 | | r1*r0 >= 65、r0 == 1 | 正确 | 路由与精度均无变化 | | ND [4096,16,8] / [8192,8,16] | 300000 | 250000,与同 dims 的 NCHW 一致 | **batch_norm_v3** | shape | 修前 | 修后 | |---|---|---| | ND [2048,32,16] / [4096,32,8] / [1024,64,16] | **OPTILING_FAILURE** | 300000,通过率 99.99% | | ND [4096,16,8] / [8192,8,16] | **OPTILING_FAILURE** | 250000,与 NCHW [4096,16,4,2] 一致 | | ND [8,512,2/4/8/13]、[8,512](r0==1) | 正确 | 路由与精度均无变化 | **TQue depth 改动的性能 A/B**(两侧均 rm -rf build build_out 全新编包、同一 session、各三轮取中位数、按 [min, max] 区间是否分离判定) | | 用例数 | delta 中位数 | 最差 | 最好 | 区间分离 | |---|---|---|---|---|---| | batch_norm | 30 | **−0.2%** | +2.1% | −2.8% | 1 例 | | batch_norm_v3 | 11 | **+0.1%** | +3.0% | −6.5% | 1 例 | 两例区间分离(bn_fp32_nd_32_512_4 +2.0%、bnv3_nd_8192_8_16 +1.7%)均在 wall-clock 噪声带内,分离源于 base 侧该轮波动过小(前者区间宽度仅 0.03us),反方向亦有同量级样本(bnv3_nd_8_512 −6.5%),无一致方向性,判定为无性能回退。精度与 tiling key 在两算子全部用例上均无变化。 残余未达标项为逐元素通过率 99.98% 量级、最大绝对误差 2.4e-07(fp32 ULP),且集中在 |golden| ~1e-5 的近零点上;未改动的 NCHW 对照用例(nchw_8_512_4、nchw_8_512_2_2、nchw_8_512_4_1)表现相同,属判据在近零输出上的容差问题,非本次改动引入。 ## 文档更新 无。本次仅改 host 侧 tiling 与 UT,未涉及对外接口、约束与文档。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-nn!8087 | 7 小时前 | |
format cpp Co-authored-by: yang-di52<yangdi52@huawei.com> # message auto-generated for no-merge-commit merge: !6784 merge issue_fix into master format cpp Created-by: yang-di52 Commit-by: yang-di52 Merged-by: cann-robot Description: ## 描述 批量刷新cpp代码格式 ## 关联的Issue [#3791](https://gitcode.com/cann/ops-nn/issues/3791) ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [x] 其他,请描述:代码格式化 ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!6784 | 30 天前 | |
format cpp Co-authored-by: yang-di52<yangdi52@huawei.com> # message auto-generated for no-merge-commit merge: !6784 merge issue_fix into master format cpp Created-by: yang-di52 Commit-by: yang-di52 Merged-by: cann-robot Description: ## 描述 批量刷新cpp代码格式 ## 关联的Issue [#3791](https://gitcode.com/cann/ops-nn/issues/3791) ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [x] 其他,请描述:代码格式化 ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!6784 | 30 天前 | |
format cpp Co-authored-by: yang-di52<yangdi52@huawei.com> # message auto-generated for no-merge-commit merge: !6784 merge issue_fix into master format cpp Created-by: yang-di52 Commit-by: yang-di52 Merged-by: cann-robot Description: ## 描述 批量刷新cpp代码格式 ## 关联的Issue [#3791](https://gitcode.com/cann/ops-nn/issues/3791) ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [x] 其他,请描述:代码格式化 ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!6784 | 30 天前 | |
format cpp Co-authored-by: yang-di52<yangdi52@huawei.com> # message auto-generated for no-merge-commit merge: !6784 merge issue_fix into master format cpp Created-by: yang-di52 Commit-by: yang-di52 Merged-by: cann-robot Description: ## 描述 批量刷新cpp代码格式 ## 关联的Issue [#3791](https://gitcode.com/cann/ops-nn/issues/3791) ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [x] 其他,请描述:代码格式化 ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!6784 | 30 天前 | |
fix(batch_norm/batch_norm_v3): 修复 arch35 上 ND 格式训练场景的结果错误与 tiling 失败 Co-authored-by: qianzehong<qianzehong@huawei.com> # message auto-generated for no-merge-commit merge: !8087 merge fix/batch-norm-nd-small-reduce into master fix(batch_norm/batch_norm_v3): 修复 arch35 上 ND 格式训练场景的结果错误与 tiling 失败 Created-by: qianzehong Commit-by: qianzehong Merged-by: cann-robot Description: ## 描述 两个算子上同一个根因的两种表现:**ND 格式的 x 落进了接不住它的 Welford 模板**。基类已把五种 format 统一折算成 (r1, a, r0),模板往下只消费这三个值,但模板选择和 Welford 自带的折算里仍按 format 做了过滤,导致 ND 被排除或直接失败。 ### batch_norm:ND 小归约长度结果错误 / VEC_ERROR x=[8,512,4] ND fp32 训练场景,batch_mean / batch_variance 恒为 0,reserve_space_2 恒为 1/sqrt(eps)=100,y 随之被放大约 100 倍。 - BatchNormFullReduceTilingBase / BatchNormRARBlockSplitRTiling 的 IsCapable 有 xFormat_ != FORMAT_NCHW && != FORMAT_NCDHW -> return false。NHWC/NDHWC 折算后 r0_ 恒为 1,会先被只收 RA pattern 的模板(优先级 10000/12000/15000)接走,所以这道门的净效果**仅仅是排除 ND**;ND 且 r0_ > 1 于是只剩兜底的 Welford(30000,IsCapable 恒 true)可选。 - Welford 的二分折叠要求 binaryAddQuotient 是整数个 vlLenFp32(kernel 侧按 dichotomyAddPower / VL_FP32 取整块循环次数),而 DoOpTiling 的算法是「先把下限兜到 vlLenFp32、再无条件折半」,parallelN <= vlLenFp32 时退化成半个 VL(32),dichotomyAddPowerLoopCount 恒为 0: - reminder 为 0 或下溢时,整块/尾块循环都跑 0 次,dichotomyAddLocal 从未被写过,且 binaryAddLastNum 也是 0,归约结果恒为 0; - reminder 为小正数时,整块循环次数 0 - 1 在 uint16_t 下下溢成 65535,按 VL 步进读 UB 越界,表现为 VEC_ERROR。 实测边界与该算式完全吻合:r1*r0 = 16/32 静默归零,40/48/64 越界,>= 65 正确。 另外 Welford 的 DoOpTiling 里 uint64_t ubRemain = totalUBSize - smallUbSize - ... 存在同样的无符号下溢(smallUbSize / blockSize_ 为 uint64_t,固定开销大于总 UB 时相减会在表达式内下溢成巨大值,仅改左值类型无效,算术转换发生在赋值之前),会算出无意义的切分参数却报 tiling 成功。一并改为统一按有符号数计算,并把校验放在向下对齐之后判 ubSizeAlign > 0——ubRemain 为负时 ubSizeAlign 同样不为正,为正但不足一个对齐单位(fp32 下 192 字节)时会被抹成 0,一条覆盖两种情况。 **方案**:去掉两处按 format 的过滤,模板选择只依据 (r1_, a_, r0_) + dtype + UB;Welford 的 IsCapable 增加 r1_ * r0_ <= vlFp32_ 拒收(该区间不存在合法的 binaryAddQuotient 取值),这类 shape 由 FullReduce 承接,其 kernel 侧按 CeilDiv + 掩码处理不足一个 VL 的归约。binaryAddQuotient 原算式不动,避免影响该模板在 parallelN > vlFp32 区间已在生效的行为。 ### batch_norm_v3:ND 大归约长度 tiling 失败 ND [2048,32,16] / [4096,32,8] / [1024,64,16] / [4096,16,8] / [8192,8,16] 报 OPTILING_FAILURE,算子无法运行。plog 根因: [batch_norm_v3_tiling_welford_arch35.cpp][GetShapeAttrsInfo] Parameter x of has incorrect format ND. It should be NCHW or NCDHW. BatchNormV3WelfordReduceTilingBase 直接继承框架 TilingBaseClass 而非本算子的 BatchNormV3RegbaseTilingBase,自带一份 GetShapeAttrsInfo,只写了 NCHW/NCDHW 两个分支、else 直接 GRAPH_FAILED;它又是优先级最低的兜底模板,失败即整个算子 tiling 失败。ND 自 !4921 起已在 config_950 注册,基类与 FullReduce 也都支持,本模板是唯一缺口。 **方案**: - Welford 的 GetShapeAttrsInfo 补齐 ND / NHWC / NDHWC 三个分支,折算与基类一致,报错文案改为完整五种 format。 - NHWC/NDHWC 的 r0 由 0 归一为 1(乘法/取模的单位元)。原先取 0 使得「r0 == 1 表示 RA pattern」对这两种 format 不成立,各模板只能额外按 format 特判;归一后 RAFullReduce / BlockSplitR / RAWelford 三处 if (format != NHWC && != NDHWC) { if (r0 != 1) ... } 简化为直接判 r0。这三个模板此前也只在该判断里读 r0,DoOpTiling 未使用,行为不变。 - RARBlockSplitR 的 IsCapable 去掉按 format 的过滤,理由同 batch_norm。 - Welford 的 IsCapable 增加 r1 * r0 <= vlFp32 拒收,与 batch_norm 一致。 - 修复 Welford DoOpTiling 中 ubRemain 的无符号下溢:smallUbSize / blockSize 为 uint64_t,固定开销大于总 UB 时相减会在表达式内下溢成巨大值(仅改左值类型无效,算术转换发生在赋值之前),进而算出无意义的切分参数却报 tiling 成功。改为统一按有符号数计算,并把校验放在向下对齐之后判 ubSizeAlign > 0。此前未暴露,是因为 NHWC 被 format 拒在前面。 ### 附带:TQue 的 depth 模板参数统一为 1 来自 Issue #4389(PR #8019 的检视意见,@fanqirui):TQue 的第二个模板参数是队列深度(depth),不是 buffer 个数,一般算子用 1 就够了。两个算子的 arch35 kernel 共 **60 处**把 DOUBLE_BUFFER / SINGLE_BUFFER / BUFFER_NUM 用在了该位置,一并改为 1: | 算子 | 文件 | 处数 | 原值 | |---|---|---|---| | batch_norm | batch_norm_welford.h | 10 | DOUBLE_BUFFER | | | batch_norm_full_reduce.h | 10 | DOUBLE_BUFFER | | | batch_norm_ra_full_reduce.h | 10 | DOUBLE_BUFFER | | | batch_norm_ra_welford.h | 2 | DOUBLE_BUFFER | | batch_norm_v3 | batch_norm_v3_welford.h | 10 | BUFFER_NUM | | | batch_norm_v3_ra_full_reduce.h | 10 | DOUBLE_BUFFER | | | batch_norm_v3.h | 6 | DOUBLE_BUFFER ×2 + SINGLE_BUFFER ×4 | | | batch_norm_v3_ra_welford.h | 2 | DOUBLE_BUFFER | **只改 TQue 的模板参数位**——InitBuffer 的缓冲个数、上述三个常量的定义、以及 host 侧 UB 估算均不改动,因此 UB 占用不变,不存在 host / kernel 深度系数不同步的问题(Issue 的 B 项所担心的同步下调,是针对"降 InitBuffer 缓冲个数"的场景)。两算子的 infer 系模板本来就是 depth=1 配 InitBuffer 缓冲个数 2,本次是与其对齐;改动后这三个常量只出现在 InitBuffer 位置上,语义不再有歧义。 未改动:regbase_common.h 的模板形参 QUEUE_DEPTH 由实参类型推导,调用方队列均已为 depth=1;infer 系的 BUFFER_DEPTH 与 block_split_r 系的裸字面量 1 本就正确。 对 Issue #4389 的两点补充:BUFFER_NUM 在 infer 系 5 个文件里是 InitBuffer 的缓冲个数、命名本来就对(与 BUFFER_DEPTH = 1 并存、各司其职),真用在 depth 位置的只有 batch_norm_v3_welford.h;另外 batch_norm 存在同样问题且范围更大(32 处 vs bnv3 28 处),Issue 中"只覆盖 batch_norm_v3"的范围偏窄。 ## 关联的Issue - #4389(PR #8019 检视意见的跟踪项,本 PR 落地了其中 TQue depth 收窄为 1 的部分) - #4443(本 PR 修复的 ND 格式 tiling 缺陷,即本 PR 主体改动) ## 测试 ### op_host tiling UT(--soc=ascend950) 全量 **70/70 通过**(batch_norm 15 + batch_norm_v3 51 + infershape 4),新增 13 条用例: | 用例 | 断言 | |---|---| | batch_norm_tiling_nd_r0_gt_one_full_reduce_arch35 | ND [8,512,4] / [8,512,8] / [8,512,5] / [8,512,4,1] → 200000 | | batch_norm_tiling_nd_nchw_equivalence_arch35 | 同 dims 的 ND 与 NCHW,tilingkey 相同**且 tiling data 逐字节相同** | | batch_norm_tiling_large_reduce_still_welford_arch35 | [2048,32,16] → 300000,守卫未误伤 Welford 本职 | | batch_norm_tiling_nd_rar_block_split_r_arch35 | ND [4096,16,8] 与 NCHW [4096,16,4,2] → 250000,tiling data 相同 | | batch_norm_v3_nd_format_ascend950_large_reduce_welford | ND [2048,32,16] → 300000(修前 GRAPH_FAILED) | | batch_norm_v3_nd_format_ascend950_small_reduce_full_reduce | ND [8,512,4] → 200000 | | batch_norm_v3_nchw_format_ascend950_large_reduce_welford | NCHW [2048,32,4,4] → 300000 | | batch_norm_v3_nd/nchw_format_ascend950_rar_block_split_r | ND [4096,16,8] / NCHW [4096,16,4,2] → 250000 | | batch_norm_v3_nhwc/ndhwc_format_ascend950_ra_pattern | NHWC [2,8,8,64] / NDHWC [2,2,4,8,64] → 400000,钉住 r0 归一后的路由 | | batch_norm_tiling_welford_ub_not_enough_arch35 | UB=1024 时 ND [256,512,8] 落到 Welford,断言 tiling 明确失败而非带着下溢参数报成功 | | batch_norm_tiling_welford_ub_align_to_zero_arch35 / batch_norm_v3_welford_ub_align_to_zero | UB=2624 时 ubRemain = 64 > 0 但 ubSizeAlign 被抹成 0,断言 tiling 明确失败 | 关键用例均做过区分力自检:撤销对应改动后精确失败(路由到错误模板,或 tiling_func 返回 GRAPH_FAILED)。 ### Ascend950 上板(TTK,内置包与自建包 A/B) **batch_norm(30 条)** | shape | 修前 | 修后 | |---|---|---| | [8,512,4] ND fp32 | 五个输出逐元素通过率 **0%** | tilingkey 200000,全部 **100%** | | r1*r0 = 16 / 32 | 归零 | 正确 | | r1*r0 = 40 / 48 / 64 | **VEC_ERROR** | 正确 | | r1*r0 >= 65、r0 == 1 | 正确 | 路由与精度均无变化 | | ND [4096,16,8] / [8192,8,16] | 300000 | 250000,与同 dims 的 NCHW 一致 | **batch_norm_v3** | shape | 修前 | 修后 | |---|---|---| | ND [2048,32,16] / [4096,32,8] / [1024,64,16] | **OPTILING_FAILURE** | 300000,通过率 99.99% | | ND [4096,16,8] / [8192,8,16] | **OPTILING_FAILURE** | 250000,与 NCHW [4096,16,4,2] 一致 | | ND [8,512,2/4/8/13]、[8,512](r0==1) | 正确 | 路由与精度均无变化 | **TQue depth 改动的性能 A/B**(两侧均 rm -rf build build_out 全新编包、同一 session、各三轮取中位数、按 [min, max] 区间是否分离判定) | | 用例数 | delta 中位数 | 最差 | 最好 | 区间分离 | |---|---|---|---|---|---| | batch_norm | 30 | **−0.2%** | +2.1% | −2.8% | 1 例 | | batch_norm_v3 | 11 | **+0.1%** | +3.0% | −6.5% | 1 例 | 两例区间分离(bn_fp32_nd_32_512_4 +2.0%、bnv3_nd_8192_8_16 +1.7%)均在 wall-clock 噪声带内,分离源于 base 侧该轮波动过小(前者区间宽度仅 0.03us),反方向亦有同量级样本(bnv3_nd_8_512 −6.5%),无一致方向性,判定为无性能回退。精度与 tiling key 在两算子全部用例上均无变化。 残余未达标项为逐元素通过率 99.98% 量级、最大绝对误差 2.4e-07(fp32 ULP),且集中在 |golden| ~1e-5 的近零点上;未改动的 NCHW 对照用例(nchw_8_512_4、nchw_8_512_2_2、nchw_8_512_4_1)表现相同,属判据在近零输出上的容差问题,非本次改动引入。 ## 文档更新 无。本次仅改 host 侧 tiling 与 UT,未涉及对外接口、约束与文档。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-nn!8087 | 7 小时前 | |
fix(batch_norm/batch_norm_v3): 修复 arch35 上 ND 格式训练场景的结果错误与 tiling 失败 Co-authored-by: qianzehong<qianzehong@huawei.com> # message auto-generated for no-merge-commit merge: !8087 merge fix/batch-norm-nd-small-reduce into master fix(batch_norm/batch_norm_v3): 修复 arch35 上 ND 格式训练场景的结果错误与 tiling 失败 Created-by: qianzehong Commit-by: qianzehong Merged-by: cann-robot Description: ## 描述 两个算子上同一个根因的两种表现:**ND 格式的 x 落进了接不住它的 Welford 模板**。基类已把五种 format 统一折算成 (r1, a, r0),模板往下只消费这三个值,但模板选择和 Welford 自带的折算里仍按 format 做了过滤,导致 ND 被排除或直接失败。 ### batch_norm:ND 小归约长度结果错误 / VEC_ERROR x=[8,512,4] ND fp32 训练场景,batch_mean / batch_variance 恒为 0,reserve_space_2 恒为 1/sqrt(eps)=100,y 随之被放大约 100 倍。 - BatchNormFullReduceTilingBase / BatchNormRARBlockSplitRTiling 的 IsCapable 有 xFormat_ != FORMAT_NCHW && != FORMAT_NCDHW -> return false。NHWC/NDHWC 折算后 r0_ 恒为 1,会先被只收 RA pattern 的模板(优先级 10000/12000/15000)接走,所以这道门的净效果**仅仅是排除 ND**;ND 且 r0_ > 1 于是只剩兜底的 Welford(30000,IsCapable 恒 true)可选。 - Welford 的二分折叠要求 binaryAddQuotient 是整数个 vlLenFp32(kernel 侧按 dichotomyAddPower / VL_FP32 取整块循环次数),而 DoOpTiling 的算法是「先把下限兜到 vlLenFp32、再无条件折半」,parallelN <= vlLenFp32 时退化成半个 VL(32),dichotomyAddPowerLoopCount 恒为 0: - reminder 为 0 或下溢时,整块/尾块循环都跑 0 次,dichotomyAddLocal 从未被写过,且 binaryAddLastNum 也是 0,归约结果恒为 0; - reminder 为小正数时,整块循环次数 0 - 1 在 uint16_t 下下溢成 65535,按 VL 步进读 UB 越界,表现为 VEC_ERROR。 实测边界与该算式完全吻合:r1*r0 = 16/32 静默归零,40/48/64 越界,>= 65 正确。 另外 Welford 的 DoOpTiling 里 uint64_t ubRemain = totalUBSize - smallUbSize - ... 存在同样的无符号下溢(smallUbSize / blockSize_ 为 uint64_t,固定开销大于总 UB 时相减会在表达式内下溢成巨大值,仅改左值类型无效,算术转换发生在赋值之前),会算出无意义的切分参数却报 tiling 成功。一并改为统一按有符号数计算,并把校验放在向下对齐之后判 ubSizeAlign > 0——ubRemain 为负时 ubSizeAlign 同样不为正,为正但不足一个对齐单位(fp32 下 192 字节)时会被抹成 0,一条覆盖两种情况。 **方案**:去掉两处按 format 的过滤,模板选择只依据 (r1_, a_, r0_) + dtype + UB;Welford 的 IsCapable 增加 r1_ * r0_ <= vlFp32_ 拒收(该区间不存在合法的 binaryAddQuotient 取值),这类 shape 由 FullReduce 承接,其 kernel 侧按 CeilDiv + 掩码处理不足一个 VL 的归约。binaryAddQuotient 原算式不动,避免影响该模板在 parallelN > vlFp32 区间已在生效的行为。 ### batch_norm_v3:ND 大归约长度 tiling 失败 ND [2048,32,16] / [4096,32,8] / [1024,64,16] / [4096,16,8] / [8192,8,16] 报 OPTILING_FAILURE,算子无法运行。plog 根因: [batch_norm_v3_tiling_welford_arch35.cpp][GetShapeAttrsInfo] Parameter x of has incorrect format ND. It should be NCHW or NCDHW. BatchNormV3WelfordReduceTilingBase 直接继承框架 TilingBaseClass 而非本算子的 BatchNormV3RegbaseTilingBase,自带一份 GetShapeAttrsInfo,只写了 NCHW/NCDHW 两个分支、else 直接 GRAPH_FAILED;它又是优先级最低的兜底模板,失败即整个算子 tiling 失败。ND 自 !4921 起已在 config_950 注册,基类与 FullReduce 也都支持,本模板是唯一缺口。 **方案**: - Welford 的 GetShapeAttrsInfo 补齐 ND / NHWC / NDHWC 三个分支,折算与基类一致,报错文案改为完整五种 format。 - NHWC/NDHWC 的 r0 由 0 归一为 1(乘法/取模的单位元)。原先取 0 使得「r0 == 1 表示 RA pattern」对这两种 format 不成立,各模板只能额外按 format 特判;归一后 RAFullReduce / BlockSplitR / RAWelford 三处 if (format != NHWC && != NDHWC) { if (r0 != 1) ... } 简化为直接判 r0。这三个模板此前也只在该判断里读 r0,DoOpTiling 未使用,行为不变。 - RARBlockSplitR 的 IsCapable 去掉按 format 的过滤,理由同 batch_norm。 - Welford 的 IsCapable 增加 r1 * r0 <= vlFp32 拒收,与 batch_norm 一致。 - 修复 Welford DoOpTiling 中 ubRemain 的无符号下溢:smallUbSize / blockSize 为 uint64_t,固定开销大于总 UB 时相减会在表达式内下溢成巨大值(仅改左值类型无效,算术转换发生在赋值之前),进而算出无意义的切分参数却报 tiling 成功。改为统一按有符号数计算,并把校验放在向下对齐之后判 ubSizeAlign > 0。此前未暴露,是因为 NHWC 被 format 拒在前面。 ### 附带:TQue 的 depth 模板参数统一为 1 来自 Issue #4389(PR #8019 的检视意见,@fanqirui):TQue 的第二个模板参数是队列深度(depth),不是 buffer 个数,一般算子用 1 就够了。两个算子的 arch35 kernel 共 **60 处**把 DOUBLE_BUFFER / SINGLE_BUFFER / BUFFER_NUM 用在了该位置,一并改为 1: | 算子 | 文件 | 处数 | 原值 | |---|---|---|---| | batch_norm | batch_norm_welford.h | 10 | DOUBLE_BUFFER | | | batch_norm_full_reduce.h | 10 | DOUBLE_BUFFER | | | batch_norm_ra_full_reduce.h | 10 | DOUBLE_BUFFER | | | batch_norm_ra_welford.h | 2 | DOUBLE_BUFFER | | batch_norm_v3 | batch_norm_v3_welford.h | 10 | BUFFER_NUM | | | batch_norm_v3_ra_full_reduce.h | 10 | DOUBLE_BUFFER | | | batch_norm_v3.h | 6 | DOUBLE_BUFFER ×2 + SINGLE_BUFFER ×4 | | | batch_norm_v3_ra_welford.h | 2 | DOUBLE_BUFFER | **只改 TQue 的模板参数位**——InitBuffer 的缓冲个数、上述三个常量的定义、以及 host 侧 UB 估算均不改动,因此 UB 占用不变,不存在 host / kernel 深度系数不同步的问题(Issue 的 B 项所担心的同步下调,是针对"降 InitBuffer 缓冲个数"的场景)。两算子的 infer 系模板本来就是 depth=1 配 InitBuffer 缓冲个数 2,本次是与其对齐;改动后这三个常量只出现在 InitBuffer 位置上,语义不再有歧义。 未改动:regbase_common.h 的模板形参 QUEUE_DEPTH 由实参类型推导,调用方队列均已为 depth=1;infer 系的 BUFFER_DEPTH 与 block_split_r 系的裸字面量 1 本就正确。 对 Issue #4389 的两点补充:BUFFER_NUM 在 infer 系 5 个文件里是 InitBuffer 的缓冲个数、命名本来就对(与 BUFFER_DEPTH = 1 并存、各司其职),真用在 depth 位置的只有 batch_norm_v3_welford.h;另外 batch_norm 存在同样问题且范围更大(32 处 vs bnv3 28 处),Issue 中"只覆盖 batch_norm_v3"的范围偏窄。 ## 关联的Issue - #4389(PR #8019 检视意见的跟踪项,本 PR 落地了其中 TQue depth 收窄为 1 的部分) - #4443(本 PR 修复的 ND 格式 tiling 缺陷,即本 PR 主体改动) ## 测试 ### op_host tiling UT(--soc=ascend950) 全量 **70/70 通过**(batch_norm 15 + batch_norm_v3 51 + infershape 4),新增 13 条用例: | 用例 | 断言 | |---|---| | batch_norm_tiling_nd_r0_gt_one_full_reduce_arch35 | ND [8,512,4] / [8,512,8] / [8,512,5] / [8,512,4,1] → 200000 | | batch_norm_tiling_nd_nchw_equivalence_arch35 | 同 dims 的 ND 与 NCHW,tilingkey 相同**且 tiling data 逐字节相同** | | batch_norm_tiling_large_reduce_still_welford_arch35 | [2048,32,16] → 300000,守卫未误伤 Welford 本职 | | batch_norm_tiling_nd_rar_block_split_r_arch35 | ND [4096,16,8] 与 NCHW [4096,16,4,2] → 250000,tiling data 相同 | | batch_norm_v3_nd_format_ascend950_large_reduce_welford | ND [2048,32,16] → 300000(修前 GRAPH_FAILED) | | batch_norm_v3_nd_format_ascend950_small_reduce_full_reduce | ND [8,512,4] → 200000 | | batch_norm_v3_nchw_format_ascend950_large_reduce_welford | NCHW [2048,32,4,4] → 300000 | | batch_norm_v3_nd/nchw_format_ascend950_rar_block_split_r | ND [4096,16,8] / NCHW [4096,16,4,2] → 250000 | | batch_norm_v3_nhwc/ndhwc_format_ascend950_ra_pattern | NHWC [2,8,8,64] / NDHWC [2,2,4,8,64] → 400000,钉住 r0 归一后的路由 | | batch_norm_tiling_welford_ub_not_enough_arch35 | UB=1024 时 ND [256,512,8] 落到 Welford,断言 tiling 明确失败而非带着下溢参数报成功 | | batch_norm_tiling_welford_ub_align_to_zero_arch35 / batch_norm_v3_welford_ub_align_to_zero | UB=2624 时 ubRemain = 64 > 0 但 ubSizeAlign 被抹成 0,断言 tiling 明确失败 | 关键用例均做过区分力自检:撤销对应改动后精确失败(路由到错误模板,或 tiling_func 返回 GRAPH_FAILED)。 ### Ascend950 上板(TTK,内置包与自建包 A/B) **batch_norm(30 条)** | shape | 修前 | 修后 | |---|---|---| | [8,512,4] ND fp32 | 五个输出逐元素通过率 **0%** | tilingkey 200000,全部 **100%** | | r1*r0 = 16 / 32 | 归零 | 正确 | | r1*r0 = 40 / 48 / 64 | **VEC_ERROR** | 正确 | | r1*r0 >= 65、r0 == 1 | 正确 | 路由与精度均无变化 | | ND [4096,16,8] / [8192,8,16] | 300000 | 250000,与同 dims 的 NCHW 一致 | **batch_norm_v3** | shape | 修前 | 修后 | |---|---|---| | ND [2048,32,16] / [4096,32,8] / [1024,64,16] | **OPTILING_FAILURE** | 300000,通过率 99.99% | | ND [4096,16,8] / [8192,8,16] | **OPTILING_FAILURE** | 250000,与 NCHW [4096,16,4,2] 一致 | | ND [8,512,2/4/8/13]、[8,512](r0==1) | 正确 | 路由与精度均无变化 | **TQue depth 改动的性能 A/B**(两侧均 rm -rf build build_out 全新编包、同一 session、各三轮取中位数、按 [min, max] 区间是否分离判定) | | 用例数 | delta 中位数 | 最差 | 最好 | 区间分离 | |---|---|---|---|---|---| | batch_norm | 30 | **−0.2%** | +2.1% | −2.8% | 1 例 | | batch_norm_v3 | 11 | **+0.1%** | +3.0% | −6.5% | 1 例 | 两例区间分离(bn_fp32_nd_32_512_4 +2.0%、bnv3_nd_8192_8_16 +1.7%)均在 wall-clock 噪声带内,分离源于 base 侧该轮波动过小(前者区间宽度仅 0.03us),反方向亦有同量级样本(bnv3_nd_8_512 −6.5%),无一致方向性,判定为无性能回退。精度与 tiling key 在两算子全部用例上均无变化。 残余未达标项为逐元素通过率 99.98% 量级、最大绝对误差 2.4e-07(fp32 ULP),且集中在 |golden| ~1e-5 的近零点上;未改动的 NCHW 对照用例(nchw_8_512_4、nchw_8_512_2_2、nchw_8_512_4_1)表现相同,属判据在近零输出上的容差问题,非本次改动引入。 ## 文档更新 无。本次仅改 host 侧 tiling 与 UT,未涉及对外接口、约束与文档。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-nn!8087 | 7 小时前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 30 天前 | ||
| 30 天前 | ||
| 30 天前 | ||
| 30 天前 | ||
| 7 小时前 | ||
| 30 天前 | ||
| 30 天前 | ||
| 30 天前 | ||
| 30 天前 | ||
| 7 小时前 | ||
| 7 小时前 |