已关闭
【社区任务】ApplyAdamW算子设计文档 #4058
StarLightOn创建于 4月21日关闭于 5月15日
【社区任务】ApplyAdamW算子设计文档 #4058
已关闭
当前Pull Request已关闭, 关闭人@fulltower
4月21日 创建了 pull request,commit c4fc6e2d
CANN-robot
4月21日 评论:
4月21日 评论:
Thanks for your pull-request.
The full list of commands accepted by me can be found at here。
You can get sig-info at here
PR Approval Progress
⚠️ This PR does not yet meet the following requirements:lgtm (requires ≥ 2 person(s) per module)、approve (requires ≥ 1 person(s) per module)
Module Approval Details
| module | lgtm status | approve status |
|---|---|---|
| experimental/quant | ❌ (0/2)(You can also ask: liujie12345678, Chen_HaoWen, 胡碧霞, zhang-wu, wangyongguang) | ❌ (0/1)(You can also ask: 王子韬, Chen_HaoWen, zhang-wu, 胡碧霞, 唐玮玮) |
💡 Tip:
- Committer can comment
/approveor/lgtm- Commenting
/approveimplies both code review (lgtm) and intent to merge (approve)
CLA Signature Pass
StarLightOn, thanks for your pull request. All authors of the commits have signed the CLA. 👍


4月21日 添加了label:cann-cla/yes
4月21日 将sxb154714,chenfeng61,crystalhu,yangyang016,fanqirui,zhou-qilong,zhajianqing123,chenqi317,liubo75,tangweiwei2,wangzitao_leo,liujie12345678,Chen_HaoWen,wangyongguang,zhang-wu设为评审人
4月21日 将sxb154714,chenfeng61,crystalhu,yangyang016,fanqirui,zhou-qilong,zhajianqing123,chenqi317,liubo75,tangweiwei2,wangzitao_leo,liujie12345678,Chen_HaoWen,wangyongguang,zhang-wu设为评审人
4月21日 将sxb154714,chenfeng61,crystalhu,zhou-qilong,zhajianqing123,chenqi317,liubo75,tangweiwei2,wangzitao_leo,liujie12345678,Chen_HaoWen,wangyongguang,zhang-wu设为审查人
4月21日 将sxb154714,chenfeng61,crystalhu,zhou-qilong,zhajianqing123,chenqi317,liubo75,tangweiwei2,wangzitao_leo,liujie12345678,Chen_HaoWen,wangyongguang,zhang-wu设为审查人
4月21日 修改了pull request 的描述
4月21日 修改了pull request 的描述
4月21日 修改了pull request 的描述
4月21日 取消了草稿状态
一、 需求背景
1.1 需求来源
通过社区任务完成开源仓算子贡献的需求,补充完善 Ascend C 算子库。
1.2 背景介绍
基于 ApplyAdamW 算子历史 TBE 版本使用 Ascend C 编程语言进行优化并替换。
1.2.1 TBE 算子现状分析
TBE 源码参考文件为
${INSTALL_PATH}/opp/built-in/op_impl/ai_core/tbe/impl/ops_legacy/dynamic/apply_adam_w.py。算子原型库:
${INSTALL_PATH}/opp/built-in/op_graph/inc/ops_proto_nn.h根据 TBE 源码分析,当前算子支持的数据类型为:
float16、float32、bfloat16。支持的数据格式为:
ND(无需感知具体维度,当作一维向量处理)。部分标量输入(如
beta1_power,beta2_power,lr,weight_decay,beta1,beta2,epsilon)的 shape 为[1]。1.2.2 TBE 算子实现描述
通过对 ApplyAdamW 算子 TBE 版本代码分析,核心实现逻辑与计算公式如下:
若属性
maximize为 True,则 gt=−grad;否则 gt=grad。一阶动量:m_out=m×β1−(β1−1)×gt
二阶动量:v_out=v×β2−(β2−1)×gt×gt
var_t=var×(1−lr×weight_decay)
β1_power_out=β1_power×β1
β2_power_out=β2_power×β2
若属性
amsgrad为 True:max_grad_norm_out=max(max_grad_norm,v_out)
denom=−max_grad_norm_out/(β2_power_out−1)+ϵ
若
amsgrad为 False:denom=−v_out/(β2_power_out−1)+ϵ
var_out=var_t+β1_power_out−1lr×denomm_out
1.2.3 TBE 算子实现流程图
二、 需求分析
2.1 外部组件依赖
不涉及。
2.2 内部适配模块
适配 aclnn 接口调用框架。
2.3 需求模块设计
2.3.1 Ascend C 算子原型
属性 (Attributes):
amsgrad(bool, default=False)maximize(bool, default=False)2.3.2 Ascend C 算子相关约束
var,m,v,grad,max_grad_norm的 shape 必须一致)。lr,beta1,epsilon等)在 Host 侧解析时其 shape 必须为 1,在 Kernel 侧计算时作为标量或借助标量广播指令参与向量计算。amsgrad为 True,输入max_grad_norm必须有效。三、 需求详细设计
3.1 使能方式
3.2 需求总体设计
3.2.1 Host侧设计
3.2.1.1 分核策略
采取均分满核策略。在 Host 侧由于所有计算都是 element-wise,可以将输入视为 1D 数组。
根据
var的元素总数(inputLength)和硬件可用核心数(coreNum)进行切分。对于不能整除的部分,将剩余的数据块(tailBlockNum)优先分配给前面的计算核心(大核),剩余核心为小核,确保每个核心的计算量差异不超过一个数据块,最大化硬件利用率。3.2.1.2 数据分块和内存优化策略
该算子输入输出较多,需要充分利用 UB(Unified Buffer)空间。
var,m,v,grad为主要输入,计算中涉及大量临时变量,可通过 Ascend C 的TBuf资源池和对LocalTensor的重用来减少总空间占用。针对标量输入(lr,beta1等),可以直接解析到标量寄存器或开辟极小的 UB 空间存放,节约主流水线内存。tileDataNum,默认开启DOUBLE_BUFFER隐藏 MTE2(搬入)和 MTE3(搬出)的内存访问延迟。3.2.1.3 tilingKey规划策略
为了避免在 Kernel 侧的每个循环内部引入 bool 类型的分支跳转(影响流水线排布),利用 TilingKey 在 Host 侧进行静态分支分发:
根据
amsgrad(0/1) 和maximize(0/1) 属性,可组合出 4 种 TilingKey(如:NORMAL,MAXIMIZE,AMSGRAD,MAXIMIZE_AMSGRAD)。Kernel 侧通过模板参数或if constexpr实例化出独立且最优的指令流分支。3.2.2 Kernel侧设计
3.2.2.1 kernel侧实现描述
分为
Init和Process两步:coreDataNum及偏移。初始化TPipe,申请相应的TQue和TBuf(包括辅助标量张量和计算使用的临时掩码/运算中转空间)。var,m,v,grad(及可选的max_grad_norm)到 UB 中。对于标量如lr仅需在最外层或 Host 侧读取一次。Mul,Adds,Sub,Div,Sqrt,Max等高性能向量计算 API 计算m_out,v_out,var_out。在bfloat16场景下,由于部分 API 精度限制,需先 cast 到float32计算再 cast 回bfloat16。var_out,m_out,v_out异步写回 GM。3.2.2.2 Ascend C 实现流程图

