| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
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 个月前 | |
merge: apply_adam_v2 转测准入检查项补齐 Co-authored-by: handsomeRobot_SK<suke13@huawei.com> # message auto-generated for no-merge-commit merge: !8201 merge master into master merge: apply_adam_v2 转测准入检查项补齐 Created-by: handsomeRobot_SK Commit-by: handsomeRobot_SK Merged-by: cann-robot Description: ### 标题 feat(optim): 新增 ApplyAdamV2 和 FusedMulApplyMomentum 算子 Ascend950 实现 ### 描述 #### 变更内容 本 PR 为 Ascend950 (arch35) 平台新增两个优化器算子的完整实现: **1. ApplyAdamV2** - Adam 优化器变体,支持 adam / mbart_adam 两种模式 - 12 输入(含 2 个 Optional:max_grad_norm、step_size)/ 3 输出 - 支持 DT_FLOAT16、DT_FLOAT,FP16 内部提升至 FP32 计算 - 支持动态 shape(-1)和动态 rank(-2) **2. FusedMulApplyMomentum** - 融合梯度缩放(mul)与动量更新(apply_momentum) - 6 输入 / 2 输出(inplace 复用 var、accum) - 支持标准动量和 Nesterov 动量(use_nesterov 属性) - 支持广播 shape,最大 rank 8 #### 主要改动 | 模块 | 说明 | |------|------| | op_host/*_def.cpp | 算子注册定义(OpDef 格式),属性标记 AttrType(OPTIONAL) | | op_host/arch35/*_tiling_arch35.cpp | Tiling 实现,含维度/dtype/format 校验 | | op_graph/*_proto.h | GE IR 图构建 proto 定义 | | op_kernel/arch35/ | AscendC kernel 实现 | | common/inc/op_graph/op_nn_proto_extend.h | 移除旧 REG_OP(ApplyAdamV2) 定义,迁移至 OpDef 格式 | | examples/arch35/ | GEIR 静态/动态/异常用例(本地保留,暂不入库) | #### Tiling 校验项 - 维度数 ≤ 8(MAX_DIM_NUM) - dtype 仅支持 DT_FLOAT16、DT_FLOAT - format 仅支持 FORMAT_ND - 输入间 dtype 一致性校验 - 广播 shape 兼容性校验 #### 提交记录 | Commit | 说明 | |--------|------| | a18138bfa | feat(optim): add apply_adam_v2 operator (Ascend950, arch35) | | ae5c7ae52 | feat(optim): fused_mul_apply_momentum | | f5b882236 | feat(optim): add apply_adam_v2 operator | | ca43328b0 | feat(fused_mul_apply_momentum): add tiling exception checks | | 2325929ee | feat(apply_adam_v2): 补齐转测准入检查项 | | 38bea1cdc | merge: apply_adam_v2 转测准入检查项补齐 | | a77f1cd6d | feat(optim): 对齐校验格式(OP_LOGE 统一风格) | | e345b1414 | chore: 从远端移除 example 测试文件(本地保留) | --- See merge request: cann/ops-nn!8201 | 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 个月前 | |
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 个月前 | |
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 个月前 |
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。
调用说明
| 调用方式 | 调用样例 | 说明 |
|---|---|---|
| 图模式调用 | test_geir_apply_adam_v2 | 通过算子IR构图方式调用ApplyAdamV2算子。 |