下载
中文
注册

RmsNormOperation

功能

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

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

图1 NORM

使用场景

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

图2 RmsNormOperation算子上下文

计算公式

  • RmsNorm

    beta在rmsnorm quant量化场景下会使用。

  • add+RmsNorm(PreNorm, PostNorm)

    其中gamma为可训练参数,epsilon是一个取值范围为(0, 1]的浮点值,用于避免除零。

  • 量化

定义

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

[1, ..., 1, dim_n]

float16

ND

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

beta

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

当前版本暂不支持。

规格约束

  • 除scale,offset,rstd tensors外,所有输入输出tensor的最后一维大小相等,需要32字节对齐。
  • rstd仅Atlas 800I A2 推理产品/Atlas A2 训练系列产品支持,不能和precisionMode,modelType同时设置,不支持量化场景使用。
  • precisionMode不能和rstd,modelType同时设置,不支持量化场景使用。
  • modelType不能和rstd,precisionMode同时设置,不支持量化场景使用。
  • dynamicQuantType目前只支持对称动态量化DYNAMIC_QUANT_SYMMETRIC。动态对称量化时,输入的最后一维大小需要小于等于12288。

功能列表

  • RmsNorm
    • 非量化
      • 训练rmsnormforward算子,设置rstd为true开启。
      • precisionMode默认HIGH_PRECISION_MODE,中间计算使用float类型。HIGH_PERFORMANCE_MODE,在最后做gamma(weight)的乘法计算的时候使用float16类型。
      • modelType默认LLAMA_MODEL,使用llama模型的rmsnorm公式。GEMMA_MODEL,使用gemma模型的rmsnorm公式。区别在乘gamma(weight)前,会将gamma+1再做乘法。
    • 量化
      • rmsnorm量化。
      • dynamicQuantType默认值DYNAMIC_QUANT_UNDEFINED(普通量化)DYNAMIC_QUANT_SYMMETRIC 动态对称量化。
  • add+RmsNorm融合(Prenorm,PostNorm)在做rmsnorm前,将x和residual相加
    • 非量化
      • PreNorm返回add+residual的结果,PostNorm不返回
      • hasBias参数。为true时,可以输入bias tensor。为false时,不输入bias tensor。
    • 量化

      只有Prenorm支持。