文件最后提交记录最后更新时间
2 个月前
14 天前
14 天前
14 天前
14 天前
14 天前
7 个月前
3 个月前
README

SwiGluQuant

产品支持情况

产品 是否支持
Ascend 950PR/Ascend 950DT
Atlas A3 训练系列产品/Atlas A3 推理系列产品
Atlas A2 训练系列产品/Atlas A2 推理系列产品
Atlas 200I/500 A2 推理产品 ×
Atlas 推理系列产品 ×
Atlas 训练系列产品 ×
Kirin X90 处理器系列产品
Kirin 9030 处理器系列产品

功能说明

  • 算子功能:在SwiGlu激活函数后添加quant操作,实现输入x的SwiGluQuant计算,支持int8或int4量化输出。

  • 算子功能差异点说明:相比于aclnnSwiGluQuant接口,aclnnSwiGluQuantV2新增支持groupIndexOptional传入cumsum模式和count模式,通过groupListType控制不同的模式;新增支持非MoE(groupIndexOptional传空)的场景;新增支持int8或int4量化输出yOut,通过dstType控制不同的量化输出数据类型。

  • 算子支持范围:当前SwiGluQuant支持MoE场景(传入groupIndexOptional)和非MoE场景(groupIndexOptional传空),SwiGluQuant的输入x和group_index来自于GroupedMatMul算子和MoeInitRouting的输出,通过group_index入参实现MoE分组动态量化、静态per_tensor量化、静态per_channel量化功能。

  • MoE场景动态量化计算公式:

    Act=SwiGLU(x)=Swish(A)∗BYtmp0=Act[0 ⁣:g[0], ⁣:]∗smooth_scales[0 ⁣:g[0], ⁣:],i=0Ytmpi=Act[g[i] ⁣:g[i+1], ⁣:]∗smooth_scales[g[i] ⁣:g[i+1], ⁣:],i∈(0,G)∩Zscale=row_max(abs(Ytmp))/dstTypeScale Act = SwiGLU(x) = Swish(A)*B \\ Y_{tmp}^0 = Act[0\colon g[0],\colon] * smooth\_scales[0\colon g[0],\colon], i=0 \\ Y_{tmp}^i = Act[g[i]\colon g[i+1], \colon] * smooth\_scales[g[i]\colon g[i+1], \colon], i \in (0, G) \cap \mathbb{Z}\\ scale=row\_max(abs(Y_{tmp}))/dstTypeScale

    Y=Cast(Mul(Ytmp,Scale)) Y = Cast(Mul(Y_{tmp}, Scale))

    其中,A表示输入x的前半部分,B表示输入x的后半部分,g表示group_index,G为group_index的分组数量。int8量化时,dstTypeScale=127dstTypeScale = 127(127是int8的最大值);int4量化时,dstTypeScale=7dstTypeScale = 7(7是int4的最大值)。

  • MoE场景静态量化计算公式:

    Act=SwiGLU(x)=Swish(A)∗BYtmp0=Act(0 ⁣:g[0], ⁣:)∗smooth_scales[0 ⁣:g[0], ⁣:]+offsets[0 ⁣:g[0], ⁣:],i=0Ytmpi=Act[g[i] ⁣:g[i+1], ⁣:]∗smooth_scales[g[i] ⁣:g[i+1], ⁣:]+offsets[g[i] ⁣:g[i+1], ⁣:],i∈(0,G)∩Z Act = SwiGLU(x) = Swish(A)*B \\ Y_{tmp}^0 = Act(0\colon g[0],\colon) * smooth\_scales[0\colon g[0],\colon] + offsets[0\colon g[0],\colon], i=0 \\ Y_{tmp}^i = Act[g[i]\colon g[i+1], \colon] * smooth\_scales[g[i]\colon g[i+1], \colon] + offsets[g[i]\colon g[i+1], \colon], i \in (0, G) \cap \mathbb{Z}\\

    Y=Cast(Ytmp) Y = Cast(Y_{tmp})

    其中,A表示输入x的前半部分,B表示输入x的后半部分,g表示group_index,G为group_index的分组数量。

  • 非MoE场景(groupIndexOptional传空)动态量化计算公式:

    Act=SwiGLU(x)=Swish(A)∗BYtmp=Act∗smooth_scales(0, ⁣:)scale=row_max(abs(Ytmp))/dstTypeScale Act = SwiGLU(x) = Swish(A)*B \\ Y_{tmp} = Act* smooth\_scales(0,\colon)\\ scale=row\_max(abs(Y_{tmp}))/dstTypeScale

    Y=Cast(Mul(Ytmp,Scale)) Y = Cast(Mul(Y_{tmp}, Scale))

    其中,A表示输入x的前半部分,B表示输入x的后半部分。int8量化时,dstTypeScale=127dstTypeScale = 127(127是int8的最大值);int4量化时,dstTypeScale=7dstTypeScale = 7(7是int4的最大值)。

  • 非MoE场景(groupIndexOptional传空)静态量化计算公式:

    Act=SwiGLU(x)=Swish(A)∗BYtmp=Act∗smooth_scales(0, ⁣:)+offsets(0, ⁣:) Act = SwiGLU(x) = Swish(A)*B \\ Y_{tmp} = Act * smooth\_scales(0,\colon) + offsets(0,\colon) \\

    Y=Cast(Ytmp) Y = Cast(Y_{tmp})

    其中,A表示输入x的前半部分,B表示输入x的后半部分。

参数说明

参数名 输入/输出/属性 描述 数据类型 数据格式
x 输入 公式中的输入x。 FLOAT16、BFLOAT16、FLOAT ND
smoothScalesOptional 输入 公式中的smooth_scales变量。 FLOAT ND
offsetsOptional 输入 公式中的输入offsets。 FLOAT ND
groupIndexOptional 输入 公式中的group_index变量。 INT32 ND
activateLeft 属性
  • 表示左矩阵是否参与运算。
  • 用户必须传参。
BOOL -
quantModeOptional 属性
  • 用户必须传参。
  • "static"表示静态量化、"dynamic"表示动态量化、"dynamic_msd"表示动态MSD量化。当前仅支持"dynamic"动态量化,"static"静态量化。静态量化仅支持per_tensor量化和per_channel量化。
STRING -
groupListType 属性
  • 用户必须传参。
  • 0表示cumsum模式、1表示count模式。当前仅支持0 cumsum模式,1 count模式。
INT64_T -
dstType 属性
  • 用户必须传参。
  • 2表示yOut为int8量化输出、29表示yOut为int4量化输出。当前仅支持输入2和29,默认值是2。
INT64_T -
yOut 输出 公式中的y。 INT8、INT4 ND
scaleOut 输出 公式中的scale。 FLOAT ND
  • Kirin X90/Kirin 9030 处理器系列产品: x数据类型不支持BFLOAT16;y数据类型不支持INT4。

约束说明

调用说明

调用方式 调用样例 说明
aclnn调用 test_aclnn_swi_glu_quant 通过aclnnSwiGluQuant接口方式调用SwiGluQuant算子。
aclnn调用 test_aclnn_swi_glu_quant_v2 通过aclnnSwiGluQuantV2接口方式调用SwiGluQuant算子。
图模式调用 - 通过算子IR构图方式调用SwiGluQuant算子。