| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
feat(apply_ftrl): 910b的apply_ftrl实现 Co-authored-by: zhaohujie<zhaohujie@huawei.com> # message auto-generated for no-merge-commit merge: !6163 merge feat/apply_ftrl into master feat(apply_ftrl): 910b的apply_ftrl实现 Created-by: zhaohujie Commit-by: zhaohujie Merged-by: cann-robot Description: ## 描述 新增 experimental/optim/apply_ftrl/ —— 为 ApplyFtrl(FTRL-proximal 优化器)补 **ascend910b(Atlas A2/A3,DAV_2201)原生 AscendC kernel** 实现包含 host(def/infershape/tiling)+ kernel(apply_ftrl.cpp 入口 + apply_ftrl.h 实现类 + _tiling_data.h + _tiling_key.h)+ 派生 aclnn op_api(两段式,**非 CANN 已部署**,ACLNNTYPE aclnn_exclude + 手写)+ examples(GE 图模式 + Kernel 直调)+ tests(ut op_host/op_kernel + st ATK 用例集)。 核心方案:单一 Elementwise tiling 策略;**12 组 TilingKey** = dtype(3: bf16/fp16/fp32) × PAD_TAIL(2) × HAS_L1(2),host ASCENDC_TPL_SEL_PARAM 与 kernel if constexpr 严格对齐;**内部统一 fp32 计算**(bf16/fp16 入口 Cast 升精度、末尾 CAST_RINT 回原 dtype);幂运算 Exp(Muls(Ln(a),-lr_power)) 分解;**两级尾块对齐**(32B DMA pad + fp32 域 256B Duplicate 补齐,解 507035 崩溃根因);**bf16 标量借道 Cast**;**自适应分核 MIN_ELEM_PER_CORE=512**(仅分核决策、不改数值);**三输出原地写回 ABI**(var→var_out,accum/linear 经 input ref)。OpType ApplyFtrl 全栈字节一致;kernel 入口 apply_ftrl = opFile.value。 ## 关联的Issue https://gitcode.com/cann/ops-nn/issues/3378 ## 测试 - **UT(CPU 孪生,无需 NPU,64/64 全过)**: - op_host **45**:Tiling 31(多核均分 + UB 256B/64 对齐 + 8KB Select tmp 扣除 + 自适应 block-dim 下限专项 + 12 组合精确 TilingKey 锚点 65536/65537/65563… + dtype/shape 一致性错误路径 + rank-8/空 Tensor 边界);InferShape 14(var_out.shape=var.shape + dtype)。 - op_kernel **19**:ICPU_RUN_KF 直跑主线 op_kernel/apply_ftrl.h(tikicpulib),覆盖 12 TilingKey 组合 + 极端值(NaN grad 传播 / accum_new=0&lr_power>0 / lr=0,按 IEEE 类别比对)+ 确定性(重复执行字节一致)+ 三输出原地写回 ABI + 多 tile 主循环;对 fp64 CPU golden 逐元素比对。 - **ST(真机 ascend910b NPU,100% 通过)**:kernel 直调主线 kernel + numpy/torch **fp64 golden** 全量黑盒三输出对拍 **523/523**;白盒 **34/34**;CP3 validator **PASSED**;-cp 签名校验通过。 - **精度判据**:社区**单标杆** single_bm: high_precision(MERE < Threshold 且 MARE < 10×Threshold,按 NPU 输出 dtype 取阈值;近零元素走组合 rtol+atol 绝对容差):fp32 = 2⁻¹³ ≈ 1.22e-4、fp16 = 2⁻¹⁰ ≈ 9.77e-4、bf16 = 2⁻⁷ ≈ 7.81e-3。fp32 另按双标杆口径(ErrorCount_npu ≤ 2×ErrorCount_cpu32)核查幂差灾难性抵消角点,主集受值域前置避开,实测 ErrorCount_npu=0 平凡成立。 - **确定性**:逐元素独立、无跨核归约 → 天然确定性(accumulation_order=none),重复执行逐元素字节一致。 - **开发期证据校验**:CP2 / CP3 validator 均 **PASSED**;代码检视 **PASS**(0 HIGH / 2 MED 已修订(均为 DESIGN↔代码措辞/值一致性,非代码缺陷)/ 6 LOW)。 ### 对比测试(新算子 vs 默认基线) > **新算子**:ApplyFtrl(experimental/optim/apply_ftrl,ascend910b 原生 AscendC kernel,registry-invoke),经派生两段式 aclnn 入口下发,已部署到 custom_nn vendor。 > **默认基线**:CANN 内置 **ApplyFtrlD(legacy TBE-DSL,AI Core 二进制,fp16/fp32)**——精确名 ApplyFtrl 在 ascend910b 无可直接下发的 AI Core 二进制,仅经完整 GE 图下发并在 GE 内降级到 ApplyFtrlD 执行,故 ApplyFtrlD 即「内置 ApplyFtrl 经 GE 下发」实际执行的 kernel。**bf16 无基线**(ApplyFtrlD 未部署 bf16 二进制)。 > **环境**:Ascend910B3(DAV_2201)+ CANN 9.0.0 + ATK + torch 2.9.0/torch_npu;**真机实跑**(非 Mock)。 > **计时口径**:msprof op --warm-up=10 --launch-count=10 取 Task Duration(us)(device 端 AI Core kernel 执行耗时,隔离 host 下发差异),两侧统一同方法;同计算单元 AICore-vs-AICore。 > 绑定证据:DUT 与基线 op-name hash 完全不相交(custom ApplyFtrl 310d3181/747b879e/09a9a136 vs built-in ApplyFtrlD 5505e325/4a8d5282),ATK 36 例 0 次 JIT/kernel-not-found,确系自定义 kernel 上板、无静默回退。 **精度对比(新算子 vs CPU fp64 golden,逐 dtype 单标杆等价,36/36 = 100%)** | dtype | 通过/总 | 判据(single_bm Threshold) | 实测最差 max_rel_diff | 余量 | 结果 | |---|---|---|---|---|---| | bfloat16 | 12/12 | 7.812e-3(2⁻⁷) | 3.804e-3 | ~2× | ✅ | | float16 | 12/12 | 9.766e-4(2⁻¹⁰) | 4.844e-4 | ~2× | ✅ | | float32 | 12/12 | 1.221e-4(2⁻¹³) | 3.414e-7 | ~360× | ✅ | 两实现语义等价已建立(rank 1–4、size 1–12、标量 0-D + [1] 均覆盖),性能对比成立。 **性能对比(真机 device 耗时;加速比 = 基线/新,>1 ⇒ 新更快)** | dtype | N(元素) | 类别 | 新算子(us) | 基线 ApplyFtrlD(us) | 加速比 | 比值(new/base) | 备注 | |---|---|---|---|---|---|---|---| | fp32 | 1024 | 小/对齐 | 3.51 | 4.88 | **1.39×** | 0.719 | 优化后优于基线(见诚实保留行) | | fp16 | 1024 | 小/对齐 | 3.59 | 4.68 | **1.30×** | 0.768 | 优化后优于基线 | | bf16 | 1024 | 小/对齐 | 3.86 | 无基线 | — | — | bf16 无基线(绝对 us/op) | | fp32 | 131072 | 中/对齐 | 7.61 | 8.30 | **1.09×** | 0.917 | 略优,头开销占比仍较高 | | fp16 | 131072 | 中/对齐 | 7.80 | 8.46 | **1.08×** | 0.922 | 略优 | | bf16 | 131072 | 中/对齐 | 8.34 | 无基线 | — | — | bf16 无基线 | | fp32 | 1048576 | 大/对齐 | 21.25 | 36.40 | **1.71×** | 0.584 | 稳态代表场景,明显领先 | | fp16 | 1048576 | 大/对齐 | 22.08 | 37.36 | **1.69×** | 0.591 | 明显领先 | | bf16 | 1048576 | 大/对齐 | 23.30 | 无基线 | — | — | ≈ 同 shape fp16 | | fp32 | 1048573 | 大/非对齐尾 | 21.46 | 35.96 | **1.68×** | 0.597 | 尾块场景仍领先 | | fp16 | 1000001 | 大/非对齐尾 | 22.06 | 35.54 | **1.61×** | 0.621 | 领先 | | bf16 | 1000001 | 大/非对齐尾 | 22.76 | 无基线 | — | — | bf16 无基线 | 覆盖 12 组 (shape,dtype);9 个有基线用例**全部 ≥ 基线**(加速比 1.08–1.71×),**大 shape(≥1M) 几何平均比值 0.597(~1.68×)**,达成软目标 ≤0.6×。 ## 文档更新 - 新增 experimental/optim/apply_ftrl/README.md:SoC 扩展说明、产品支持矩阵、FTRL 计算公式、参数/dtype/约束、调用矩阵(GE 图模式 / Kernel 直调,标注无 aclnn 部署、无 torch 等价)。 - 新增 experimental/optim/apply_ftrl/docs/aclnnApplyFtrl.md:GE 图模式接口(真值源)+ 派生 aclnn 两段式接口(aclnnApplyFtrlGetWorkspaceSize / aclnnApplyFtrl,本任务新增派生、标准 CANN 未部署)+ 两段式调用示例。 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [x] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-nn!6163 | 1 个月前 | |
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 | 27 天前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 1 个月前 | ||
| 27 天前 |