已关闭
[Requirement|需求建议]: BinaryCrossEntropyGrad算子AscendC实现贡献 #220
cc创建于  2025年12月8日关闭于  2025年12月24日
cc
cc
2025年12月8日 创建

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

Backgroud(背景信息)

使用AscendC对BinaryCrossEntropyGrad算子进行实现,实现了AscendC实现的BinaryCrossEntropyGrad算子对Atlas 200/500 A2推理产品和Atlas 800I/T A2硬件的适配。

Origin(信息来源)

哈工大算子团队

Benefit / Necessity (价值/作用)

   BinaryCrossEntropyGrad 算子的主要功能是计算二元交叉熵损失函数对输入的梯度,用于反向传播。支持在“reduction=none/ sum / mean ”三种模式下求得梯度,支持对正样本添加可学习的权重(pos_weight),支持对输入进行单点/批量梯度计算。常用于深度学习模型的二分类任务(如图像前景-背景分割、文本情感分类、CTR 预估)、生成对抗网络(GAN)中判别器的损失回传、多标签分类场景以及需要逐像素/逐 token 二值决策的计算机视觉与自然语言处理任务。
   给定样本真实标签 (logits)、模型预测概率 (labels)、上游梯度 (grad) 及可选权重 (weight),算子逐元素计算关于预测值的梯度 (Z):

zi=weightigradilogitsilabelsiz_i= weight_i * grad_i * (logits_i - labels_i)

   目前该算子支持 float / float16  数据类型 ,  int32 / int16 数据类型只支持 none (ELEMENTWISE_TPL_SCH_MODE_0)场景

Design(设计方案)

  1. Host 侧设计
    1. 1 分核策略:
    • 计算总元素数(totalIdx = 输入形状总大小),结合数据类型长度得到总字节数(inputLengthBytes = totalIdx × 数据类型长度)。
    • 按512B粒度估算总block数(blocksTotal = (总字节数 + 511) / 512,即(inputLengthBytes + BLOCK_SIZE - 1) / BLOCK_SIZE,其中BLOCK_SIZE = 512)。
    • 若总block数 < 可用核心数(coreNum),则核数裁剪为总block数(最少1个核)。
    • 前tailBlockNum个核作为“大核”(每个多处理1个block),其余为“小核”(处理基本block数),其中tailBlockNum为总block数除以核心数的余数。
    1. 2 单核内切分:
    • tileBlockNum基于UB大小计算,公式为(ubSize / BLOCK_SIZE / BUFFER_NUM) / ubDataNumber(ubDataNumber根据数据类型字节数调整,确保UB可容纳缓冲区。
    • tileDataNum(每个tile的元素数)为(tileBlockNum × BLOCK_SIZE) / 数据类型长度,最少为1。
    • 每核数据切分成若干tile,最后一个tile为尾片(tailDataNum),大核使用bigTailDataNum,小核使用smallTailDataNum,通过总数据量与完整tile数据量的差值计算。
    1. 3 tiling key 规划:
    • 按 reduction 的值映射到schMode,支持 none (ELEMENTWISE_TPL_SCH_MODE_0)、 sum 和 mean(ELEMENTWISE_TPL_SCH_MODE_1)用于区分kernel分支。
  2. Kernel 侧设计
    进行Init和Process两个阶段,其中Process包括数据搬入(CopyIn)、计算(Compute)、数据搬出(CopyOut)三个阶段,实现计算。
    2. 1 初始化
    • 获取当前核 ID(blockIdx)
    • 依据 tiling 参数计算本核负责的数据量 coreDataNum、分块数 tileNum、尾块元素数 tailDataNum 以及全局偏移 globalBufferIndex
    • 将 Global Memory 中的 5 个张量(grad、logits、labels、weight、outgrad)映射到本核的 GlobalTensor,并绑定 Queue 缓冲区(VECIN *4 + VECOUT *1)
    1. 2 计算流程
    • 从 VECIN 队列弹出 4 个 LocalTensor
    • 计算中间量:
      logits = logits – labels
      logits = logits * grad
      outgrad = logits * weight
    • 将结果 LocalTensor 推入 VECOUT 队列,并释放 4 个输入 LocalTensor
likedislike
cccc
2025年12月8日 修改了issue 的描述
cccc
2025年12月8日 修改了issue 的描述
cc
cc
2025年12月8日 评论:

/assign

likedislike
CANN-robotCANN-robot成员
2025年12月8日 将 c15503545287 设为负责人
cccc
2025年12月8日 关联了pull request:BinaryCrossEntropyGrad算子AscendC实现贡献
cccc
2025年12月8日 关联了pull request:BinaryCrossEntropyGrad: AscendC implementation
胡一航成员
2025年12月9日 评论:

感谢您的反馈,可以关联上您的PR,在验证后由commiter审视合入。

likedislike
chenqi317成员
2025年12月14日 评论:

32B粒度 偏小 建议放大道、到512B 以上, 提升搬运带宽

likedislike
cccc
2025年12月15日 修改了issue 的描述
cc
cc
2025年12月15日 评论:

已修改

likedislike
cccc
2025年12月15日 修改了issue 的描述
Cchenqi317成员
2025年12月24日 issue状态由 进行中 改变为 已完成
Cchenqi317成员
2025年12月24日 关闭了 issue
CANN-robotCANN-robot成员
2025年12月24日 添加了label:Accepted