SiLU 计算这步骤,为啥会x1要做了sigmoid之后还要乘以x1? 这个和swiglu公式好像不一样。
另外,我们ascendc的算子本来就有swi_glu算子,可以看下这个算子目录,也在activation目录下。


SiLU 计算这步骤,为啥会x1要做了sigmoid之后还要乘以x1? 这个和swiglu公式好像不一样。
另外,我们ascendc的算子本来就有swi_glu算子,可以看下这个算子目录,也在activation目录下。
1、这个x1是因为公式上是这样计算的,可以在运算上简化
2、silu_mul和swi_glu计算公式相近,但是实现方式上存在区别:
silu_mul算子的实现是通过调用Sigmoid指令实现,且针对β=1的默认情况处理,Tiling策略未1D切分,针对小Shape有优化,流水线管理使用显式Ping-Pong,
swi_glu则是通过自定义Exp+Add+Div实现Sigmoid,且允许β设置,Tiling策略属于2D通用切分,流水线管理使用TQue机制队列,
两者在实现方式、通用性和运算策略上有均有区别


SiLU 计算这步骤,为啥会x1要做了sigmoid之后还要乘以x1? 这个和swiglu公式好像不一样。
另外,我们ascendc的算子本来就有swi_glu算子,可以看下这个算子目录,也在activation目录下。1、这个x1是因为公式上是这样计算的,可以在运算上简化
2、silu_mul和swi_glu计算公式相近,但是实现方式上存在区别:
silu_mul算子的实现是通过调用Sigmoid指令实现,且针对β=1的默认情况处理,Tiling策略未1D切分,针对小Shape有优化,流水线管理使用显式Ping-Pong,
swi_glu则是通过自定义Exp+Add+Div实现Sigmoid,且允许β设置,Tiling策略属于2D通用切分,流水线管理使用TQue机制队列,
两者在实现方式、通用性和运算策略上有均有区别
如果silu_mul在公式实现上是swi_glu在β=1的特殊情况,是否应该在swi_glu里面实现β=1的场景优化实现就行,而不需要新增一个算子来实现特殊场景?


SiLU 计算这步骤,为啥会x1要做了sigmoid之后还要乘以x1? 这个和swiglu公式好像不一样。
另外,我们ascendc的算子本来就有swi_glu算子,可以看下这个算子目录,也在activation目录下。1、这个x1是因为公式上是这样计算的,可以在运算上简化
2、silu_mul和swi_glu计算公式相近,但是实现方式上存在区别:
silu_mul算子的实现是通过调用Sigmoid指令实现,且针对β=1的默认情况处理,Tiling策略未1D切分,针对小Shape有优化,流水线管理使用显式Ping-Pong,
swi_glu则是通过自定义Exp+Add+Div实现Sigmoid,且允许β设置,Tiling策略属于2D通用切分,流水线管理使用TQue机制队列,
两者在实现方式、通用性和运算策略上有均有区别如果silu_mul在公式实现上是swi_glu在β=1的特殊情况,是否应该在swi_glu里面实现β=1的场景优化实现就行,而不需要新增一个算子来实现特殊场景?
silu_mul 能够直接调用硬件原生的 Sigmoid 指令并配合显式 Ping-Pong 调度,是针对高频场景的特化;而 swi_glu 为了通用性,退化为 Exp+Add 组合指令软实现并依赖 TQue 机制,两者实现指令和方式上有明显不同,不适合合并为一个算子。


Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.
Backgroud(背景信息)
SiluMul 算子是一种将 SiLU 激活函数与乘法运算(Mul)进行融合的高效算子。在深度学习领域,特别是 LLaMA 等大语言模型(LLM)中,SiluMul 是实现 SwiGLU(Gated Linear Units)结构的核心组件。该算子能够通过内核融合减少内存搬运次数,显著提升推理性能。本项目实现了 SiluMul 算子的 AscendC 版本,以替代原有 TBE 算子在昇腾硬件上的适配。
Origin(信息来源)
联通(广东)产业互联网有限公司
Benefit / Necessity (价值/作用)
使用 AscendC 对 TBE 实现的 SiluMul 算子进行重构,实现了 AscendC 实现的 SiluMul 算子对 Atlas 200/500 A2 推理产品和 Atlas 800I/T A2 硬件的适配。
支持设备:
Atlas A3 训练系列产品/Atlas A3 推理系列产品
Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件
Design(设计方案)
目前支持的场景:
float32、float16、bfloat16host 侧设计:
tiling 策略:
kernel 侧设计:
进行 Init 和 Process 两个阶段,其中 Process 包括数据搬入(CopyIn)、计算(Compute)、搬出(CopyOut)三个阶段。
2.1 初始化(Init)
获取 Tiling 参数:包括
batchSize、lastDimSize、needCoreNum和PPMaxCalNum。计算输入数据最后维度的一半d = lastDimSize / 2。初始化全局内存映射:设置
inputGm和outputGm的全局缓冲地址。初始化 UB 缓冲区:通过
pipe.InitBuffer初始化ubTBuf,并获取tmpTensor。确定核索引:获取
blockIdx,若当前核索引大于等于needCoreNumber,则停止处理。2.2 计算流程(Compute)
重解释指针:将输入的本地张量
x1Tensor和x2Tensor重解释为 float 类型 (x1TensorFp32,x2TensorFp32)。类型转换(分支处理):
若数据类型为
bfloat16_t或half,调用Cast将x1TensorFp32和x2TensorFp32从原类型转换为 float 类型存储于临时 Tensor 中,并插入PipeBarrier同步。核心计算(SiLU Mul 逻辑):
Sigmoid(tempResTensor, x1TensorFp32)。Mul(x1TensorFp32, x1TensorFp32, tempResTensor),实现 x1=x1×Sigmoid(x1)。Mul(x1TensorFp32, x1TensorFp32, x2TensorFp32),实现 Result=SiLU(x1)×x2。插入
PipeBarrier确保向量计算指令完成。2.3 数据搬入(CopyIn)与搬出(CopyOut)
pingPongFlag计算偏移并进行同步等待,通过DataCopyPad将 GM 中的输入数据切分搬入 UB 缓冲区,并设置同步信号告知计算单元数据就绪。DataCopyPad将结果从 UB 搬运至 GM 对应位置,并释放缓冲区供下一轮循环使用。2.4 流程调度(Process)