使用说明
接口定义
初始化GroupNormalizationLayerFWD。构造时需要传入输入矩阵、缩放矩阵、组大小、输出矩阵的tensor信息以及归一化的flag。
参数名称 |
数据类型 |
描述 |
取值范围 |
|---|---|---|---|
srcInfo |
KDNN::TensorInfo |
输入矩阵信息。 |
{shape{A, ... , D}, type, layout} |
scaleShiftInfo |
KDNN::TensorInfo |
缩放和偏移矩阵的信息。 |
{shape{D}, type, layout} |
groupSize |
KDNN::SizeType |
组大小。 |
无符号整型,在第二维度上分组的个数 |
dstInfo |
KDNN::TensorInfo |
输出矩阵信息。 |
{shape{A, ... , D}, type, layout} |
flags |
KDNN::NormalizationFlags |
枚举类,用于选择归一化方式。 |
默认NONE,可选:
|
假设输入数据形状为{A,B,C}则在B维度上进行分组归一化,放缩和偏移操作也在B维度上进行。
执行算子运算。src和dst分别为输入和输出的指针,scale和shift为放缩和偏移,mean和variance为均值和方差的指针,saveStats表示是否保存计算的均值和方差。eps用于避免除0异常。
参数名称 |
数据类型 |
描述 |
取值范围 |
|---|---|---|---|
src |
void* |
输入指针。 |
- |
dst |
void* |
输出指针。 |
- |
scale |
void* |
放缩指针。 |
- |
shift |
void* |
偏移指针。 |
- |
mean |
float* |
均值指针。 |
- |
variance |
float* |
方差指针。 |
- |
saveStats |
bool |
是否保存计算方差。 |
布尔值 |
eps |
float |
避免除0异常。 |
浮点数 |
验证GrouplNormalizationLayerFWD的输入参数,并在算子构造过程中自动触发执行。
参数名称 |
数据类型 |
描述 |
取值范围 |
|---|---|---|---|
srcInfo |
KDNN::TensorInfo |
src张量信息。 |
{shape{A, ... , D}, type, layout} |
scaleShiftInfo |
KDNN::TensorInfo |
scale张量信息。 |
{shape{D}, type, layout} |
groupSize |
KDNN::SizeType |
分组信息。 |
无符号整型,在第二维度上分组的个数 |
dstInfo |
KDNN::TensorInfo |
dst张量信息。 |
{shape{A, ... , D}, type, layout} |
flags |
KDNN::NormalizationFlags |
枚举类,用于选择归一化方式。 |
无符号整型 |
支持数据类型
TensorInfo对象初始化时需传入Shape、Type、Layout参数,此处列出为Type支持数据类型。
- GroupNormalizationLayerFWD支持fp16/fp32数据类型,以下是各个tensor初始化时可用的type类型。
表4 TensorInfo对象初始化时支持的Type类型 srcInfo
scaleShiftInfo
dstInfo
KDNN::Element::Type::F16(fp16)
KDNN::Element::Type::F16(fp16)
KDNN::Element::Type::F16(fp16)
KDNN::Element::Type::F32(float)
KDNN::Element::Type::F32(float)
KDNN::Element::Type::F32(float)
- 最高支持3D到5D 的tensor,支持顺序数据排布:abc、abcd、abcde。
对应KDNN::Layout::ABC、KDNN::Layout::ABCD、KDNN::Layout::ABCDE。
表5 TensorInfo对象初始化时支持的Layout类型 dimension
srcInfo数据排布
dstInfo数据排布
3D
abc
abc
4D
abcd
abcd
5D
abcde
abcde
使用示例
使用fp16数据类型组归一化,srcInfo数据排布为KDNN::Layout::ABCD,scaleShiftInfo数据排布为KDNN::Layout::A,dstInfo数据排布KDNN::Layout::ABCD。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | using SizeType = KDNN::SizeType; using Shape = KDNN::Shape; using Type KDNN::Element::TypeT Shape shape(4, 128, 18, 320); SizeType groupInfo = 2; //定义张量信息 TensorInfo srcInfo = {shape, Type::F16, KDNN::Layout::ABCD}; TensorInfo scaleShiftInfo = {{shape[1]}, Type::F16, KDNN::Layout::A}; TensorInfo dstInfo = {shape, Type::F16, KDNN::Layout::ABCD}; KDNN::NormalizationFlags flags = KDNN::NormalizationFlags::NONE; // 构造算子 KDNN::GroupNormalizationLayerFWD gnormLayer(srcInfo, scaleShiftInfo, groupInfo, dstInfo, flags); // 初始化矩阵数据 SizeType srcSize = srcInfo.GetTotalTensorSize(); SizeType dstSize = dstInfo.GetTotalTensorSize(); SizeType statSize = srcInfo.GetDims()[0] * groupInfo; SizeType scaleSize = scaleShiftInfo.GetTotalTensorSize(); __fp16 *src = (__fp16*)malloc(srcSize * sizeof(__fp16)); __fp16 *dst = (__fp16*)malloc(srcSize * sizeof(__fp16)); __fp16 *dstRef = (__fp16*)malloc(srcSize * sizeof(__fp16)); float *mean = (float *)malloc(statSize * sizeof(float)); float *variance = (float *)malloc(statSize * sizeof(float)); __fp16 *scale = (__fp16*)malloc(scaleSize * sizeof(__fp16)); __fp16 *shift = (__fp16*)malloc(scaleSize * sizeof(__fp16)); float eps = 1e-5; // 执行算子 gnormLayer.Run(src, dst, scale, shift, mean, variance, true, eps); |