已关闭
[Requirement|需求建议]: [社区任务]新增EmbeddingDenseGrad算子 #4250
YOLO-MIC创建于  7月22日关闭于  8月6日
YOLO-MIC
YOLO-MIC
7月22日 创建

Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.

Backgroud(背景信息)

在 Atlas 推理系列产品上进行 NLP 模型训练(如 BERT、CLIP 系列微调)时,Embedding 层的反向梯度计算缺少原生算子支持,导致相关训练任务无法在 Atlas 推理系列产品上跑通。同时现有实现无法直接支持 padding_idx 置零、scale_grad_by_freq 按词频缩放等标准 Embedding 语义,需要业务侧自行封装补齐,开发成本高。

使用 AscendC 新增 EmbeddingDenseGrad 算子,将 scatter-add 累加在 AICore 上执行,补齐 Embedding 层反向梯度计算的原生算子支持,开箱即用支持标准 Embedding 语义。

Origin(信息来源)

外部贡献(社区任务)

Benefit / Necessity (价值/作用)

EmbeddingDenseGrad 算子的主要功能是作为 Embedding 前向算子的反向梯度算子,按 scatter-add 语义根据索引 indices 将上游梯度 grad 累加回词表梯度 y。计算公式:out[indices[i]] += grad[i]。
在 NLP 模型训练中,Embedding 层是必备组件,其反向梯度的计算效率直接影响训练吞吐。

EmbeddingDenseGrad 算子通过 AscendC 实现,将 scatter-add 累加在 AICore 上执行,利用 Vector/Core 侧硬件并行计算能力。支持 padding_idx 填充索引置零、scale_grad_by_freq 按索引频次缩放梯度等标准语义,开箱即用。

Design(设计方案)

算子实现 Embedding 反向计算,按 indices 索引将 grad 中对应行累加到输出 tensor 的对应行上:

out[indices[i]][j] += grad[i][j],  i ∈ [0, N), j ∈ [0, D)

其中 N 为 indices 元素总数(grad 合轴后首轴大小),D 为 grad 末轴大小。

当 scale_grad_by_freq=True 时,对输出按索引出现频率缩放:

out[k] = (1/count[k]) * Σ grad[i],  对所有 indices[i]=k 的 i 求和

当 padding_idx >= 0 时,out[padding_idx] 行置零。

支持数据类型:

  • grad:FLOAT / FLOAT16
  • indices:INT32 / INT64
  • out:与 grad 同 dtype

属性:numWeights(int64)、paddingIdx(int64, 默认 -1)、scaleGradByFreq(bool, 默认 false)

Host 侧设计:

  • Shape 推导:输出 shape 为 [numWeights, D],D 为 grad 最后一维大小,numWeights 从属性获取
  • Tiling Key 规划:
    • Key 1:单行可装入 UB + 非 Key 3 条件,标准 scatter 路径,逐行 CopyIn→CopyOut
    • Key 2:单行无法装入 UB,分片 scatter 路径,一行分多次 CopyIn→CopyOut
    • Key 3:FP32 + D 32B 对齐 + !scaleGrad + 单行可装入,多行打包快路径,一次 MTE2 装入 K 行,减少 MTE2 调用数
  • 分核策略:Phase 1(scatter 累加)按 grad 行数分核;Phase 2(scale 缩放)按 numWeights 分核,独立 tiling。核间不均分时前几个核多处理一行

支持硬件:
Atlas 推理系列产品(Ascend 310P)

算子约束限制:

  • grad 至少 1 维(dimSize = grad.shape[-1])
  • indices 元素个数必须等于 grad 第 0 维到倒数第 2 维的乘积
  • indices 元素值必须在 [0, numWeights) 范围内,paddingIdx 除外
  • y 的 shape 为 {numWeights, dimSize}
  • paddingIdx = -1 表示不启用 padding 置零
  • 仅支持 ND format
  • 当前仅支持 ascend310p

关联 PR:
https://gitcode.com/cann/ops-nn/merge_requests/7760

likedislike
Ffulltower成员
7月23日 修改标题为 “[Requirement|需求建议]: [社区任务]新增EmbeddingDenseGrad算子”,原标题为“[Requirement|需求建议]: ”
Ffulltower成员
7月23日 将 fullt 设为负责人
fulltower成员
7月23日 评论:

我们会进行评审

likedislike
CANN-robotCANN-robot成员
8月6日 关闭了 issue
CANN-robotCANN-robot成员
8月6日 添加了label:resolved