RmsNormOperation

功能

RMSNorm是一种归一化方法,它通过对数据的root mean square(RMS)进行归一化,避免了均值的使用。RMSNorm通过对数据的均值和方差进行调整,旨在优化深度学习模型的性能。RMSNorm不仅可以简化计算,还可以提高模型的收敛速度和稳定性。

当前支持Norm,PreNorm,PostNorm三种归一化操作。

图1 NORM

使用场景

通常使用在注意力机制attention前和attention与前馈网络ffn之间。

图2 RmsNormOperation算子上下文

计算公式

定义

struct RmsNormParam {
    enum RmsNormType : int {
        RMS_NORM_UNDEFINED = 0,
        RMS_NORM_NORM,
        RMS_NORM_PRENORM,
        RMS_NORM_POSTNORM,
    };
    enum PrecisionMode : int {
        HIGH_PRECISION_MODE = 0,
        HIGH_PERFORMANCE_MODE,
    }
    enum ModelType : int {
        LLAMA_MODEL = 0,  
        GEMMA_MODEL,   
    };
    struct NormParam {
        QuantType quantType = QUANT_UNDEFINED;
        float epsilon = 1e-5;
        double layerNormEps = 1e-5;
        bool rstd = false;
        PrecisionMode precisionMode = HIGH_PRECISION_MODE;
        ModelType modelType = LLAMA_MODEL;
        DynamicQuantType dynamicQuantType = DYNAMIC_QUANT_UNDEFINED;
    };
    struct PreNormParam {
        QuantType quantType = QUANT_UNDEFINED;
        float epsilon = 1e-5;
        bool hasBias = false;
    };
    struct PostNormParam {
        QuantType quantType = QUANT_UNDEFINED;
        float epsilon = 1e-5;
        bool hasBias = false;
    };
    RmsNormType layerType = RMS_NORM_UNDEFINED;
    NormParam normParam;
    PreNormParam preNormParam;
    PostNormParam postNormParam;
};

参数列表

成员名称

描述

RmsNormParam

RMSNORM参数。

  • RMS_NORM_UNDEFINED:默认值,未定义。
  • RMS_NORM_NORM:NORM参数。
  • RMS_NORM_PRENORM :PRENORM参数。
  • RMS_NORM_POSTNORM:POSTNORM参数。

PrecisionMode

PRECISIONMODE参数。

  • HIGH_PRECISION_MODE:默认值,中间计算使用float类型。
  • HIGH_PERFORMANCE_MODE:中间计算使用float16类型。

ModelType

MODELTYPE参数。

  • LLAMA_MODEL:默认值,使用Llama rmsnorm的公式。
  • GEMMA_MODEL:使用Gemma rmsnorm的公式。

layerType

归一化类型,参数如下:

  • RMS_NORM_UNDEFINED:默认值,未定义。
  • RMS_NORM_NORM:NORM参数。
  • RMS_NORM_PRENORM:PRENORM参数。
  • RMS_NORM_POSTNORM:POSTNORM参数。

normParam

NORM参数。具体请参见表1

preNormParam

PRENORM参数。具体请参见表2

postNormParam

POSTNORM参数。具体请参见表3

表1 NormParam成员

参数

类型

默认值

描述

quantType

QuantType

QUANT_UNDEFINED

量化类型。

当前支持以下类型。

  • QUANT_UNDEFINED
  • QUANT_INT8

epsilon

float

1e-5

Epsilon,归一化时加在分母上防止除零。

layerNormEps

float

1e-5

Epsilon,默认为1e-5,暂时不使用。

rstd

bool

false

默认为False,设置为true时会使用训练的rmsnormforward算子。

Atlas 800I A2 推理产品/Atlas A2 训练系列产品支持该算子。

不支持和“precisionMode”“modelType”同时设置。

量化场景下不支持使用“rstd”

precisionMode

PrecisionMode

HIGH_PRECISION_MODE

默认为HIGH_PRECISION_MODE。

支持参数如下:

  • HIGH_PRECISION_MODE:默认值,中间计算使用float类型。
  • HIGH_PERFORMANCE_MODE: 中间计算使用float16类型。

不支持和“rstd”“modelType”同时设置。

量化场景下不支持使用“precisionMode”,该场景下配置该参数将返回报错ERROR_INVALID_PARAM。

modelType

ModelType

LLAMA_MODEL

默认为LLAMA_MODEL,设置为GEMMA_MODEL时使用gemma模型的rmsnorm计算公式。

支持参数如下:

  • LLAMA_MODEL:默认值, Llama的rms norm计算公式。
  • GEMMA_MODEL:Gemma的rms norm计算公式。

不支持和“rstd”“precisionMode”同时启用。

量化场景下不支持使用“modelType”,该场景下配置该参数将返回报错ERROR_INVALID_PARAM。

dynamicQuantType

DynamicQuantType

DYNAMIC_QUANT_UNDEFINED

动态量化类型。默认为DYNAMIC_QUANT_UNDEFINED非动态量化。当前版本暂不支持非对称动态量化。

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

表2 PreNormParam成员

参数

类型

默认值

描述

quantType

QuantType

QUANT_UNDEFINED

量化类型。

当前支持以下类型。

  • QUANT_UNDEFINED
  • QUANT_INT8

epsilon

float

1e-5

Epsilon,归一化时加在分母上防止除零。

hasBias

bool

false

是否叠加偏置。默认为False,当需要输入beta时设置为True。

量化场景下不支持使用“hasBias”,该场景下配置该参数将返回报错ERROR_INVALID_PARAM。

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

表3 PostNormParam成员

参数

类型

默认值

描述

quantType

QuantType

QUANT_UNDEFINED

量化类型。

当前仅支持QUANT_UNDEFINED。

epsilon

float

1e-5

Epsilon,归一化时加在分母上防止除零。

hasBias

bool

false

是否叠加偏置。默认为False,当需要输入beta时设置为True。

RMS_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

最后一维n的大小要32字节对齐,且小于等于12288。

output

[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时输出。

offset

[dim_0,dim_1,... ,dim_n-1]

float

ND

当quantType == QUANT_INT8且dynamicQuantType == DYNAMIC_QUANT_ASYMMETRIC时输出。

当前版本暂不支持。

规格约束

功能列表