CANN反量化SwiGLU量化算子
2026/5/9 16:21:08 网站建设 项目流程

custom-npu_dequant_swiglu_clamp_quant

【免费下载链接】cann-recipes-infer本项目针对LLM与多模态模型推理业务中的典型模型、加速算法,提供基于CANN平台的优化样例项目地址: https://gitcode.com/cann/cann-recipes-infer

产品支持情况

产品是否支持
Atlas A3 推理系列产品

功能说明

在Swish门控线性单元激活函数前后添加反量化(dequant)和量化(quant)操作,实现输入x的DequantSwigluClampQuant计算。支持标准SwiGLU模式和变体SwiGLU模式(带clamp截断)。

计算公式

swiglu_mode=0(标准模式):

$$ dequantOut = Dequant(x, weightScale, activationScale, bias) $$

$$ swigluOut = SwiGLU(dequantOut) = Swish(A) * B $$

$$ out = Quant(swigluOut, quantScale, quantOffset) $$

其中,A表示dequantOut的前半部分,B表示dequantOut的后半部分。当activate_left=True时,A部分做Swish激活;当activate_left=False时,B部分做Swish激活。

swiglu_mode=1(变体模式):

$$ dequantOut = Dequant(x, weightScale, activationScale, bias) $$

将dequantOut按最后一维切分为前半部分和后半部分,根据activate_left决定激活部分:

  • 当activate_left=True时:

    • A(前半部分):$A = A.clamp(min=None, max=clamp_limit)$
    • B(后半部分):$B = B.clamp(min=-clamp_limit, max=clamp_limit)$
    • $swigluOut = A * sigmoid(glu_alpha * A) * (B + glu_bias)$
  • 当activate_left=False时:

    • A(前半部分):$A = A.clamp(min=-clamp_limit, max=clamp_limit)$
    • B(后半部分):$B = B.clamp(min=None, max=clamp_limit)$
    • $swigluOut = B * sigmoid(glu_alpha * B) * (A + glu_bias)$

$$ out = Quant(swigluOut, quantScale, quantOffset) $$

函数原型

custom.npu_dequant_swiglu_clamp_quant(Tensor x, *, Tensor? weight_scale=None, Tensor? activation_scale=None, Tensor? bias=None, Tensor? quant_scale=None, Tensor? quant_offset=None, Tensor? group_index=None, bool activate_left=False, int quant_mode=0, int? dst_type=None, int? round_mode=None, int? activate_dim=None, int swiglu_mode=0, float clamp_limit=7.0, float glu_alpha=1.702, float glu_bias=1.0) -> (Tensor, Tensor)

参数说明

说明:

  • TokensNum、H参数维度含义:TokensNum表示传输的Token数,取值是自然数,H表示嵌入向量的长度,取值>0。
  • xTensor):必选参数,输入tensor,待处理的数据。不支持非连续,数据格式支持ND,数据类型支持int32float16bfloat16,shape为[TokensNum, H]。

  • *:代表其之前的参数是位置相关的,必须按照顺序输入,属于必选参数;其之后的参数是键值对赋值,与位置无关,属于可选参数(不传入会使用默认值)。

  • weight_scaleTensor,可选):权重反量化scale。当输入x为int32类型时必选。不支持非连续,数据格式支持ND,数据类型支持float32,shape为[H]或[groupNum, H]。

  • activation_scaleTensor,可选):激活反量化scale。当输入x为int32类型时可选。不支持非连续,数据格式支持ND,数据类型支持float32,shape为[TokensNum, 1]。

  • biasTensor,可选):偏置项。不支持非连续,数据格式支持ND,数据类型支持float32float16bfloat16int32,shape为[H]或[groupNum, H]。

  • quant_scaleTensor,可选):量化scale。不支持非连续,数据格式支持ND,数据类型支持float32float16,shape为[H/2]或[groupNum, H/2]。

  • quant_offsetTensor,可选):量化offset。不支持非连续,数据格式支持ND,数据类型支持float32,shape为[H/2]或[groupNum, H/2]。

  • group_indexTensor,可选):MoE分组索引,用于指定分组处理。不支持非连续,数据格式支持ND,数据类型支持int64,shape为[groupNum],表示每个分组的token数量。

  • activate_leftbool,可选):表示是否对输入的前半部分做SwiGLU激活。默认为False,表示对后半部分做激活。

  • quant_modeint,可选):量化模式。0表示静态量化,1表示动态量化。默认为0。

  • dst_typeint,可选):输出数据类型编码。默认为1。

    • 1:int8
    • 23:float8_e5m2
    • 24:float8_e4m3fn
    • 296:float4_e2m1
    • 297:float4_e1m2
  • round_modeint,可选):舍入模式编码。默认为0。

    • 0:rint
    • 1:round
    • 2:floor
    • 3:ceil
    • 4:trunc
  • activate_dimint,可选):进行SwiGLU切分的维度。默认为-1(最后一维)。

  • swiglu_modeint,可选):SwiGLU计算模式。默认为0。

    • 0:标准SwiGLU模式(SiLU激活)
    • 1:变体SwiGLU模式(带clamp截断)
  • clamp_limitfloat,可选):变体SwiGLU模式下的截断阈值。默认为7.0。仅在swiglu_mode=1时生效。

  • glu_alphafloat,可选):变体SwiGLU模式下的sigmoid参数。默认为1.702。仅在swiglu_mode=1时生效。

  • glu_biasfloat,可选):变体SwiGLU模式下的偏置参数。默认为1.0。仅在swiglu_mode=1时生效。

返回值说明

  • yTensor):输出tensor,量化后的结果。不支持非连续,数据格式支持ND,数据类型由dst_type参数决定,shape为[TokensNum, H/2]。

  • scaleTensor):输出tensor,量化scale。不支持非连续,数据格式支持ND,数据类型支持float32。当quant_mode=0(静态量化)时输出固定值;当quant_mode=1(动态量化)时输出动态计算的scale,shape为[TokensNum]。

约束说明

  • 输入约束

    • x的activate_dim维度必须是2的倍数。
    • x的维数必须大于1维。
    • 当输入x为int32类型时,weight_scale必须输入。
    • 当输入x为非int32类型时,weight_scale不允许输入。
    • 当输入x为非int32类型时,activation_scale不允许输入。
    • 当输入x为非int32类型时,bias不允许输入。
  • 输出约束

    • y的最后一维不超过5120。
    • 当dst_type为float4类型(296或297)时,y的最后一维需要是2的倍数。
  • quant_mode约束

    • quant_mode=0(静态量化)时,quant_scale和quant_offset必须输入。
    • quant_mode=1(动态量化)时,quant_offset不支持输入。
  • 该接口支持推理场景下使用。

  • 该接口支持aclgraph入图。

  • 该接口与PyTorch配合使用时,需要保证CANN相关包与PyTorch相关包的版本匹配。

调用示例

  • 详见 test_npu_dequant_swiglu_clamp_quant.py

【免费下载链接】cann-recipes-infer本项目针对LLM与多模态模型推理业务中的典型模型、加速算法,提供基于CANN平台的优化样例项目地址: https://gitcode.com/cann/cann-recipes-infer

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询