为了使RmsNorm支持非连续Tensor,将x tensor通过(shape、strides、offset)表示。strides描述某个维度上相邻两个元素的间隔,offset表示这个Tensor的首元素相对addr的偏移。
示例:
例如现有一个shape=(6, 5)、strides=(10, 1)、offset=22的Tensor,其内存排布如下:
即该Tensor排布如上图的深色位置。这个完整的Tensor在内存排布上是不连续的,strides描述Tensor维度上相邻两个元素的间隔,如果在维度1上的stride为1, 该维度是连续的;如果在维度0上的stride为10,那么相邻的元素间隔10个元素,即非连续。offset表示这个Tensor的首元素相对addr的偏移。
其中gamma为可训练参数,epsilon是一个取值范围为(0, 1]的浮点值,用于避免除零。
struct RmsNormWithStrideParam { 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_UNQUANT; 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; uint8_t rsv[32] = {0}; }; struct PreNormParam { QuantType quantType = QUANT_UNQUANT; float epsilon = 1e-5; bool hasBias = false; uint8_t rsv[23] = {0}; }; struct PostNormParam { QuantType quantType = QUANT_UNQUANT; float epsilon = 1e-5; bool hasBias = false; uint8_t rsv[23] = {0}; }; RmsNormType layerType = RMS_NORM_UNDEFINED; NormParam normParam; PreNormParam preNormParam; PostNormParam postNormParam; uint8_t rsv[8] = {0}; };
成员名称 |
描述 |
---|---|
layerType |
归一化类型。
|
normParam |
NORM参数。具体请参见表1。 |
preNormParam |
PRENORM参数。具体请参见表2。 |
postNormParam |
POSTNORM参数。具体请参见表3。 |
rsv[8] |
预留参数。 |
成员名称 |
类型 |
默认值 |
取值范围 |
是否必选 |
描述 |
---|---|---|---|---|---|
quantType |
QuantType |
QUANT_UNQUANT |
QUANT_UNQUANT |
是 |
在算子的计算完成后进行量化。 当前仅支持以下类型:QUANT_UNQUANT。 |
epsilon |
float |
1e-5 |
1e-5 |
是 |
Epsilon,归一化时加在分母上防止除0。 |
layerNormEps |
double |
1e-5 |
1e-5 |
是 |
Epsilon,默认为1e-5,暂不使用。 |
rstd |
bool |
false |
true/false |
是 |
默认为False,不支持和“precisionMode”,“modelType”同时设置。量化场景下不支持使用“rstd”。 |
precisionMode |
PrecisionMode |
HIGH_PRECISION_MODE |
HIGH_PRECISION_MODE HIGH_PERFORMANCE_MODE |
是 |
不支持和“rstd”,“modelType”同时设置。输入类型只支持float16。 量化场景下不支持使用“precisionMode”,该场景下配置该参数将返回报错ERROR_INVALID_PARAM。 |
modelType |
ModelType |
LLAMA_MODEL |
LLAMA_MODEL GEMMA_MODEL |
是 |
设置为GEMMA_MODEL时使用gemma模型的rmsnorm计算公式。
不支持和“rstd”,“precisionMode”同时启用。 量化场景下不支持使用“modelType”,该场景下配置该参数将返回报错ERROR_INVALID_PARAM。 |
dynamicQuantType |
DynamicQuantType |
DYNAMIC_QUANT_UNDEFINED |
DYNAMIC_QUANT_UNDEFINED |
否 |
只支持DYNAMIC_QUANT_UNDEFINED非动态量化。 |
rsv[32] |
uint8_t |
{0} |
[0] |
否 |
预留参数。 |
参数 |
维度 |
数据类型 |
格式 |
描述 |
---|---|---|---|---|
x |
[dim_0, ..., dim_n-1, dim_n] |
float16/bf16 |
ND |
最后一位的大小需要为16的倍数。 |
gamma |
[1, dim_n]/[dim_i, ..., dim_n](0<=i<=n) |
float16/bf16 |
ND |
维度为[1, dim_n],最后一维和x保持一致。 |
xStrides |
[x_shape] |
int64 |
ND |
x的stride步长,x_shape表示x的维度数,大于0,传入方式为host tensor,最后一个数需为1。 |
xOffset |
[1] |
int64 |
ND |
x的offset,需大于0,默认值为0,传入方式为host tensor。 |
参数 |
维度 |
数据类型 |
格式 |
描述 |
---|---|---|---|---|
output |
[dim_0, ..., dim_n-1, dim_n] |
float16/bf16 |
ND |
维度和x保持一致。 |