文件最后提交记录最后更新时间
23 小时前
11 天前
1 天前
8 天前
26 天前
8 天前
5 个月前
23 小时前
README

SwigluMxQuant

产品支持情况

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

功能说明

  • 算子功能:融合算子,实现SwiGLU激活函数与动态块量化的组合计算。先对输入计算SwiGLU激活函数,然后对结果进行基于块的动态量化,输出低精度的FP4/FP8张量和对应的缩放因子。

  • 计算公式:

    阶段1:SwiGLU激活函数

    gate, hidden = split(x, dim=dim)

    swish = sigmoid(gate) * gate

    act = swish * hidden

    阶段2:动态块量化

    沿axis维度按blocksize=32分块进行动态量化。scale_alg=0(OCP)时,每个块内的元素 {V_i} 按以下公式量化:

    shared_exp = floor(log2(max_i(|V_i|))) - emax

    mxscale = 2^shared_exp

    y_i = cast_to_dst_type(V_i / mxscale, round_mode)

    其中,emax为目标数据类型最大正则数的指数位,取值如下:

    数据类型 emax
    FLOAT4_E2M1 2
    FLOAT4_E1M2 0
    FLOAT8_E4M3FN 8
    FLOAT8_E5M2 15

    scale_alg=1(cuBLAS,仅FP8类型)时采用块缩放因子推导,公式详见aclnnSwigluMxQuant

参数说明

参数名 输入/输出/属性 描述 数据类型 数据格式
x 输入 输入张量,在activate_dim指定的维度上的尺寸必须是2的倍数。 FLOAT16、BFLOAT16 ND
group_index 可选输入 shape必须为1维,且shape[0]大于0且小于等于256;data的每个值必须为大于等于0的整数,且所有值的和必须小于等于需要量化的x的总行数。 INT32、INT64 ND
y 输出 量化后的输出张量,形状与x相同,activate_dim维度为x的一半。 FLOAT4_E2M1、FLOAT4_E1M2、FLOAT8_E4M3FN、FLOAT8_E5M2 ND
mxscale 输出 每个量化块(32个元素一组)的缩放因子。shape在axis轴上为y对应轴除以32向上取整后按偶数对齐,最后一维固定为2,存放相邻两个量化块的scale;当axis=-2且group_index存在时,shape在axis轴上为y对应轴的值整除64再加group_num。 FLOAT8_E8M0 ND
activate_dim 属性 SwiGLU的分割维度,取值范围为[-1, -2, xDim-2, xDim-1](xDim为输入x的维度,即最后两维)。 INT64 -
activate_left 属性 表示对输入的前半部分或后半部分做SwiGLU激活,false时激活后半部分;swiglu_mode=1时该参数不生效。 BOOL -
swiglu_mode 属性 SwiGLU计算模式:0=传统SwiGLU,1=奇偶交错变体,2=前后分半clamp变体,3=前后分半sigmoid-clamp变体,取值范围[0, 3]。 INT64 -
clamp_limit 属性 变体SwiGLU(swiglu_mode=1/2/3)的clamp门限,需大于0。 FLOAT -
glu_alpha 属性 变体SwiGLU(swiglu_mode=1/2)的sigmoid缩放系数。 FLOAT -
glu_bias 属性 变体SwiGLU(swiglu_mode=1/2)的线性部分偏置。 FLOAT -
group_mode 属性 group_index存在时生效,0=count模式,1=cumsum模式,当前仅支持0。 INT64 -
axis 属性 量化轴,沿此维度进行分块量化,取值范围为[-1, -2, xDim-2, xDim-1](xDim为输入x的维度,即最后两维)。 INT64 -
dst_type 属性 目标量化类型:40=FP4_E2M1, 41=FP4_E1M2, 36=FP8_E4M3FN, 35=FP8_E5M2。 INT64 -
round_mode 属性 舍入模式,用于量化时的类型转换,取值为"rint"、"floor"、"round"。 STRING -
scale_alg 属性 缩放算法:0=OCP,1=cuBLAS,2=RNE(预留),当前仅支持0和1。 INT64 -
max_dtype_value 属性 预留参数,当前版本未生效。 FLOAT -

约束说明

  • 输入x支持2-7维张量,在activate_dim指定维度上的尺寸必须能被2整除。
  • activate_dim和axis必须取输入x的最后两维,取值范围为[-1, -2, xDim-2, xDim-1](xDim为输入x的维度)。
  • activate_dim为-2时,swiglu_mode必须为0。
  • swiglu_mode为2或3时,axis必须为-1。
  • 当activate_dim = -2 或者axis = -2, group_index存在时,输入x必须为2维。
  • 当dst_type为FP4类型时,输出shape的最后一维必须能被2整除。
  • 当dst_type为FP4类型时,scale_alg必须为0。
  • group_index存在时,必须为1维,且shape[0]大于0且小于等于256;data的每个值必须为大于等于0的整数,且所有值的和必须小于等于需要量化的x的总行数。
  • FP8输出类型仅支持"rint"舍入模式。
  • 不支持空Tensor:输入x、可选输入group_index及输出y、mxscale的shape中任一维度为0(元素数为0)时,算子校验失败并报错。
  • 输入x必须为2-7维,不支持rank=0标量Tensor。
  • 输出y/mxscale由调用方按接口推导的形状分配内存,算子将量化结果完整写回输出Tensor;超出group_index所有元素之和覆盖范围的输出部分不清理,为垃圾数据。
  • 输入与输出的内存空间不能重叠,不支持原地修改(inplace)场景。
  • 算子执行过程中不修改任何输入数据。

调用说明

调用方式 调用样例 说明
aclnn调用 test_aclnn_swiglu_mx_quant 通过aclnnSwigluMxQuant接口方式调用SwigluMxQuant算子。