---
title: LayerNormOperation
description: "| 硬件型号 | 是否支持 |"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/API/ascendtb/ascendtb_01_0061.html
sourcePath: /source/zh/canncommercial/900/API/ascendtb/ascendtb_01_0061.html
indexId: 976433bd390048cb09379694ab05f9d4bcc1ad35f6c579671b3e0ac2760a7c1d64
---
# LayerNormOperation

#### 产品支持情况

| 硬件型号 | 是否支持 |
| --- | --- |
| Atlas 350 加速卡 | x |
| Atlas A3 推理系列产品 / Atlas A3 训练系列产品 | √ |
| Atlas A2 训练系列产品 / Atlas A2 推理系列产品 | √ |
| Atlas 训练系列产品 | x |
| Atlas 推理系列产品 | x |
| Atlas 200I/500 A2 推理产品 | x |


#### 功能说明

LayerNorm是一种归一化方法，可以将网络层输入数据归一化到[0, 1]之间。当前支持NORM、PRENORM、POSTNORM三种归一化。


#### 计算公式

- Norm
  标准的LayerNorm操作，公式为：

  图1 LayerNorm计算公式图

- PostNorm
  add和layernorm融合算子，先将x和residual相加再做layernorm归一化，公式为：

  图2 Add+LayerNorm计算公式图

- PreNorm
  add和layernorm融合算子，先将x和residual相加再做layernorm归一化。公式与PostNorm相同。和postNorm区别在于会输出x和residual相加的结果。


#### 定义

```
struct LayerNormParam {
    enum LayerNormType : int {
        LAYER_NORM_UNDEFINED = 0,
        LAYER_NORM_NORM,
        LAYER_NORM_PRENORM,
        LAYER_NORM_POSTNORM,
        LAYER_NORM_MAX,
    };
    struct NormParam {
        QuantType quantType = QUANT_UNQUANT;
        float epsilon = 1e-5;
        int32_t beginNormAxis = 0;
        int32_t beginParamsAxis = 0;
        DynamicQuantType dynamicQuantType = DYNAMIC_QUANT_UNDEFINED;
        uint8_t rsv[20] = {0};
    };
    struct PreNormParam {
        QuantType quantType = QUANT_UNQUANT;
        float epsilon = 1e-5;
        uint64_t opMode = 0;
        float zoomScaleValue = 1.0f;
        uint8_t rsv[20] = {0};
    };
    struct PostNormParam {
        QuantType quantType = QUANT_UNQUANT;
        float epsilon = 1e-5;
        uint64_t opMode = 0;
        float zoomScaleValue = 1.0f;
        uint8_t rsv[20] = {0};
    };
    LayerNormType layerType = LAYER_NORM_UNDEFINED;
    NormParam normParam;
    PreNormParam preNormParam;
    PostNormParam postNormParam;
    uint8_t rsv[8] = {0};
};
```


#### 参数列表

| 成员名称 | 描述 |
| --- | --- |
| layerType | 归一化类型。 LAYER\_NORM\_UNDEFINED：默认值，未定义。 LAYER\_NORM\_NORM：norm类型。 LAYER\_NORM\_PRENORM：prenorm类型。 LAYER\_NORM\_POSTNORM：postnorm类型。 LAYER\_NORM\_MAX：max类型。 |
| normParam | NORM参数，具体请参见表1。 |
| preNormParam | PRENORM参数，具体请参见表2。 |
| postNormParam | POSTNORM参数，具体请参见表3。 |
| rsv[8] | 预留参数。 |


**表1 normParam成员**

