Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.
SwigluGatedMlp 算子是一种将两次 MatMul 与 SwiGLU 激活进行组合的门控 MLP 算子。在深度学习领域,特别是 LLaMA 等大语言模型(LLM)中,SwiGLU 是 FFN/MLP 结构的核心组件,其计算流程为 gate_up = MatMul(x, gate_up_weight),再执行 hidden = silu(gate) * up,最后通过 MatMul(hidden, down_weight) 得到输出。本项目对 timers1 中 SwigluGatedMlp 算子进行 AscendC 适配和优化,提升其在昇腾硬件上的执行效率。
gate_up = MatMul(x, gate_up_weight)
hidden = silu(gate) * up
MatMul(hidden, down_weight)
联通(广东)产业互联网有限公司
使用 AscendC 对 timers1 中 SwigluGatedMlp 算子进行优化,实现 MatMul + SwiGLU + MatMul 计算流程在昇腾硬件上的适配。该实现通过 ACLNN 接口组织执行流程,中间 SwiGLU 阶段使用 AscendC 自定义 Kernel 完成,可减少框架侧拆分调度开销,提升大模型 MLP 模块推理性能。 支持设备: Atlas A3 训练系列产品/Atlas A3 推理系列产品 Atlas A2 训练系列产品/Atlas A2 推理系列产品
MatMul + SwiGLU + MatMul
目前支持的场景:
float32
float16
bfloat16
gate_up_weight
intermediateSize = gateUpSize / 2
down_weight
outSize
totalRows * intermediateSize
mm1BaseM/N/K
mm2BaseM/N/K
swiBaseRows
swiBaseCols
SwigluGatedMlpTilingData
totalRows
hiddenSize
gateUpSize
intermediateSize
baseRowsPerCore
tailRows
tileRows
1101/1102/1103
2101/2102/2103/2104
3101/3102/3103
x
gate_up_weight.shape[1]
down_weight.shape[0]
gate_up_weight.shape[1] / 2
进行 Init 和 Process 两个阶段,其中 SwiGLU 阶段的 Process 包括数据搬入(CopyIn)、计算(Compute)、搬出(CopyOut)三个阶段。
获取 Tiling 参数:包括 totalRows、hiddenSize、gateUpSize、intermediateSize、outSize、usedCoreNum、swiBaseRows 和 swiBaseCols。 初始化全局内存映射:MatMul 阶段设置 xGm、weightGm、yGm;SwiGLU 阶段设置 gateUpGm 和 hiddenGm。 初始化 UB 缓冲区:通过 pipe.InitBuffer 初始化 gate、up、out 队列和 float 临时计算缓冲区。 确定核索引:获取 blockIdx,根据当前核编号和总 tile 数分配本核处理的数据块。
usedCoreNum
xGm
weightGm
yGm
gateUpGm
hiddenGm
pipe.InitBuffer
blockIdx
将 gateUp 按最后一维拆分为 gate 和 up 两部分。 类型转换(分支处理): 若数据类型为 bfloat16_t 或 half,调用 Cast 将 gate 和 up 转换为 float 类型存储于临时 Tensor 中,并插入 PipeBarrier 同步。 核心计算(SwiGLU 逻辑):
gateUp
bfloat16_t
half
Cast
PipeBarrier
Sigmoid(tmp, gateFp32)
Mul(gateFp32, gateFp32, tmp)
gate = gate * Sigmoid(gate)
Mul(tmp, gateFp32, upFp32)
hidden = SiLU(gate) * up
rowStart
colStart
DataCopyPad
/assign
Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.
Backgroud(背景信息)
SwigluGatedMlp 算子是一种将两次 MatMul 与 SwiGLU 激活进行组合的门控 MLP 算子。在深度学习领域,特别是 LLaMA 等大语言模型(LLM)中,SwiGLU 是 FFN/MLP 结构的核心组件,其计算流程为
gate_up = MatMul(x, gate_up_weight),再执行hidden = silu(gate) * up,最后通过MatMul(hidden, down_weight)得到输出。本项目对 timers1 中 SwigluGatedMlp 算子进行 AscendC 适配和优化,提升其在昇腾硬件上的执行效率。Origin(信息来源)
联通(广东)产业互联网有限公司
Benefit / Necessity (价值/作用)
使用 AscendC 对 timers1 中 SwigluGatedMlp 算子进行优化,实现
MatMul + SwiGLU + MatMul计算流程在昇腾硬件上的适配。该实现通过 ACLNN 接口组织执行流程,中间 SwiGLU 阶段使用 AscendC 自定义 Kernel 完成,可减少框架侧拆分调度开销,提升大模型 MLP 模块推理性能。支持设备:
Atlas A3 训练系列产品/Atlas A3 推理系列产品
Atlas A2 训练系列产品/Atlas A2 推理系列产品
Design(设计方案)
目前支持的场景:
float32、float16、bfloat16host 侧设计:
tiling 策略:
gate_up_weight第二维计算intermediateSize = gateUpSize / 2,并结合down_weight获取输出维度outSize。totalRows * intermediateSize确定使用核数。mm1BaseM/N/K和mm2BaseM/N/K,用于控制矩阵乘分块。swiBaseRows、swiBaseCols。SwigluGatedMlpTilingData中记录数据类型、执行阶段、动态 shape 标识、使用核数、数据类型大小等信息。totalRows、hiddenSize、gateUpSize、intermediateSize、outSize。baseRowsPerCore、tailRows、tileRows、swiBaseRows、swiBaseCols。1101/1102/1103,Float 对应2101/2102/2103/2104,Bfloat16 对应3101/3102/3103。x输入维度是否小于 2,若满足则报错。gate_up_weight和down_weight是否为 2D,若不满足则报错。gate_up_weight.shape[1]是否为偶数,down_weight.shape[0]是否等于gate_up_weight.shape[1] / 2,若不满足则报错。x和down_weight匹配。kernel 侧设计:
进行 Init 和 Process 两个阶段,其中 SwiGLU 阶段的 Process 包括数据搬入(CopyIn)、计算(Compute)、搬出(CopyOut)三个阶段。
2.1 初始化(Init)
获取 Tiling 参数:包括
totalRows、hiddenSize、gateUpSize、intermediateSize、outSize、usedCoreNum、swiBaseRows和swiBaseCols。初始化全局内存映射:MatMul 阶段设置
xGm、weightGm、yGm;SwiGLU 阶段设置gateUpGm和hiddenGm。初始化 UB 缓冲区:通过
pipe.InitBuffer初始化 gate、up、out 队列和 float 临时计算缓冲区。确定核索引:获取
blockIdx,根据当前核编号和总 tile 数分配本核处理的数据块。2.2 计算流程(Compute)
将
gateUp按最后一维拆分为 gate 和 up 两部分。类型转换(分支处理):
若数据类型为
bfloat16_t或half,调用Cast将 gate 和 up 转换为 float 类型存储于临时 Tensor 中,并插入PipeBarrier同步。核心计算(SwiGLU 逻辑):
Sigmoid(tmp, gateFp32)。Mul(gateFp32, gateFp32, tmp),实现gate = gate * Sigmoid(gate)。Mul(tmp, gateFp32, upFp32),实现hidden = SiLU(gate) * up。插入
PipeBarrier确保向量计算指令完成。2.3 数据搬入(CopyIn)与搬出(CopyOut)
rowStart、colStart计算偏移,通过DataCopyPad将 GM 中的 gate 和 up 数据切分搬入 UB,并对尾块进行对齐填充。DataCopyPad将 hidden 结果从 UB 搬运至 GM 对应位置,并释放缓冲区供下一轮循环使用。2.4 流程调度(Process)