| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
feat(optim): add apply_adam_v2 operator Co-authored-by: handsomeRobot_SK<suke13@huawei.com> # message auto-generated for no-merge-commit merge: !8094 merge applyadamv2 into master feat(optim): add apply_adam_v2 operator Created-by: handsomeRobot_SK Commit-by: handsomeRobot_SK Merged-by: cann-robot Description: ## PR: feat(optim): add apply_adam_v2 operator ### 概述 新增 ApplyAdamV2 算子,实现 Adam 优化器的参数更新,支持标准 Adam 和 mBART Adam 两种模式,可选梯度裁剪,用于深度学习训练中反向传播后的参数更新阶段。算子基于 Ascend C 开发,支持 Ascend950 (arch35/DAV_3510) 平台,仅支持 GEIR 图模式调用。 ### 算子功能 实现 Adam 优化器的单步参数更新: **标准 Adam 模式**(adam_mode = "adam"): $$g_t = \text{grad} \cdot \text{clip\_coeff}$$ $$m_t = \beta_1 \cdot m_{t-1} + (1 - \beta_1) \cdot g_t$$ $$v_t = \beta_2 \cdot v_{t-1} + (1 - \beta_2) \cdot g_t^2$$ $$u = \frac{m_t}{\sqrt{v_t} + \epsilon}$$ $$\text{var}_t = \text{var}_{t-1} - \eta \cdot (u + \text{weight\_decay} \cdot \text{var}_{t-1})$$ **mBART Adam 模式**(adam_mode = "mbart_adam"): $$m_t = \beta_1 \cdot m_{t-1} + (1 - \beta_1) \cdot \text{grad}$$ $$v_t = \beta_2 \cdot v_{t-1} + (1 - \beta_2) \cdot \text{grad}^2$$ $$u = \frac{m_t}{\sqrt{v_t} + \epsilon}$$ $$\text{var}_t = \text{var}_{t-1} - \text{step\_size} \cdot u - \eta \cdot \text{weight\_decay} \cdot \text{var}_{t-1}$$ 其中 $var$ 为模型参数,$m$ 为一阶矩估计,$v$ 为二阶矩估计,$\beta_1$、$\beta_2$ 为衰减率,$\eta$ 为学习率,$\epsilon$ 为数值稳定性常数。 **算法实现**: - **4 条计算路径**:Adam FP32、Adam FP16、mBART Adam FP32、mBART Adam FP16 - **TilingKey 分派**:DTYPE × MODE 两维度 TilingKey,编译期分派到对应路径 - **VF 寄存器级融合**:5 个 VF 函数(AdamMomentsVF、MbartMomentsVF、AdamDivVF、AdamUpdateVF、MbartUpdateVF)实现寄存器级指令融合 - **FP16 精度提升**:FP16 输入先 Cast 到 FP32 计算,结果 Cast 回 FP16,保证长期训练中矩估计的精度 - **梯度裁剪**:Adam 模式下支持基于 global_grad_norm 的梯度裁剪 ### 支持规格 | 项目 | 支持情况 | |------|---------| | **数据类型** | float16, float32 | | **数据格式** | ND | | **Rank 范围** | 0 ~ 8 | | **平台** | Ascend950 (arch35) | | **调用模式** | GEIR 图模式 | ### 交付件清单 optim/apply_adam_v2/ ├── CMakeLists.txt # 构建配置 ├── README.md # 算子文档 ├── examples/ │ └── test_geir_apply_adam_v2.cpp # GEIR 示例 ├── op_graph/ │ ├── CMakeLists.txt │ ├── apply_adam_v2_proto.h # GEIR 原型定义 │ └── apply_adam_v2_graph_infer.cpp # 图模式 InferDataType ├── op_host/ │ ├── apply_adam_v2_def.cpp # 算子定义 │ ├── apply_adam_v2_infershape.cpp # 形状推导 │ └── arch35/ │ ├── apply_adam_v2_tiling_arch35.h # Tiling 类声明 │ └── apply_adam_v2_tiling_arch35.cpp # Tiling 计算 ├── op_kernel/ │ ├── apply_adam_v2.cpp # Kernel 入口 │ └── arch35/ │ ├── apply_adam_v2_kernel.h # Kernel 实现 │ ├── apply_adam_v2_struct.h # 模板参数声明 │ └── apply_adam_v2_tiling_data.h # Tiling 数据结构 └── tests/ └── ut/ └── op_host/ ├── test_apply_adam_v2_infershape.cpp # InferShape UT (2 用例) └── arch35/ └── test_apply_adam_v2_tiling_arch35.cpp # Tiling UT (4 用例) ### 测试验证 #### 单元测试 (UT) - **用例数**:6 - **通过率**:100% (6/6) - **覆盖范围**:InferShape (2) + Tiling (4) #### TTK 框架验证 - **精度标准**: - FP32: rtol=1e-4, atol=1e-4 - FP16: rtol=1e-3, atol=1e-3 - **覆盖范围**: - 数据类型:FP32 / FP16 - 计算模式:Adam / mBART Adam - 特殊场景:标量、大 Tensor、极端值 #### GEIR 端对端验证 - **状态**:✅ 通过 - **验证内容**:图编译 + 图执行 + 输出正确性 ### 代码质量 #### 代码规范化 - ✅ 文件头格式统一(Copyright + Generated By CANNBot) - ✅ Kernel 结构重构为 VF 融合 + Process 分发模式 - ✅ Tiling 数据结构字段 camelCase 命名 - ✅ 移除 op_host 中冗余的 InferDataType(已由 op_graph 处理) - ✅ 魔鬼数字常量化(kMaxInputSlots, kMaxOutputSlots, kPhysNodes, kMaxRank, kMaxNDDMA) - ✅ clang-format 格式化(基于项目 .clang-format 配置) ### 编译验证 bash # 编译 cd ops-nn bash build.sh --soc=ascend950 --pkg --ops=apply_adam_v2 -j16 # 输出 ✅ 编译成功 ✅ 生成算子包:cann-ops-nn-custom_linux-x86_64.run ✅ 安装成功:部署到 /usr/local/Ascend/cann-9.0.0/opp/vendors/custom_nn/ ### 关键实现细节 #### 1. Kernel 实现 (apply_adam_v2_kernel.h) - **结构**:Init → Process<KEY> → (ProcessAdam / ProcessMbartAdam / ProcessAdamFp16 / ProcessMbartAdamFp16) 分发设计 - **VF 寄存器级融合**: - AdamMomentsVF:梯度裁剪 + 一阶矩 + 二阶矩(S1+S2+S3,6 条指令) - MbartMomentsVF:一阶矩 + 二阶矩,无梯度裁剪(S2+S3,5 条指令) - AdamDivVF:更新量计算 u = m_t / (sqrt(v_t) + epsilon)(S4,3 条指令) - AdamUpdateVF:权重衰减 + 参数更新(adam 模式)(S5+S6,2~4 条指令) - MbartUpdateVF:步长缩放 + 权重衰减 + 参数更新(mbart 模式)(S5+S6+S7,2~4 条指令) - **精度转换**:FP16 路径先 Cast 到 FP32 计算,再 Cast 回 FP16 写回 - **同步管理**:严格的 MTE2↔V↔MTE3 事件同步 #### 2. Tiling 实现 (apply_adam_v2_tiling_arch35.cpp) - **TilingKey 设计**:DTYPE × MODE 两维度,共 4 种组合 - **PadAndSqueeze**:将输入 shape 填充到统一 rank,压缩全 1 维度 - **FindSplitAxis**:从最内维向外寻找可放入 UB 的 split 轴 - **MultiCoreSplit**:基于 tile 总数和可用核数动态分配 - **PrecomputeStrides**:预计算广播 stride(广播轴 stride=0) #### 3. Buffer 规划 - **5 个 TBuf**:B0(grad→u→var_out)、B1(m)、B2(v→v_t→v_out)、B3(var)、B4(m_t→m_out) - **P=5 物理节点**:每个 TBuf 对应一个物理节点,per_buf_bytes = (UB / 5) & ~31 ### 依赖与限制 - **依赖**:CANN 9.0.0 - **限制**: - 仅支持 GEIR 图模式(无 ACLNN 接口) - 仅支持 Ascend950 (arch35) - 不支持空 Tensor(0 元素) - var、m、v、grad 的 shape 和 dtype 必须完全一致 - lr、beta1、beta2、epsilon、max_grad_norm、global_grad_norm、weight_decay、step_size 为标量(shape [1]) ### 测试命令 bash # 单元测试 cd optim/apply_adam_v2/tests/ut/build/op_host ./test_apply_adam_v2_infershape ./test_apply_adam_v2_tiling_arch35 # GEIR 示例 cd optim/apply_adam_v2/examples bash run.sh ### 相关文件 - 算子文档:optim/apply_adam_v2/README.md - Issue 模板:guide/issue模板.md ### Checklist - [x] 代码符合 ops-nn 内置算子标准 - [x] 文件头格式统一 - [x] Kernel 结构规范化(VF 融合 + Process 分发) - [x] 单元测试通过 (6/6) - [x] GEIR 端对端验证通过 - [x] 编译安装验证通过 - [x] 文档完整(README + 示例) - [x] clang-format 格式化 See merge request: cann/ops-nn!8094 | 2 个月前 | |
feat(optim): add apply_adam_v2 operator Co-authored-by: handsomeRobot_SK<suke13@huawei.com> # message auto-generated for no-merge-commit merge: !8094 merge applyadamv2 into master feat(optim): add apply_adam_v2 operator Created-by: handsomeRobot_SK Commit-by: handsomeRobot_SK Merged-by: cann-robot Description: ## PR: feat(optim): add apply_adam_v2 operator ### 概述 新增 ApplyAdamV2 算子,实现 Adam 优化器的参数更新,支持标准 Adam 和 mBART Adam 两种模式,可选梯度裁剪,用于深度学习训练中反向传播后的参数更新阶段。算子基于 Ascend C 开发,支持 Ascend950 (arch35/DAV_3510) 平台,仅支持 GEIR 图模式调用。 ### 算子功能 实现 Adam 优化器的单步参数更新: **标准 Adam 模式**(adam_mode = "adam"): $$g_t = \text{grad} \cdot \text{clip\_coeff}$$ $$m_t = \beta_1 \cdot m_{t-1} + (1 - \beta_1) \cdot g_t$$ $$v_t = \beta_2 \cdot v_{t-1} + (1 - \beta_2) \cdot g_t^2$$ $$u = \frac{m_t}{\sqrt{v_t} + \epsilon}$$ $$\text{var}_t = \text{var}_{t-1} - \eta \cdot (u + \text{weight\_decay} \cdot \text{var}_{t-1})$$ **mBART Adam 模式**(adam_mode = "mbart_adam"): $$m_t = \beta_1 \cdot m_{t-1} + (1 - \beta_1) \cdot \text{grad}$$ $$v_t = \beta_2 \cdot v_{t-1} + (1 - \beta_2) \cdot \text{grad}^2$$ $$u = \frac{m_t}{\sqrt{v_t} + \epsilon}$$ $$\text{var}_t = \text{var}_{t-1} - \text{step\_size} \cdot u - \eta \cdot \text{weight\_decay} \cdot \text{var}_{t-1}$$ 其中 $var$ 为模型参数,$m$ 为一阶矩估计,$v$ 为二阶矩估计,$\beta_1$、$\beta_2$ 为衰减率,$\eta$ 为学习率,$\epsilon$ 为数值稳定性常数。 **算法实现**: - **4 条计算路径**:Adam FP32、Adam FP16、mBART Adam FP32、mBART Adam FP16 - **TilingKey 分派**:DTYPE × MODE 两维度 TilingKey,编译期分派到对应路径 - **VF 寄存器级融合**:5 个 VF 函数(AdamMomentsVF、MbartMomentsVF、AdamDivVF、AdamUpdateVF、MbartUpdateVF)实现寄存器级指令融合 - **FP16 精度提升**:FP16 输入先 Cast 到 FP32 计算,结果 Cast 回 FP16,保证长期训练中矩估计的精度 - **梯度裁剪**:Adam 模式下支持基于 global_grad_norm 的梯度裁剪 ### 支持规格 | 项目 | 支持情况 | |------|---------| | **数据类型** | float16, float32 | | **数据格式** | ND | | **Rank 范围** | 0 ~ 8 | | **平台** | Ascend950 (arch35) | | **调用模式** | GEIR 图模式 | ### 交付件清单 optim/apply_adam_v2/ ├── CMakeLists.txt # 构建配置 ├── README.md # 算子文档 ├── examples/ │ └── test_geir_apply_adam_v2.cpp # GEIR 示例 ├── op_graph/ │ ├── CMakeLists.txt │ ├── apply_adam_v2_proto.h # GEIR 原型定义 │ └── apply_adam_v2_graph_infer.cpp # 图模式 InferDataType ├── op_host/ │ ├── apply_adam_v2_def.cpp # 算子定义 │ ├── apply_adam_v2_infershape.cpp # 形状推导 │ └── arch35/ │ ├── apply_adam_v2_tiling_arch35.h # Tiling 类声明 │ └── apply_adam_v2_tiling_arch35.cpp # Tiling 计算 ├── op_kernel/ │ ├── apply_adam_v2.cpp # Kernel 入口 │ └── arch35/ │ ├── apply_adam_v2_kernel.h # Kernel 实现 │ ├── apply_adam_v2_struct.h # 模板参数声明 │ └── apply_adam_v2_tiling_data.h # Tiling 数据结构 └── tests/ └── ut/ └── op_host/ ├── test_apply_adam_v2_infershape.cpp # InferShape UT (2 用例) └── arch35/ └── test_apply_adam_v2_tiling_arch35.cpp # Tiling UT (4 用例) ### 测试验证 #### 单元测试 (UT) - **用例数**:6 - **通过率**:100% (6/6) - **覆盖范围**:InferShape (2) + Tiling (4) #### TTK 框架验证 - **精度标准**: - FP32: rtol=1e-4, atol=1e-4 - FP16: rtol=1e-3, atol=1e-3 - **覆盖范围**: - 数据类型:FP32 / FP16 - 计算模式:Adam / mBART Adam - 特殊场景:标量、大 Tensor、极端值 #### GEIR 端对端验证 - **状态**:✅ 通过 - **验证内容**:图编译 + 图执行 + 输出正确性 ### 代码质量 #### 代码规范化 - ✅ 文件头格式统一(Copyright + Generated By CANNBot) - ✅ Kernel 结构重构为 VF 融合 + Process 分发模式 - ✅ Tiling 数据结构字段 camelCase 命名 - ✅ 移除 op_host 中冗余的 InferDataType(已由 op_graph 处理) - ✅ 魔鬼数字常量化(kMaxInputSlots, kMaxOutputSlots, kPhysNodes, kMaxRank, kMaxNDDMA) - ✅ clang-format 格式化(基于项目 .clang-format 配置) ### 编译验证 bash # 编译 cd ops-nn bash build.sh --soc=ascend950 --pkg --ops=apply_adam_v2 -j16 # 输出 ✅ 编译成功 ✅ 生成算子包:cann-ops-nn-custom_linux-x86_64.run ✅ 安装成功:部署到 /usr/local/Ascend/cann-9.0.0/opp/vendors/custom_nn/ ### 关键实现细节 #### 1. Kernel 实现 (apply_adam_v2_kernel.h) - **结构**:Init → Process<KEY> → (ProcessAdam / ProcessMbartAdam / ProcessAdamFp16 / ProcessMbartAdamFp16) 分发设计 - **VF 寄存器级融合**: - AdamMomentsVF:梯度裁剪 + 一阶矩 + 二阶矩(S1+S2+S3,6 条指令) - MbartMomentsVF:一阶矩 + 二阶矩,无梯度裁剪(S2+S3,5 条指令) - AdamDivVF:更新量计算 u = m_t / (sqrt(v_t) + epsilon)(S4,3 条指令) - AdamUpdateVF:权重衰减 + 参数更新(adam 模式)(S5+S6,2~4 条指令) - MbartUpdateVF:步长缩放 + 权重衰减 + 参数更新(mbart 模式)(S5+S6+S7,2~4 条指令) - **精度转换**:FP16 路径先 Cast 到 FP32 计算,再 Cast 回 FP16 写回 - **同步管理**:严格的 MTE2↔V↔MTE3 事件同步 #### 2. Tiling 实现 (apply_adam_v2_tiling_arch35.cpp) - **TilingKey 设计**:DTYPE × MODE 两维度,共 4 种组合 - **PadAndSqueeze**:将输入 shape 填充到统一 rank,压缩全 1 维度 - **FindSplitAxis**:从最内维向外寻找可放入 UB 的 split 轴 - **MultiCoreSplit**:基于 tile 总数和可用核数动态分配 - **PrecomputeStrides**:预计算广播 stride(广播轴 stride=0) #### 3. Buffer 规划 - **5 个 TBuf**:B0(grad→u→var_out)、B1(m)、B2(v→v_t→v_out)、B3(var)、B4(m_t→m_out) - **P=5 物理节点**:每个 TBuf 对应一个物理节点,per_buf_bytes = (UB / 5) & ~31 ### 依赖与限制 - **依赖**:CANN 9.0.0 - **限制**: - 仅支持 GEIR 图模式(无 ACLNN 接口) - 仅支持 Ascend950 (arch35) - 不支持空 Tensor(0 元素) - var、m、v、grad 的 shape 和 dtype 必须完全一致 - lr、beta1、beta2、epsilon、max_grad_norm、global_grad_norm、weight_decay、step_size 为标量(shape [1]) ### 测试命令 bash # 单元测试 cd optim/apply_adam_v2/tests/ut/build/op_host ./test_apply_adam_v2_infershape ./test_apply_adam_v2_tiling_arch35 # GEIR 示例 cd optim/apply_adam_v2/examples bash run.sh ### 相关文件 - 算子文档:optim/apply_adam_v2/README.md - Issue 模板:guide/issue模板.md ### Checklist - [x] 代码符合 ops-nn 内置算子标准 - [x] 文件头格式统一 - [x] Kernel 结构规范化(VF 融合 + Process 分发) - [x] 单元测试通过 (6/6) - [x] GEIR 端对端验证通过 - [x] 编译安装验证通过 - [x] 文档完整(README + 示例) - [x] clang-format 格式化 See merge request: cann/ops-nn!8094 | 2 个月前 | |
legacy下线:整改NN算子图模式注册与日志规范 Co-authored-by: zhouxuan78<zhouxuan78@huawei.com> # message auto-generated for no-merge-commit merge: !8388 merge master into master legacy下线:整改NN算子图模式注册与日志规范 Created-by: zhouxuan78 Commit-by: zhouxuan78 Merged-by: cann-robot Description: ## 描述 本 PR 用于 ops-nn 仓 Legacy 下线整改,补齐部分算子的直调/图模式注册、InferShape / InferDataType 拆分、日志规范整改及必要的编译/预提交问题修复。 1. 补齐多个算子的 op_graph 侧 InferDataType / graph infer 注册文件,并同步补充对应 CMakeLists.txt: - 如 FastGeluV2、HardShrinkGrad、HardSigmoidGrad、HardSwish、HardSwishGrad、Selu、SeluGrad、Shrink、SoftplusGrad、SoftplusV2、SoftplusV2Grad、Softsign、SoftsignGrad、SmoothL1Loss、SoftMarginLoss、LpNormUpdateV2、ApplyFtrlV2、ApplyMomentum、ApplyRMSProp 等。 2. 调整部分算子的 op_host infer 文件: - 将 InferDataType 逻辑从 infershape 文件中拆分/迁移到 op_graph 侧; - 保留 InferShape 逻辑,避免 shape/type 混在同一处注册; - 收敛 IndexCheck infershape 日志,仅保留入口日志。 3. 补充 SoftMarginLoss 图模式原型: - 新增 loss/soft_margin_loss/op_graph/soft_margin_loss_proto.h; - 新增 OPS_PROTO_DEF_SOFTMARGINLOSS 去重宏,避免重复注册; - 补充 SoftMarginLoss 的 op_graph/CMakeLists.txt 和 graph infer 注册。 4. 日志整改: - 为 Arch35 tiling 入口补充统一入口日志; - 对本 PR 修改范围内新增/调整的外部输入错误日志,按规范使用 OP_LOGE_FOR_INVALID_* 系列上报接口; - 收敛部分过多的 tiling / infershape 日志打印,避免循环或冗余打印。 5. 回退/收敛不属于本次整改范围的 Softshrink 重命名相关改动: - Softshrink -> SoftShrink 的命名调整不放在本 PR 中,后续单独 PR 处理。 6. 修复 pre-commit 格式问题: - 按仓库 .clang-format 修复格式; - 不修改 .pre-commit-config.yaml。 影响范围 主要影响 activation、index、loss、norm、optim、quant、vfusion 等目录下 Legacy 下线相关算子的 op_graph 注册、InferDataType 拆分、tiling 入口日志和错误日志规范。 ## 变更内容 ## 关联的Issue ## 测试 ## 文档更新 ## 类型标签 - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [x] 其他:Legacy包下线整改 See merge request: cann/ops-nn!8388 | 25 天前 | |
fix(apply_adam_v2, fused_mul_apply_momentum): 修复FP16 Cast别名冲突、跨tile事件同步、infershape对齐canndev、inplace output shape直取input Co-authored-by: handsomeRobot_SK<suke13@huawei.com> # message auto-generated for no-merge-commit merge: !9005 merge fix-adam-momentum-geir-issues into master fix(apply_adam_v2, fused_mul_apply_momentum): 修复FP16 Cast别名冲突、跨tile事件同步、infershape对齐canndev、inplace output shape直取input Created-by: handsomeRobot_SK Commit-by: handsomeRobot_SK Merged-by: cann-robot Description: PR 描述 标题: fix(apply_adam_v2, fused_mul_apply_momentum): 修复 FP16 Cast 别名冲突、跨 tile 事件同步、infershape 对齐 canndev 描述: 关联 Issue Closes #<issue_number> 修改内容 apply_adam_v2 1. 修复 FP16 in-place Cast 别名冲突 (VEC_ERROR) - 文件: op_kernel/arch35/apply_adam_v2_kernel.h - 改动: ProcessAdamFp16 和 ProcessMbartAdamFp16 中,用 B4 作为 FP16 中转缓冲,改为逐输入 CopyIn→B4(FP16)→Cast→B{target}(FP32) 模式,确保 Cast 的 src (B4) 和 dst (B{target}) 在不同 TBuf 上,消除别名冲突 - 新增: Process() 中 fetch evVtoMTE2 事件,前 3 个输入完成后通过 SetFlag/WaitFlag(V_MTE2) 释放 B4 供下一个输入复用 - 不变: Cast back (FP32→FP16) 保持 in-place(narrowing 安全) 2. output 名称对齐 canndev - 文件: op_host/apply_adam_v2_def.cpp - 改动: output 从 var_out/m_out/v_out 改为 var/m/v 3. infershape 对齐 canndev - 文件: op_host/apply_adam_v2_infershape.cpp - 改动: 从 InferShape4Elewise 改为内联实现 InferShape4InIdxAndOutVector 逻辑(output0,1,2 = input0 shape),包含 canndev 的 input shape 校验逻辑 4. tiling output shape 直取 input - 文件: op_host/arch35/apply_adam_v2_tiling_arch35.cpp - 改动: output shape 不再从 ctx_->GetOutputShape 读取,直接用 raw_input_shapes_[i](inplace 语义保证 outputi = inputi),绕过 GEIR infershape 推导问题 5. README 补充约束 - GEIR 模式不支持 -1/-2 动态 shape(canndev infershape 限制) fused_mul_apply_momentum 1. 修复 FP16 跨 tile V_MTE2 事件死锁 - 文件: op_kernel/arch35/fused_mul_apply_momentum_kernel.h - 改动: ProcessTile 结尾对 FP16 路径补上 SetFlag(V_MTE2),与下一 tile 开头的 WaitFlag(V_MTE2) 配对 - 影响范围: 仅 FP16 路径(if constexpr (IS_FP16)),FP32 不受影响 2. infershape 对齐 canndev - 文件: op_host/fused_mul_apply_momentum_infershape.cpp - 改动: 从 InferShape4Elewise 改为内联实现 InferShape4InIdxAndOutVector 逻辑(output0,1 = input0 shape) 3. tiling output shape 直取 input - 文件: op_host/arch35/fused_mul_apply_momentum_tiling_arch35.cpp - 改动: 同 apply_adam_v2,output shape 直取 rawInputShapes_[i] 4. def 补充 use_locking 属性 - 文件: op_host/fused_mul_apply_momentum_def.cpp - 改动: 添加 this->Attr("use_locking").AttrType(OPTIONAL).Bool(false) 5. README 补充约束 - 同 apply_adam_v2 验证 - ApplyAdamV2 L0_004 (FP32, mbart_adam): Kernel 模式 PASS - FusedMulApplyMomentum L0_001 (FP16, standard): Kernel 模式 PASS(修复死锁后) - GEIR 模式: 非 -1/-2 shape 场景 inplace 检查通过;-1/-2 场景受 canndev infershape 限制不支持(README 已说明) See merge request: cann/ops-nn!9005 | 1 个月前 | |
feat(optim): add apply_adam_v2 operator Co-authored-by: handsomeRobot_SK<suke13@huawei.com> # message auto-generated for no-merge-commit merge: !8094 merge applyadamv2 into master feat(optim): add apply_adam_v2 operator Created-by: handsomeRobot_SK Commit-by: handsomeRobot_SK Merged-by: cann-robot Description: ## PR: feat(optim): add apply_adam_v2 operator ### 概述 新增 ApplyAdamV2 算子,实现 Adam 优化器的参数更新,支持标准 Adam 和 mBART Adam 两种模式,可选梯度裁剪,用于深度学习训练中反向传播后的参数更新阶段。算子基于 Ascend C 开发,支持 Ascend950 (arch35/DAV_3510) 平台,仅支持 GEIR 图模式调用。 ### 算子功能 实现 Adam 优化器的单步参数更新: **标准 Adam 模式**(adam_mode = "adam"): $$g_t = \text{grad} \cdot \text{clip\_coeff}$$ $$m_t = \beta_1 \cdot m_{t-1} + (1 - \beta_1) \cdot g_t$$ $$v_t = \beta_2 \cdot v_{t-1} + (1 - \beta_2) \cdot g_t^2$$ $$u = \frac{m_t}{\sqrt{v_t} + \epsilon}$$ $$\text{var}_t = \text{var}_{t-1} - \eta \cdot (u + \text{weight\_decay} \cdot \text{var}_{t-1})$$ **mBART Adam 模式**(adam_mode = "mbart_adam"): $$m_t = \beta_1 \cdot m_{t-1} + (1 - \beta_1) \cdot \text{grad}$$ $$v_t = \beta_2 \cdot v_{t-1} + (1 - \beta_2) \cdot \text{grad}^2$$ $$u = \frac{m_t}{\sqrt{v_t} + \epsilon}$$ $$\text{var}_t = \text{var}_{t-1} - \text{step\_size} \cdot u - \eta \cdot \text{weight\_decay} \cdot \text{var}_{t-1}$$ 其中 $var$ 为模型参数,$m$ 为一阶矩估计,$v$ 为二阶矩估计,$\beta_1$、$\beta_2$ 为衰减率,$\eta$ 为学习率,$\epsilon$ 为数值稳定性常数。 **算法实现**: - **4 条计算路径**:Adam FP32、Adam FP16、mBART Adam FP32、mBART Adam FP16 - **TilingKey 分派**:DTYPE × MODE 两维度 TilingKey,编译期分派到对应路径 - **VF 寄存器级融合**:5 个 VF 函数(AdamMomentsVF、MbartMomentsVF、AdamDivVF、AdamUpdateVF、MbartUpdateVF)实现寄存器级指令融合 - **FP16 精度提升**:FP16 输入先 Cast 到 FP32 计算,结果 Cast 回 FP16,保证长期训练中矩估计的精度 - **梯度裁剪**:Adam 模式下支持基于 global_grad_norm 的梯度裁剪 ### 支持规格 | 项目 | 支持情况 | |------|---------| | **数据类型** | float16, float32 | | **数据格式** | ND | | **Rank 范围** | 0 ~ 8 | | **平台** | Ascend950 (arch35) | | **调用模式** | GEIR 图模式 | ### 交付件清单 optim/apply_adam_v2/ ├── CMakeLists.txt # 构建配置 ├── README.md # 算子文档 ├── examples/ │ └── test_geir_apply_adam_v2.cpp # GEIR 示例 ├── op_graph/ │ ├── CMakeLists.txt │ ├── apply_adam_v2_proto.h # GEIR 原型定义 │ └── apply_adam_v2_graph_infer.cpp # 图模式 InferDataType ├── op_host/ │ ├── apply_adam_v2_def.cpp # 算子定义 │ ├── apply_adam_v2_infershape.cpp # 形状推导 │ └── arch35/ │ ├── apply_adam_v2_tiling_arch35.h # Tiling 类声明 │ └── apply_adam_v2_tiling_arch35.cpp # Tiling 计算 ├── op_kernel/ │ ├── apply_adam_v2.cpp # Kernel 入口 │ └── arch35/ │ ├── apply_adam_v2_kernel.h # Kernel 实现 │ ├── apply_adam_v2_struct.h # 模板参数声明 │ └── apply_adam_v2_tiling_data.h # Tiling 数据结构 └── tests/ └── ut/ └── op_host/ ├── test_apply_adam_v2_infershape.cpp # InferShape UT (2 用例) └── arch35/ └── test_apply_adam_v2_tiling_arch35.cpp # Tiling UT (4 用例) ### 测试验证 #### 单元测试 (UT) - **用例数**:6 - **通过率**:100% (6/6) - **覆盖范围**:InferShape (2) + Tiling (4) #### TTK 框架验证 - **精度标准**: - FP32: rtol=1e-4, atol=1e-4 - FP16: rtol=1e-3, atol=1e-3 - **覆盖范围**: - 数据类型:FP32 / FP16 - 计算模式:Adam / mBART Adam - 特殊场景:标量、大 Tensor、极端值 #### GEIR 端对端验证 - **状态**:✅ 通过 - **验证内容**:图编译 + 图执行 + 输出正确性 ### 代码质量 #### 代码规范化 - ✅ 文件头格式统一(Copyright + Generated By CANNBot) - ✅ Kernel 结构重构为 VF 融合 + Process 分发模式 - ✅ Tiling 数据结构字段 camelCase 命名 - ✅ 移除 op_host 中冗余的 InferDataType(已由 op_graph 处理) - ✅ 魔鬼数字常量化(kMaxInputSlots, kMaxOutputSlots, kPhysNodes, kMaxRank, kMaxNDDMA) - ✅ clang-format 格式化(基于项目 .clang-format 配置) ### 编译验证 bash # 编译 cd ops-nn bash build.sh --soc=ascend950 --pkg --ops=apply_adam_v2 -j16 # 输出 ✅ 编译成功 ✅ 生成算子包:cann-ops-nn-custom_linux-x86_64.run ✅ 安装成功:部署到 /usr/local/Ascend/cann-9.0.0/opp/vendors/custom_nn/ ### 关键实现细节 #### 1. Kernel 实现 (apply_adam_v2_kernel.h) - **结构**:Init → Process<KEY> → (ProcessAdam / ProcessMbartAdam / ProcessAdamFp16 / ProcessMbartAdamFp16) 分发设计 - **VF 寄存器级融合**: - AdamMomentsVF:梯度裁剪 + 一阶矩 + 二阶矩(S1+S2+S3,6 条指令) - MbartMomentsVF:一阶矩 + 二阶矩,无梯度裁剪(S2+S3,5 条指令) - AdamDivVF:更新量计算 u = m_t / (sqrt(v_t) + epsilon)(S4,3 条指令) - AdamUpdateVF:权重衰减 + 参数更新(adam 模式)(S5+S6,2~4 条指令) - MbartUpdateVF:步长缩放 + 权重衰减 + 参数更新(mbart 模式)(S5+S6+S7,2~4 条指令) - **精度转换**:FP16 路径先 Cast 到 FP32 计算,再 Cast 回 FP16 写回 - **同步管理**:严格的 MTE2↔V↔MTE3 事件同步 #### 2. Tiling 实现 (apply_adam_v2_tiling_arch35.cpp) - **TilingKey 设计**:DTYPE × MODE 两维度,共 4 种组合 - **PadAndSqueeze**:将输入 shape 填充到统一 rank,压缩全 1 维度 - **FindSplitAxis**:从最内维向外寻找可放入 UB 的 split 轴 - **MultiCoreSplit**:基于 tile 总数和可用核数动态分配 - **PrecomputeStrides**:预计算广播 stride(广播轴 stride=0) #### 3. Buffer 规划 - **5 个 TBuf**:B0(grad→u→var_out)、B1(m)、B2(v→v_t→v_out)、B3(var)、B4(m_t→m_out) - **P=5 物理节点**:每个 TBuf 对应一个物理节点,per_buf_bytes = (UB / 5) & ~31 ### 依赖与限制 - **依赖**:CANN 9.0.0 - **限制**: - 仅支持 GEIR 图模式(无 ACLNN 接口) - 仅支持 Ascend950 (arch35) - 不支持空 Tensor(0 元素) - var、m、v、grad 的 shape 和 dtype 必须完全一致 - lr、beta1、beta2、epsilon、max_grad_norm、global_grad_norm、weight_decay、step_size 为标量(shape [1]) ### 测试命令 bash # 单元测试 cd optim/apply_adam_v2/tests/ut/build/op_host ./test_apply_adam_v2_infershape ./test_apply_adam_v2_tiling_arch35 # GEIR 示例 cd optim/apply_adam_v2/examples bash run.sh ### 相关文件 - 算子文档:optim/apply_adam_v2/README.md - Issue 模板:guide/issue模板.md ### Checklist - [x] 代码符合 ops-nn 内置算子标准 - [x] 文件头格式统一 - [x] Kernel 结构规范化(VF 融合 + Process 分发) - [x] 单元测试通过 (6/6) - [x] GEIR 端对端验证通过 - [x] 编译安装验证通过 - [x] 文档完整(README + 示例) - [x] clang-format 格式化 See merge request: cann/ops-nn!8094 | 2 个月前 | |
feat(optim): add apply_adam_v2 operator Co-authored-by: handsomeRobot_SK<suke13@huawei.com> # message auto-generated for no-merge-commit merge: !8094 merge applyadamv2 into master feat(optim): add apply_adam_v2 operator Created-by: handsomeRobot_SK Commit-by: handsomeRobot_SK Merged-by: cann-robot Description: ## PR: feat(optim): add apply_adam_v2 operator ### 概述 新增 ApplyAdamV2 算子,实现 Adam 优化器的参数更新,支持标准 Adam 和 mBART Adam 两种模式,可选梯度裁剪,用于深度学习训练中反向传播后的参数更新阶段。算子基于 Ascend C 开发,支持 Ascend950 (arch35/DAV_3510) 平台,仅支持 GEIR 图模式调用。 ### 算子功能 实现 Adam 优化器的单步参数更新: **标准 Adam 模式**(adam_mode = "adam"): $$g_t = \text{grad} \cdot \text{clip\_coeff}$$ $$m_t = \beta_1 \cdot m_{t-1} + (1 - \beta_1) \cdot g_t$$ $$v_t = \beta_2 \cdot v_{t-1} + (1 - \beta_2) \cdot g_t^2$$ $$u = \frac{m_t}{\sqrt{v_t} + \epsilon}$$ $$\text{var}_t = \text{var}_{t-1} - \eta \cdot (u + \text{weight\_decay} \cdot \text{var}_{t-1})$$ **mBART Adam 模式**(adam_mode = "mbart_adam"): $$m_t = \beta_1 \cdot m_{t-1} + (1 - \beta_1) \cdot \text{grad}$$ $$v_t = \beta_2 \cdot v_{t-1} + (1 - \beta_2) \cdot \text{grad}^2$$ $$u = \frac{m_t}{\sqrt{v_t} + \epsilon}$$ $$\text{var}_t = \text{var}_{t-1} - \text{step\_size} \cdot u - \eta \cdot \text{weight\_decay} \cdot \text{var}_{t-1}$$ 其中 $var$ 为模型参数,$m$ 为一阶矩估计,$v$ 为二阶矩估计,$\beta_1$、$\beta_2$ 为衰减率,$\eta$ 为学习率,$\epsilon$ 为数值稳定性常数。 **算法实现**: - **4 条计算路径**:Adam FP32、Adam FP16、mBART Adam FP32、mBART Adam FP16 - **TilingKey 分派**:DTYPE × MODE 两维度 TilingKey,编译期分派到对应路径 - **VF 寄存器级融合**:5 个 VF 函数(AdamMomentsVF、MbartMomentsVF、AdamDivVF、AdamUpdateVF、MbartUpdateVF)实现寄存器级指令融合 - **FP16 精度提升**:FP16 输入先 Cast 到 FP32 计算,结果 Cast 回 FP16,保证长期训练中矩估计的精度 - **梯度裁剪**:Adam 模式下支持基于 global_grad_norm 的梯度裁剪 ### 支持规格 | 项目 | 支持情况 | |------|---------| | **数据类型** | float16, float32 | | **数据格式** | ND | | **Rank 范围** | 0 ~ 8 | | **平台** | Ascend950 (arch35) | | **调用模式** | GEIR 图模式 | ### 交付件清单 optim/apply_adam_v2/ ├── CMakeLists.txt # 构建配置 ├── README.md # 算子文档 ├── examples/ │ └── test_geir_apply_adam_v2.cpp # GEIR 示例 ├── op_graph/ │ ├── CMakeLists.txt │ ├── apply_adam_v2_proto.h # GEIR 原型定义 │ └── apply_adam_v2_graph_infer.cpp # 图模式 InferDataType ├── op_host/ │ ├── apply_adam_v2_def.cpp # 算子定义 │ ├── apply_adam_v2_infershape.cpp # 形状推导 │ └── arch35/ │ ├── apply_adam_v2_tiling_arch35.h # Tiling 类声明 │ └── apply_adam_v2_tiling_arch35.cpp # Tiling 计算 ├── op_kernel/ │ ├── apply_adam_v2.cpp # Kernel 入口 │ └── arch35/ │ ├── apply_adam_v2_kernel.h # Kernel 实现 │ ├── apply_adam_v2_struct.h # 模板参数声明 │ └── apply_adam_v2_tiling_data.h # Tiling 数据结构 └── tests/ └── ut/ └── op_host/ ├── test_apply_adam_v2_infershape.cpp # InferShape UT (2 用例) └── arch35/ └── test_apply_adam_v2_tiling_arch35.cpp # Tiling UT (4 用例) ### 测试验证 #### 单元测试 (UT) - **用例数**:6 - **通过率**:100% (6/6) - **覆盖范围**:InferShape (2) + Tiling (4) #### TTK 框架验证 - **精度标准**: - FP32: rtol=1e-4, atol=1e-4 - FP16: rtol=1e-3, atol=1e-3 - **覆盖范围**: - 数据类型:FP32 / FP16 - 计算模式:Adam / mBART Adam - 特殊场景:标量、大 Tensor、极端值 #### GEIR 端对端验证 - **状态**:✅ 通过 - **验证内容**:图编译 + 图执行 + 输出正确性 ### 代码质量 #### 代码规范化 - ✅ 文件头格式统一(Copyright + Generated By CANNBot) - ✅ Kernel 结构重构为 VF 融合 + Process 分发模式 - ✅ Tiling 数据结构字段 camelCase 命名 - ✅ 移除 op_host 中冗余的 InferDataType(已由 op_graph 处理) - ✅ 魔鬼数字常量化(kMaxInputSlots, kMaxOutputSlots, kPhysNodes, kMaxRank, kMaxNDDMA) - ✅ clang-format 格式化(基于项目 .clang-format 配置) ### 编译验证 bash # 编译 cd ops-nn bash build.sh --soc=ascend950 --pkg --ops=apply_adam_v2 -j16 # 输出 ✅ 编译成功 ✅ 生成算子包:cann-ops-nn-custom_linux-x86_64.run ✅ 安装成功:部署到 /usr/local/Ascend/cann-9.0.0/opp/vendors/custom_nn/ ### 关键实现细节 #### 1. Kernel 实现 (apply_adam_v2_kernel.h) - **结构**:Init → Process<KEY> → (ProcessAdam / ProcessMbartAdam / ProcessAdamFp16 / ProcessMbartAdamFp16) 分发设计 - **VF 寄存器级融合**: - AdamMomentsVF:梯度裁剪 + 一阶矩 + 二阶矩(S1+S2+S3,6 条指令) - MbartMomentsVF:一阶矩 + 二阶矩,无梯度裁剪(S2+S3,5 条指令) - AdamDivVF:更新量计算 u = m_t / (sqrt(v_t) + epsilon)(S4,3 条指令) - AdamUpdateVF:权重衰减 + 参数更新(adam 模式)(S5+S6,2~4 条指令) - MbartUpdateVF:步长缩放 + 权重衰减 + 参数更新(mbart 模式)(S5+S6+S7,2~4 条指令) - **精度转换**:FP16 路径先 Cast 到 FP32 计算,再 Cast 回 FP16 写回 - **同步管理**:严格的 MTE2↔V↔MTE3 事件同步 #### 2. Tiling 实现 (apply_adam_v2_tiling_arch35.cpp) - **TilingKey 设计**:DTYPE × MODE 两维度,共 4 种组合 - **PadAndSqueeze**:将输入 shape 填充到统一 rank,压缩全 1 维度 - **FindSplitAxis**:从最内维向外寻找可放入 UB 的 split 轴 - **MultiCoreSplit**:基于 tile 总数和可用核数动态分配 - **PrecomputeStrides**:预计算广播 stride(广播轴 stride=0) #### 3. Buffer 规划 - **5 个 TBuf**:B0(grad→u→var_out)、B1(m)、B2(v→v_t→v_out)、B3(var)、B4(m_t→m_out) - **P=5 物理节点**:每个 TBuf 对应一个物理节点,per_buf_bytes = (UB / 5) & ~31 ### 依赖与限制 - **依赖**:CANN 9.0.0 - **限制**: - 仅支持 GEIR 图模式(无 ACLNN 接口) - 仅支持 Ascend950 (arch35) - 不支持空 Tensor(0 元素) - var、m、v、grad 的 shape 和 dtype 必须完全一致 - lr、beta1、beta2、epsilon、max_grad_norm、global_grad_norm、weight_decay、step_size 为标量(shape [1]) ### 测试命令 bash # 单元测试 cd optim/apply_adam_v2/tests/ut/build/op_host ./test_apply_adam_v2_infershape ./test_apply_adam_v2_tiling_arch35 # GEIR 示例 cd optim/apply_adam_v2/examples bash run.sh ### 相关文件 - 算子文档:optim/apply_adam_v2/README.md - Issue 模板:guide/issue模板.md ### Checklist - [x] 代码符合 ops-nn 内置算子标准 - [x] 文件头格式统一 - [x] Kernel 结构规范化(VF 融合 + Process 分发) - [x] 单元测试通过 (6/6) - [x] GEIR 端对端验证通过 - [x] 编译安装验证通过 - [x] 文档完整(README + 示例) - [x] clang-format 格式化 See merge request: cann/ops-nn!8094 | 2 个月前 | |
fix(apply_adam_v2, fused_mul_apply_momentum): 修复FP16 Cast别名冲突、跨tile事件同步、infershape对齐canndev、inplace output shape直取input Co-authored-by: handsomeRobot_SK<suke13@huawei.com> # message auto-generated for no-merge-commit merge: !9005 merge fix-adam-momentum-geir-issues into master fix(apply_adam_v2, fused_mul_apply_momentum): 修复FP16 Cast别名冲突、跨tile事件同步、infershape对齐canndev、inplace output shape直取input Created-by: handsomeRobot_SK Commit-by: handsomeRobot_SK Merged-by: cann-robot Description: PR 描述 标题: fix(apply_adam_v2, fused_mul_apply_momentum): 修复 FP16 Cast 别名冲突、跨 tile 事件同步、infershape 对齐 canndev 描述: 关联 Issue Closes #<issue_number> 修改内容 apply_adam_v2 1. 修复 FP16 in-place Cast 别名冲突 (VEC_ERROR) - 文件: op_kernel/arch35/apply_adam_v2_kernel.h - 改动: ProcessAdamFp16 和 ProcessMbartAdamFp16 中,用 B4 作为 FP16 中转缓冲,改为逐输入 CopyIn→B4(FP16)→Cast→B{target}(FP32) 模式,确保 Cast 的 src (B4) 和 dst (B{target}) 在不同 TBuf 上,消除别名冲突 - 新增: Process() 中 fetch evVtoMTE2 事件,前 3 个输入完成后通过 SetFlag/WaitFlag(V_MTE2) 释放 B4 供下一个输入复用 - 不变: Cast back (FP32→FP16) 保持 in-place(narrowing 安全) 2. output 名称对齐 canndev - 文件: op_host/apply_adam_v2_def.cpp - 改动: output 从 var_out/m_out/v_out 改为 var/m/v 3. infershape 对齐 canndev - 文件: op_host/apply_adam_v2_infershape.cpp - 改动: 从 InferShape4Elewise 改为内联实现 InferShape4InIdxAndOutVector 逻辑(output0,1,2 = input0 shape),包含 canndev 的 input shape 校验逻辑 4. tiling output shape 直取 input - 文件: op_host/arch35/apply_adam_v2_tiling_arch35.cpp - 改动: output shape 不再从 ctx_->GetOutputShape 读取,直接用 raw_input_shapes_[i](inplace 语义保证 outputi = inputi),绕过 GEIR infershape 推导问题 5. README 补充约束 - GEIR 模式不支持 -1/-2 动态 shape(canndev infershape 限制) fused_mul_apply_momentum 1. 修复 FP16 跨 tile V_MTE2 事件死锁 - 文件: op_kernel/arch35/fused_mul_apply_momentum_kernel.h - 改动: ProcessTile 结尾对 FP16 路径补上 SetFlag(V_MTE2),与下一 tile 开头的 WaitFlag(V_MTE2) 配对 - 影响范围: 仅 FP16 路径(if constexpr (IS_FP16)),FP32 不受影响 2. infershape 对齐 canndev - 文件: op_host/fused_mul_apply_momentum_infershape.cpp - 改动: 从 InferShape4Elewise 改为内联实现 InferShape4InIdxAndOutVector 逻辑(output0,1 = input0 shape) 3. tiling output shape 直取 input - 文件: op_host/arch35/fused_mul_apply_momentum_tiling_arch35.cpp - 改动: 同 apply_adam_v2,output shape 直取 rawInputShapes_[i] 4. def 补充 use_locking 属性 - 文件: op_host/fused_mul_apply_momentum_def.cpp - 改动: 添加 this->Attr("use_locking").AttrType(OPTIONAL).Bool(false) 5. README 补充约束 - 同 apply_adam_v2 验证 - ApplyAdamV2 L0_004 (FP32, mbart_adam): Kernel 模式 PASS - FusedMulApplyMomentum L0_001 (FP16, standard): Kernel 模式 PASS(修复死锁后) - GEIR 模式: 非 -1/-2 shape 场景 inplace 检查通过;-1/-2 场景受 canndev infershape 限制不支持(README 已说明) See merge request: cann/ops-nn!9005 | 1 个月前 |
ApplyAdamV2
产品支持情况
| 产品 | 是否支持 |
|---|---|
| Ascend 950PR/Ascend 950DT | √ |
| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ |
| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ |
| Atlas 200I/500 A2 推理产品 | √ |
| Atlas 推理系列产品 | √ |
| Atlas 训练系列产品 | √ |
功能说明
-
算子功能:实现 Adam 优化器的参数更新,支持标准 Adam 和 mBART Adam 两种模式,可选梯度裁剪,用于深度学习训练中反向传播后的参数更新阶段。
-
计算公式:
标准 Adam 模式(adam_mode = "adam"):
gt=grad⋅clip_coeffg_t = \text{grad} \cdot \text{clip\_coeff} gt=grad⋅clip_coeff
mt=β1⋅mt−1+(1−β1)⋅gtm_t = \beta_1 \cdot m_{t-1} + (1 - \beta_1) \cdot g_t mt=β1⋅mt−1+(1−β1)⋅gt
vt=β2⋅vt−1+(1−β2)⋅gt2v_t = \beta_2 \cdot v_{t-1} + (1 - \beta_2) \cdot g_t^2 vt=β2⋅vt−1+(1−β2)⋅gt2
u=mtvt+ϵu = \frac{m_t}{\sqrt{v_t} + \epsilon} u=vt+ϵmt
vart=vart−1−η⋅(u+weight_decay⋅vart−1)\text{var}_t = \text{var}_{t-1} - \eta \cdot (u + \text{weight\_decay} \cdot \text{var}_{t-1}) vart=vart−1−η⋅(u+weight_decay⋅vart−1)
mBART Adam 模式(adam_mode = "mbart_adam"):
mt=β1⋅mt−1+(1−β1)⋅gradm_t = \beta_1 \cdot m_{t-1} + (1 - \beta_1) \cdot \text{grad} mt=β1⋅mt−1+(1−β1)⋅grad
vt=β2⋅vt−1+(1−β2)⋅grad2v_t = \beta_2 \cdot v_{t-1} + (1 - \beta_2) \cdot \text{grad}^2 vt=β2⋅vt−1+(1−β2)⋅grad2
u=mtvt+ϵu = \frac{m_t}{\sqrt{v_t} + \epsilon} u=vt+ϵmt
vart=vart−1−step_size⋅u−η⋅weight_decay⋅vart−1\text{var}_t = \text{var}_{t-1} - \text{step\_size} \cdot u - \eta \cdot \text{weight\_decay} \cdot \text{var}_{t-1} vart=vart−1−step_size⋅u−η⋅weight_decay⋅vart−1
其中 varvarvar 为模型参数,mmm 为一阶矩估计,vvv 为二阶矩估计,β1\beta_1β1、β2\beta_2β2 为衰减率,η\etaη 为学习率,ϵ\epsilonϵ 为数值稳定性常数。
参数说明
| 参数名 | 输入/输出/属性 | 描述 | 数据类型 | 数据格式 |
|---|---|---|---|---|
| var | 输入 | 待更新的模型参数,对应公式中 vart-1。 | FLOAT、FLOAT16 | ND |
| m | 输入 | 一阶矩估计,对应公式中 mt-1。shape 与 var 一致。 | FLOAT、FLOAT16 | ND |
| v | 输入 | 二阶矩估计,对应公式中 vt-1。shape 与 var 一致。 | FLOAT、FLOAT16 | ND |
| lr | 输入 | 学习率,对应公式中 η,标量。 | FLOAT、FLOAT16 | ND |
| beta1 | 输入 | 一阶矩衰减率,对应公式中 β1,标量,典型值 0.9。 | FLOAT、FLOAT16 | ND |
| beta2 | 输入 | 二阶矩衰减率,对应公式中 β2,标量,典型值 0.999。 | FLOAT、FLOAT16 | ND |
| epsilon | 输入 | 数值稳定性常数,对应公式中 ε,标量,典型值 1e-8。 | FLOAT、FLOAT16 | ND |
| grad | 输入 | 梯度张量。shape 与 var 一致。 | FLOAT、FLOAT16 | ND |
| max_grad_norm | 输入(可选) | 梯度裁剪阈值,标量。仅 adam 模式使用。 | FLOAT、FLOAT16 | ND |
| global_grad_norm | 输入 | 全局梯度范数,标量。仅 adam 模式使用。 | FLOAT、FLOAT16 | ND |
| weight_decay | 输入 | 权重衰减系数,标量,典型值 0.01。 | FLOAT、FLOAT16 | ND |
| step_size | 输入(可选) | 步长缩放因子,标量。仅 mbart_adam 模式使用。 | FLOAT、FLOAT16 | ND |
| adam_mode | 属性 |
|
STRING | - |
| var | 输出 | 更新后的模型参数,对应公式中 vart。shape 和 dtype 与输入 var 一致。 | FLOAT、FLOAT16 | ND |
| m | 输出 | 更新后的一阶矩估计,对应公式中 mt。shape 和 dtype 与输入 m 一致。 | FLOAT、FLOAT16 | ND |
| v | 输出 | 更新后的二阶矩估计,对应公式中 vt。shape 和 dtype 与输入 v 一致。 | FLOAT、FLOAT16 | ND |
约束说明
- var、m、v、grad 四个 Tensor 的 shape 和数据类型必须完全一致。
- lr、beta1、beta2、epsilon、max_grad_norm、global_grad_norm、weight_decay、step_size 为标量(shape [1]),数据类型必须与 Tensor 的数据类型一致。
- FP16 输入时,内部计算提升到 FP32 进行,输出再转回 FP16,以保证长期训练中矩估计的精度。
- adam 模式下,若提供 max_grad_norm 和 global_grad_norm,则进行梯度裁剪:clip_coeff = min(1.0, max_grad_norm / global_grad_norm)。
- mbart_adam 模式下,若未提供 step_size,则使用 lr 作为 step_size。
- 算子默认确定性实现,相同输入产生相同输出。
- 不支持空 Tensor(0 元素)。
- Tensor rank 范围 0~8。
- 动态 shape 支持情况:Kernel 模式支持 -1/-2(未知维度);GEIR 模式不支持 -1/-2,因为 canndev 内置 infershape 无法将未知维度正确传播到 inplace 输出。
调用说明
| 调用方式 | 调用样例 | 说明 |
|---|---|---|
| 图模式调用 | test_geir_apply_adam_v2 | 通过算子IR构图方式调用ApplyAdamV2算子。 |