| 参数 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| quantType | QuantType | QUANT\_UNQUANT | 量化类型。 当前支持以下类型。 QUANT\_UNQUANT。 QUANT\_INT8。 |
| epsilon | float | 1e\-5 | Epsilon，归一化时加在分母上防止除0。 |
| beginNormAxis | int32\_t | 0 | 归一化的维度，默认值为0，从第几维开始norm，同时决定输入gamma和beta维度。 |
| beginParamsAxis | int32\_t | 0 | 归一化的维度，默认值为0，决定从第几维开始把后面的维度按轴合并。 |
| dynamicQuantType | DynamicQuantType | DYNAMIC\_QUANT\_UNDEFINED | 动态量化类型。默认为DYNAMIC\_QUANT\_UNDEFINED非动态量化。当前版本暂不支持非对称动态量化。 |
| rsv[20] | uint8\_t | {0} | 预留参数。 |


8.0.RC2及后续版本normParam不再支持quantInputScale、quantInputOffset、quantInputAlpha量化参数。


**表2 preNormParam 成员**

| 参数 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| quantType | QuantType | QUANT\_UNQUANT | 量化类型。当前仅支持QUANT\_UNQUANT。 |
| epsilon | float | 1e\-5 | Epsilon，归一化时加在分母上防止除0。 |
| opMode | uint64\_t | 0 | 0：高精度。 1：高性能。（暂不支持） |
| zoomScaleValue | float | 1.0f | 缩放因子。 |
| rsv[20] | uint8\_t | {0} | 预留参数。 |


**表3 postNormParam成员**

| 参数 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| quantType | QuantType | QUANT\_UNQUANT | 量化类型。当前支持以下类型。 QUANT\_UNQUANT。 QUANT\_INT8。 |
| epsilon | float | 1e\-5 | Epsilon，归一化时加在分母上防止除0。 |
| opMode | uint64\_t | 0 | 0：高精度。 1：高性能。（暂不支持） |
| zoomScaleValue | float | 1.0f | 缩放因子。 |
| rsv[20] | uint8\_t | {0} | 预留参数。 |


8.0.RC2及后续版本postNormParam不再支持quantInputScale、quantInputOffset、quantInputAlpha量化参数。


#### LAYER_NORM_NORM输入输出


| 参数 | 维度 | 数据类型 | 格式 | 描述 |
| --- | --- | --- | --- | --- |
| x | [dim\_0, dim\_1, ..., dim\_n] | float16/float/bf16 | ND | 输入。 quantType = QUANT\_INT8时，数据类型为float16或bf16，最后一维的大小要32字节对齐。 quantType = QUANT\_UNQUANT时，数据类型为float16、float或bf16。 |
| gamma | [beginNormAxis:]或[1, ..., dim\_n] | float16/float/bf16 | ND | 输入。 quantType = QUANT\_UNQUANT时，根据beginNormAxis确定其余维度。 quantType = QUANT\_INT8时，维度为[dim\_n]，最后一维的大小要32字节对齐。dim\_n前可以有任意个1。 |
| beta | [beginNormAxis:]或[1, ..., dim\_n] | float16/float/bf16 | ND | 输入。 quantType = QUANT\_UNQUANT时，根据beginNormAxis确定其余维度。 quantType = QUANT\_INT8时，维度为[dim\_n]，最后一维的大小要32字节对齐。dim\_n前可以有任意个1。维度需与gamma保持一致。 |
| scale | [1] | float16/bf16 | ND | 输入。quantType = QUANT\_INT8时才输入。 |
| offset | [1] | int8 | ND | 输入。quantType = QUANT\_INT8时才输入。 |
| output | [dim\_0, dim\_1, ..., dim\_n] | float16/float/int8/bf16 | ND | 输出。 quantType = QUANT\_INT8时，数据类型为int8。 quantType = QUANT\_UNQUANT时，数据类型为float16、float或bf16。 |


#### LAYER_NORM_NORM DYNAMIC_QUANT输入输出


