CANN/ops-nn加层归一化量化V2算子
AddLayerNormQuantV2
【免费下载链接】ops-nn本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-nn
产品支持情况
| 产品 | 是否支持 |
|---|---|
| Ascend 950PR/Ascend 950DT | × |
| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ |
| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ |
| Atlas 200I/500 A2 推理产品 | × |
| Atlas 推理系列产品 | √ |
| Atlas 训练系列产品 | × |
功能说明
接口功能 :LayerNorm算子是大模型常用的归一化操作。AddLayerNormQuantV2算子将LayerNorm前的Add算子和LayerNorm归一化输出给1个或2个下游的量化算子融合起来,减少搬入搬出操作。LayerNorm下游的量化算子可以是Quantize、AscendQuantV2或DynamicQuant算子,具体的量化算子类型由attr入参divMode和quantMode决定。当下游有2个量化算子时,2个量化算子的算子类型、输入输出dtype组合和可选输入的组合需要完全一致,当前仅支持下游有1个AscendQuantV2量化算子。
计算公式:
$$ x = x1 + x2 + biasOptional $$
$$ y = {{x-E(x)}\over\sqrt {Var(x)+epsilon}} * gamma + beta $$
当quantMode输入为"static"时,输出outScales1Out和outScales2Out无实际意义。取决于divMode的输入,融合的量化算子可能是Quantize或AscendQuantV2:
当divMode输入为true时,融合的量化算子为Quantize,计算公式如下所示:
$$ y1Out = round(y / scales1Optional + zeroPoints1Optional) $$
$$ y2Out = round(y / scales2Optional + zeroPoints2Optional), \quad \text{当且仅当scales2Optional存在} $$
当divMode输入为false时,融合的量化算子为AscendQuantV2,计算公式如下所示:
$$ y1Out = round(y * scales1Optional + zeroPoints1Optional) $$
$$ y2Out = round(y * scales2Optional + zeroPoints2Optional), \quad \text{当且仅当scales2Optional存在} $$
当quantMode输入为"dynamic"时,输入zeroPoints1Optional和zeroPoints2Optional无实际意义。融合的量化算子是DynamicQuant,此时divMode无效:
若scales1Optional和scales2Optional均无输入,则y2Out和scale2Out输出无实际意义,可忽略。计算公式如下所示:
$$ outScales1Out = row_max(abs(y))/127 $$
$$ y1Out = round(y / outScales1Out) $$
若仅输入scales1Optional,则y2Out和scale2Out输出无实际意义,可忽略。计算公式如下所示:
$$ tmp1 = y * scales1Optional $$
$$ outScales1Out = row_max(abs(tmp1))/127 $$
$$ y1Out = round(tmp1 / outScales1Out) $$
若scales1Optional和scales2Optional均存在,则y2Out和scale2Out输出有效。计算公式如下所示:
$$ tmp1 = y * scales1Optional, \quad tmp2 = y * scales2Optional $$
$$ outScales1Out = row_max(abs(tmp1))/127, \quad outScales2Out = row_max(abs(tmp2))/127 $$
$$ y1Out = round(tmp1 / outScales1Out),\quad y2Out = round(tmp2 / outScales2Out) $$
其中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 | 可选输入 | 表示AddLayerNormQuantV2中加法计算的输入,对应公式中的`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 |
| layernormRes | 输出 | 表示layernorm的结果输出,对应公式中的`x`。 | FLOAT32、FLOAT16、BFLOAT16 | ND |
| out_scales1 | 输出 | 表示通过scales1计算的动态量化缩放结果,对应公式中的`outScales1`。 | FLOAT32 | ND |
| out_scales2 | 输出 | 表示通过scales2计算的动态量化缩放结果,对应公式中的`outScales2`。 | FLOAT32 | ND |
- Atlas 推理系列产品 :不支持BFLOAT16。
约束说明
无
调用说明
| 调用方式 | 样例代码 | 说明 |
|---|---|---|
| aclnn接口 | test_aclnn_add_layer_norm_quant_v2 | 通过aclnnAddLayerNormQuantV2接口方式调用AddLayerNormQuantV2算子。 |
【免费下载链接】ops-nn本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-nn
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
