文件最后提交记录最后更新时间
24 天前
16 天前
5 个月前
15 天前
16 天前
3 小时前
5 个月前
1 个月前
README

AddLayerNormQuant

产品支持情况

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

功能说明

  • 算子功能:LayerNorm算子是大模型常用的归一化操作。AddLayerNormQuant算子将LayerNorm前的Add算子和LayerNorm归一化输出给1个或2个下游的量化算子融合起来,减少搬入搬出操作。LayerNorm下游的量化算子可以是Quantize、AscendQuantV2或DynamicQuant算子,具体的量化算子类型由attr入参divMode和quantMode决定。当下游有2个量化算子时,2个量化算子的算子类型、输入输出dtype组合和可选输入的组合需要完全一致。

  • 计算公式*:

    x=x1+x2+biasx = x1 + x2 + bias

    y=x−E(x)Var(x)+epsilon∗gamma+betay = {{x-E(x)}\over\sqrt {Var(x)+epsilon}} * gamma + beta

    • 当quantMode输入为"static"时,输出outScales1和outScales2无实际意义。取决于divMode的输入,融合的量化算子可能是Quantize或AscendQuantV2:

      • 当divMode输入为true时,融合的量化算子为Quantize,计算公式如下所示:

        y1=round(y/scales1+zeroPoints1)y1 = round(y / scales1 + zeroPoints1)

        y2=round(y/scales2+zeroPoints2),当且仅当scales2存在y2 = round(y / scales2 + zeroPoints2), \quad \text{当且仅当scales2存在}

      • 当divMode输入为false时,融合的量化算子为AscendQuantV2,计算公式如下所示:

        y1=round(y∗scales1+zeroPoints1)y1 = round(y * scales1 + zeroPoints1)

        y2=round(y∗scales2+zeroPoints2),当且仅当scales2存在y2 = round(y * scales2 + zeroPoints2), \quad \text{当且仅当scales2存在}

    • 当quantMode输入为"dynamic"时,输入zeroPoints1和zeroPoints2无实际意义。融合的量化算子是DynamicQuant,此时divMode无效:

      • 若scales1和scales2均无输入,则y2和scale2输出无实际意义,可忽略。计算公式如下所示:

        outScales1=row_max(abs(y))/127outScales1 = row\_max(abs(y))/127

        y1=round(y/outScales1)y1 = round(y / outScales1)

      • 若仅输入scales1,则y2和scale2输出无实际意义,可忽略。计算公式如下所示:

        tmp1=y∗scales1tmp1 = y * scales1

        outScales1=row_max(abs(tmp1))/127outScales1 = row\_max(abs(tmp1))/127

        y1=round(y/outScales1)y1 = round(y / outScales1)

      • 若scales1和scales2均存在,则y2和scale2输出有效。计算公式如下所示:

        tmp1=y∗scales1,tmp2=y∗scales2tmp1 = y * scales1, \quad tmp2 = y * scales2

        outScales1=row_max(abs(tmp1))/127,outScales2=row_max(abs(tmp2))/127outScales1 = row\_max(abs(tmp1))/127, \quad outScales2 = row\_max(abs(tmp2))/127

        y1=round(y/outScales1),y2=round(y/outScales2)y1 = round(y / outScales1),\quad y2 = round(y / outScales2)

      其中row_max代表对每行求最大值。

参数说明

参数名 输入/输出/属性 描述 数据类型 数据格式
x1 输入 表示AddLayerNorm中加法计算的输入,对应公式中的`x1`。 FLOAT32、FLOAT16、BFLOAT16 ND
x2 输入 表示AddLayerNorm中加法计算的输入,对应公式中的`x2`。 FLOAT32、FLOAT16、BFLOAT16 ND
gamma 输入 表示层归一化中的gamma参数,对应公式中的`gamma`。 FLOAT32、FLOAT16、BFLOAT16 ND
beta 输入 表示层归一化中的beta参数,对应公式中的`beta`。 FLOAT32、FLOAT16、BFLOAT16 ND
bias 可选输入 表示AddLayerNormQuant中加法计算的输入,对应公式中的`bias`。 FLOAT32、FLOAT16、BFLOAT16 ND
scales1 可选输入 表示第一个被融合的量化计算子中的scale/smooth输入,对应公式中的`scales1`。 FLOAT32、FLOAT16、BFLOAT16 ND
scales2 可选输入 表示第二个被融合的量化计算子中的scale/smooth输入,对应公式中的`scales2`。 FLOAT32、FLOAT16、BFLOAT16 ND
zero_points1 可选输入 表示第一个被融合的量化计算子中的zeroPoints输入,对应公式中的`zeroPoints1`。 FLOAT32、FLOAT16、BFLOAT16 ND
zero_points2 可选输入 表示第二个被融合的量化计算子中的zeroPoints输入,对应公式中的`zeroPoints2`。 FLOAT32、FLOAT16、BFLOAT16 ND
quant_mode 可选属性
  • 用于确定融合算子融合的是静态还是动态量化算子,对应公式中的`quantMode`。取值可以是"static"或"dynamic"。
  • 默认值为"dynamic"。
String -
epsilon 可选属性
  • 添加到分母中的值,以确保数值稳定,用于防止除0错误,对应公式中的`epsilon`。
  • 默认值为1e-5。
FLOAT -
additional_output 可选属性
  • 表示是否开启x=x1+x2+bias的输出。
  • 默认值为false。
BOOL -
div_mode 可选属性
  • 表示静态量化处理scale的方法是乘法或除法,对应公式中的`divMode`。
  • 默认值为true。
BOOL -
y1 输出 表示量化输出Tensor,对应公式中的`y1`。 INT8 ND
y2 输出 表示量化输出Tensor,对应公式中的`y2`。 INT8 ND
x 输出 表示x1和x2的和,对应公式中的`x`。 FLOAT32、FLOAT16、BFLOAT16 ND
out_scales1 输出 表示通过scales1计算的动态量化缩放结果,对应公式中的`outScales1`。 FLOAT32 ND
out_scales2 输出 表示通过scales2计算的动态量化缩放结果,对应公式中的`outScales2`。 FLOAT32 ND
  • Kirin X90/Kirin 9030处理器系列产品:不支持BFLOAT16。

约束说明

调用说明

调用方式 样例代码 说明
aclnn接口 - 通过aclnnAddLayerNormQuant接口方式调用AddLayerNormQuant算子。
图模式 test_geir_add_layer_norm_quant 通过算子IR构图方式调用AddLayerNormQuant算子。