| 参数 | 维度 | 数据类型 | 格式 | 描述 |
| --- | --- | --- | --- | --- |
| x | [dim\_0, dim\_1, ..., dim\_n] | float16 | ND | 输入。最后一维n的大小要32字节对齐，且小于等于12288。 |
| gamma | [dim\_n] | float16 | ND | 输入。最后一维n的大小要32字节对齐，且小于等于12288。 |
| beta | [dim\_n] | float16 | ND | 输入。所有属性与gamma一致。最后一维n的大小要32字节对齐，且小于等于12288。 |
| y | [dim\_0, dim\_1, ..., dim\_n] | int8 | ND | 输出。最后一维n的大小要32字节对齐，且小于等于12288。 |
| scale | [dim\_0, dim\_1, ..., dim\_n\-1] | float | ND | 输出。当quantType == QUANT\_INT8且dynamicQuantType != DYNAMIC\_QUANT\_UNDEFINED时输出，此时x维度需大于等于2。 |
| offset | [dim\_0, dim\_1, ..., dim\_n\-1] | float | ND | 输出。当quantType == QUANT\_INT8且dynamicQuantType == DYNAMIC\_QUANT\_ASYMMETRIC时输出，此时x维度需大于等于2。当前版本暂不支持。 |


#### LAYER_NORM_PRENORM输入输出


| 参数 | 维度 | 数据类型 | 格式 | 描述 |
| --- | --- | --- | --- | --- |
| x | [dim\_0, dim\_1, ..., dim\_n] | float16/bf16 | ND | 输入。最后一维的大小要32字节对齐。 |
| residual\_in | [dim\_0, dim\_1, ..., dim\_n] | float16/bf16 | ND | 输入。最后一维的大小要32字节对齐。 |
| gamma | [1, ..., dim\_n] | float16/bf16 | ND | 输入。最后一维的大小要32字节对齐。dim\_n前可以有任意个1。 |
| beta | [1, ..., dim\_n] | float16/bf16 | ND | 输入。最后一维的大小要32字节对齐。dim\_n前可以有任意个1。维度需要与gamma保持一致。 |
| output | [dim\_0, dim\_1, ..., dim\_n] | float16/bf16 | ND | 输出。 |
| residual\_out | [dim\_0, dim\_1, ..., dim\_n] | float16/bf16 | ND | 输出。Norm前的输出（等于 x + residual\_in \* zoom\_scale）。 |


#### LAYER_NORM_POSTNORM输入输出


| 参数 | 维度 | 数据类型 | 格式 | 描述 |
| --- | --- | --- | --- | --- |
| x | [dim\_0, dim\_1, ..., dim\_n] | float16 | ND | 输入。最后一维的大小要32字节对齐。 |
| residual | [dim\_0, dim\_1, ..., dim\_n] | float16 | ND | 输入。最后一维的大小要32字节对齐。 |
| gamma | [1, ..., dim\_n] | float16 | ND | 输入。最后一维的大小要32字节对齐。dim\_n前可以有任意个1。 |
| beta | [1, ..., dim\_n] | float16 | ND | 输入。最后一维的大小要32字节对齐。dim\_n前可以有任意个1。维度需要与gamma保持一致。 |
| scale | [1] | float16 | ND | 输入。当quantType = QUANT\_INT8时输入。 |
| offset | [1] | int8 | ND | 输入。当quantType = QUANT\_INT8时输入。 |
| output | [dim\_0, dim\_1, ..., dim\_n] | float16 | ND | 输出。 |
| outputQuant | [dim\_0, dim\_1, ..., dim\_n] | int8 | ND | 输出。当quantType = QUANT\_INT8时输出。 |


#### 约束说明

- beginNormAxis 需要小于 tensor x的维度大小。为负数时，与tensor x维度大小之和需要大于0。
- Norm的动态量化只支持DYNAMIC_QUANT_SYMMETRIC对称动态量化。最后一维需要小于等于12288。
- 除量化场景下的scale和offset tensor，其余tensor的最后一维大小相等。


#### 功能列表

- 非量化

  - 基础layernorm
  - add+layernorm融合（prenorm，postnorm）
- 量化

  - layernorm量化
  - layernorm对称动态量化
  - add+layernorm量化（postnorm）
