已关闭
[Requirement|需求建议]: Mish算子AscendC实现贡献 #175
wenyidylan创建于  2025年11月20日关闭于  4月25日
wenyidylan
2025年11月20日 创建

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

Backgroud(背景信息)

使用AscendC对TBE实现的Mish算子进行重构,实现了AscendC实现的Mish算子对Atlas A2 训练系列产品/Atlas 800I A2推理产品硬件的适配。

Origin(信息来源)

外部贡献

Benefit / Necessity (价值/作用)

Mish算子的主要功能是计算给定数值的Mish激活函数值。Mish与其他常用激活函数相比,如ReLU和Swish,它提供了更平滑的输出,这有助于改善模型的学习和泛化。此外,Mish在处理负值时不会完全抑制梯度,这有助于避免梯度消失的问题,从而提高了模型的训练稳定性。Mish算子能够高效地处理批量数值的Mish计算,支持浮点数的输入。实现了Mish算子的AscendC实现,替代原有TBE算子在昇腾硬件上的适配。
支持设备:
Atlas A2 训练系列产品/Atlas 800I A2推理产品

Design(设计方案)

host侧设计方案

算子计算过程不涉及数据的维度信息,故在host侧将数据视为一维向量,仅考虑数据个数,不考虑数据维度信息。
任务均分:coreNum 根据输入长度和块大小动态调整,确保每个核心处理的数据块数均匀。
批量搬运:tileBlockNum 和 tileDataNum 计算单次搬运的数据量,通过 finalSmallTileNum 和 finalBigTileNum 确定小核/大核的搬运次数,将多次搬运合并为批量操作,减少冗余开销。尾块的处理逻辑确保不完整块也能被合并到计算流程中,避免数据碎片。

分核策略

优先使用满核的原则。
如果核间能均分,可视作无大小核区分,大核小核数据块一致;
如果核间不能均分,需要将余出的数据块分配到前几个核上。
输入数据大小计算:通过GetInputShape和GetDataTypeLength函数获取输入数据的大小和类型长度,计算出输入数据的总字节数。
UB内存大小和核心数量获取:通过平台信息获取UB内存大小和核心数量,并根据这些信息调整核心数量。

数据分块和内存优化策略

充分使用UB空间的原则。
需要考虑不同硬件的UB大小不同、是否开启double buffer、kernel侧API实现过程中是否需要临时数据的储存,综合考虑单核内切分的大小。
UB内存大小获取:通过GetCoreMemSize函数获取UB内存的大小,用于后续的数据切分计算。
Tile块计算:根据UB内存大小和预定义的BLOCK_SIZE及BUFFER_NUM和不同类型下的ubDataNum,计算出每个Tile块的数据数量。
数据切分:将输入数据按照计算出的Tile块大小进行切分,计算出每个core需要处理的数据块数量和最后一个block的剩余数据量。
设置切分参数:将计算出的切分参数(如每个core的数据量、Tile块大小等)设置到MishTilingData对象中。
这些策略确保了数据在多个核心之间的均匀分布,并且在单个核心内进行了合理的切分,以提高并行处理的效率。

tilingkey规划策略

不进行tilingkey划分,在kernel侧利用输入数据的类型来走不同的分支。

kernel侧设计方案

进行Init和Process两个阶段,其中Process包括数据搬入(CopyIn)、计算(Compute)、搬出(CopyOut)三个阶段。
CopyIn、Compute、CopyOut阶段都是以连续的数据切片(tiling块)为单位处理数据。根据每个vector核心的索引号计算数据切片的位置。
依照TBE实现,在HIGH_PRECISION模式将float16数据精度转换为float32计算。
bfloat16数据类型转为float32数据类型进行计算。
把原TBE算子中的tbe.vmul、tbe.vmuls、tbe.vadds、tbe.vrec、tbe.vexp、tbe.cast_to指令替换为AscendC的Mul、Muls、Adds、Reciprocal、Exp、Cast等矢量指令。
使用AscendC的Compare和Select指令替换原TBE算子的tbe.vcmp和tbe.vsel指令,实现数据的条件判断和数据选取。
按照TBE算子的计算逻辑完成Mish计算。

likedislike
张喻翔
张喻翔
2025年11月20日 评论:

收到反馈,您可以贡献对应的ascendc算子

likedislike
zhangxin_hw成员
2025年11月24日 评论:

经sig组织评审,您的方案已通过,请关联相关贡献的代码

likedislike
Wwenyidylan
2025年11月27日 关联了pull request:【社区任务】Mish算子开发-算子提交
wenyidylan
2025年12月4日 评论:
Wwenyidylan
2025年12月19日 关联了pull request:【CANN训练营第二季社区任务】Mish算子开发-算子提交
Wwenyidylan
2025年12月24日 关联了pull request:【CANN训练营第二季社区任务】Mish算子开发-算子提交
Cchenqi317成员
2025年12月25日 将 zhajianqing123 设为负责人
Cchenqi317成员
1月8日 issue状态由 进行中 改变为 已确认
CANN-robotCANN-robot成员
1月8日 添加了label:Accepted
Cchenqi317成员
4月9日 将 fullt 设为负责人
Cchenqi317成员
4月13日 移除了负责人 zhajianqing123
Cchenqi317成员
4月16日 将 liujie12345678 设为负责人
Cchenqi317成员
4月24日 移除了负责人 fullt
Lliujie12345678成员
4月25日 issue状态由 已确认 改变为 已完成
Lliujie12345678成员
4月25日 关闭了 issue