3.2.2.3 Ascend C 实现流程图与 TBE 流程图存在的差异点和原因
maximize和amsgrad的判断被前置到 Host 侧,通过 TilingKey 控制 Kernel 的模板实例化。原因:在 Ascend C 的 V 单元中做标量级别的 if 分支会打断指令流水线,降低并行执行效率。tbe.broadcast将标量撑成与 Tensor 同等大小后计算;Ascend C 中,出于节省 UB 内存考虑,大量操作会直接使用标量-向量混合的 API(如Adds,Muls传入标量操作数),避免冗余的 broadcast 内存消耗。WaitFlag / SetFlag数据流同步和 Ping-Pong 双缓冲处理机制,这是底层算子获取极致性能的关键,而 TBE 是由 TVM Auto-schedule 隐式生成的。3.3 支持硬件
3.4 算子约束限制
var,m,v,grad以及max_grad_norm(当 amsgrad 为 True 时) 数据类型需保持一致。[1]或为标量实体。四、 特性交叉分析
不涉及
五、 可维可测分析
5.1 精度标准/性能标准
5.2 兼容性分析
本需求为新增 Ascend C 算子替换原有 TBE 算子。
对外接口类型、参数列表均对齐原有 TBE 实现规范,向上层提供一致的 aclnn 调用表现,不存在兼容性断裂问题。