已关闭
[Requirement|需求建议]: HingeLoss算子AscendC实现贡献 #4289
石向阳创建于  7月23日关闭于  7月28日
石向阳
石向阳成员
7月23日 创建

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

Backgroud(背景信息)

使用 AscendC 对 HingeLoss 算子进行实现,该算子是 Hinge Loss 分类损失的正向算子。在神经网络训练中,Hinge Loss 常用于 SVM 等二分类任务;其前向公式为 out = max(0, 1 - target * predict),其中 predict 为模型预测值,target 通常取值为 1 或 -1。

当前 ops-nn 已有 experimental/loss/hinge_loss_grad,用于计算上述损失对预测值的反向梯度;但缺少对应的 HingeLoss 正向算子。实现适配 Atlas A2 系列硬件(Ascend910B),满足 Ascend 平台训练场景中 Hinge Loss 前向计算与既有反向传播配套的底层算子需求。

Origin(信息来源)

哈工大算子团队

Benefit / Necessity (价值/作用)

HingeLoss 是支持向量机和间隔分类训练的基础损失函数。补齐正向算子后,可与已有 HingeLossGrad 形成完整训练闭环,避免框架将乘法、减法、ReLU/Max 等基础算子拆分组合,从而减少算子启动次数、中间 Tensor 和调度开销,并提升训练图的可维护性。

Design(设计方案)

接口与语义

  • 输入:predict、target;两者 shape 相同,target 通常为 1 或 -1。
  • 输出:loss,第一版输出与输入同 shape,即逐元素 loss;该设计与现有 HingeLossGrad 的逐元素 gradOutput 输入保持一致。
  • 公式:loss = max(0, 1 - target * predict)。
  • 第一版支持 float、float16、bfloat16 和 ND 格式;动态 shape/rank 能力与既有 HingeLossGrad 保持一致。
  • reduction(none/mean/sum)作为后续扩展项,不与首版 Grad 的逐元素接口混合设计。

host 侧设计

  1. 参数校验:检查 predict、target 非空,dtype 在支持范围内,shape 一致,输出 loss 的 shape/dtype 与输入一致。
  2. 分核策略:按元素总数连续分块。数据能被核数整除时各核处理等量数据;不可整除时将余数块分配到前若干核。元素数量较小时使用单核,其他场景尽量满核处理。
  3. 单核切分:根据 UB 容量计算 tile 长度,采用双缓冲;每个 tile 同时搬入 predict 和 target,并预留输出 loss 的 UB 空间。
  4. Tiling:下发 block 数、每核起始 offset、每核元素数、tile 长度及尾块长度。该算子不依赖属性分支,首版不需要复杂 tiling key。
  5. 接口:提供 aclnnHingeLossGetWorkspaceSize / aclnnHingeLoss 两段式 ACLNN 接口;无跨核归约时不需要额外 workspace。

kernel 侧设计

算子分为 Init 和 Process 两个阶段。

  1. Init 阶段:
    • 从 tiling data 读取每核数据量、tile 长度和 GM 偏移;
    • 初始化 predict、target 输入队列和 loss 输出队列;
    • 初始化常数 1 和 0,以及低精度计算需要的转换 buffer。
  2. Process 阶段:对每个 tile 执行以下步骤:
    • CopyIn:将 predict、target 从 Global Memory 搬入 UB;
    • Compute:执行 Mul 得到 target * predict,执行 Sub 得到 1 - target * predict,随后通过 Max 将负值截断为 0;
    • CopyOut:将逐元素 loss 从 UB 写回 Global Memory。
  3. 尾块处理:对不足一个 tile 的元素使用有效长度/mask 处理,保证非 32B 对齐的数据不越界。
  4. 数据类型:float16、bfloat16 输入在需要时转 float 进行中间计算,输出再转换为目标 dtype,确保精度与性能平衡。
likedislike
石向阳石向阳成员
7月23日 修改标题为 “[Requirement|需求建议]: HingeLoss算子AscendC实现贡献”,原标题为“[Requirement|需求建议]: HingeLoss反向传播算子AscendC实现贡献”
yuning_chenyuning_chen成员
7月24日 将 yolic 设为负责人
yuning_chen
yuning_chen成员
7月24日 评论:

收到需求建议,欢迎您参加 ops-nn sig 例会评审并申报相关议题,最近的例会议题申报及会议时间可见:https://etherpad-cann.meeting.osinfra.cn/p/sig-ops-nn

likedislike
石向阳石向阳成员
7月24日 关联了pull request:feat: add experimental HingeLoss operator
CANN-robotCANN-robot成员
7月28日 关闭了 issue
CANN-robotCANN-robot成员
7月28日 添加了label:resolved