| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 24 天前 | ||
| 16 天前 | ||
| 5 个月前 | ||
| 15 天前 | ||
| 16 天前 | ||
| 3 小时前 | ||
| 5 个月前 | ||
| 1 个月前 |
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 | 可选属性 |
|
String | - |
| epsilon | 可选属性 |
|
FLOAT | - |
| additional_output | 可选属性 |
|
BOOL | - |
| div_mode | 可选属性 |
|
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算子。 |