功能
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输入输出描述
参数
|
维度
|
数据类型
|
格式
|
描述
|
x
|
[dim_0,dim_1,... ,dim_n]
|
float16/float/bf16
|
ND
|
float数据类型仅在rstd为true时支持,且rstd为true时只能使用float数据类型。
所有Tensor最后一维的d_n大小需保持一致,其他维度的大小没有约束。
最后一维的大小需进行32字节对齐。
|
gamma
|
[1, ..., dim_n] / [dim_i,...,dim_n] (0 <= i <= n)
|
float16/float/bf16
|
ND
|
最后一维的大小需进行32字节对齐。
normParam.rstd为true时,维度数需要大于0,并小于x的维度数,gamma的维度从最后一维向前,每一维都需要和x保持一致。
rstd为false时,维度为[1,dim_n]。
数据类型与x保持一致。
dim_n前可以有任意个1。
|
beta
|
[1, ..., dim_n]
|
float16/float/bf16
|
ND
|
quantType = INT8时输入。
最后一维的大小要32字节对齐。数据类型与x保持一致。
dim_n前可以有任意个1。
维度需要和gamma保持一致。
|
scale
|
[1]
|
float16/bf16
|
ND
|
当quantType为QUANT_INT8时才输入。数据类型与x保持一致。
|
offset
|
[1]
|
int8
|
ND
|
当quantType为QUANT_INT8时才输入。
|
output
|
[dim_0, dim_1,... ,dim_n]
|
float16/float/int8/bf16
|
ND
|
quantType=INT8时输出int8。
|
rstd
|
[dim_0,..,1]
|
float16/float/bf16
|
ND
|
normParam.rstd为true时输出。第i维大于等于x的维度数减去gamma的维度数时,大小为1,否则和x中对应维度大小相等。
|
所有Tensor最后一维的大小需保持一致。
|
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时输出。
当前版本暂不支持。
|
RMS_NORM_PRENORM quantType = QUANT_UNDEFINED输入输出描述
参数
|
维度
|
数据类型
|
格式
|
描述
|
x
|
[dim_0, dim_1,... ,dim_n]
|
float16/bf16
|
ND
|
最后一维的大小要32字节对齐。
|
beta
|
[1, ..., dim_n]
|
float16/bf16
|
ND
|
当hasBias为True时输入
最后一维的大小要32字节对齐。
dim_n前可以有任意个1。
|
residual
|
[dim_0, dim_1,... ,dim_n]
|
float16/bf16
|
ND
|
最后一维的大小要32字节对齐。
|
gamma
|
[1, ..., dim_n]
|
float16/bf16
|
ND
|
最后一维的大小要32字节对齐。
dim_n前可以有任意个1。
维度需要与beta保持一致。
|
output
|
[dim_0, dim_1,... ,dim_n]
|
float16/bf16
|
ND
|
输出tensor,维度数与x一致。
|
resOut
|
[dim_0, dim_1,... ,dim_n]
|
float16/bf16
|
ND
|
输出tensor,维度数与x一致。
|
所有Tensor最后一维的n大小需保持一致。
|
RMS_NORM_PRENORM quantType = QUANT_INT8输入输出描述
参数
|
维度
|
数据类型
|
格式
|
描述
|
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
|
量化scale参数。
|
offset
|
[1]
|
int8
|
ND
|
量化offset参数。
|
outputQuant
|
[dim_0, dim_1,... ,dim_n]
|
int8
|
ND
|
输出tensor,维度数与x一致。
|
output
|
[dim_0, dim_1,... ,dim_n]
|
float16
|
ND
|
输出tensor,维度数与x一致。
|
所有Tensor最后一维的n大小需保持一致。
|
RMS_NORM_POSTNORM输入输出描述
参数
|
维度
|
数据类型
|
格式
|
描述
|
x
|
[dim_0, dim_1,... ,dim_n]
|
float16/bf16
|
ND
|
当前支持quantType = QUANT_UNDEFINED。
最后一维的大小要32字节对齐。
|
beta
|
[1, ..., dim_n]
|
float16/bf16
|
ND
|
当hasBias为True时输入。
最后一维的大小要32字节对齐。
dim_n前可以有任意个1。
|
residual
|
[dim_0, dim_1,... ,dim_n]
|
float16/bf16
|
ND
|
最后一维的大小要32字节对齐。
|
gamma
|
[1, ..., dim_n]
|
float16/bf16
|
ND
|
最后一维的大小要32字节对齐。
dim_n前可以有任意个1。
维度需要与beta保持一致。
|
output
|
[dim_0, dim_1,... ,dim_n]
|
float16/bf16
|
ND
|
输出tensor,维度数与x一致。
|
所有Tensor最后一维的n大小需保持一致。
|
规格约束
- 除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支持。