鲲鹏社区首页
中文
注册
开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

使用说明

接口定义

初始化GroupNormalizationLayerFWD。构造时需要传入输入矩阵、缩放矩阵、组大小、输出矩阵的tensor信息以及归一化的flag。

GroupNormalizationLayerFWD(const TensorInfo &srcInfo, const TensorInfo &scaleshiftInfo, SizeType groupSize, const TensorInfo &dstInfo, NormalizationFlags flags)->void
表1 GroupNormalizationLayerFWD函数输入参数

参数名称

数据类型

描述

取值范围

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,可选:

  • USE_GLOBAL_STATS使用传入的mean和var来计算。
  • USE_SCALE对归一化结果再放缩。
  • USE_SHIFT对归一化结果再偏移。

假设输入数据形状为{A,B,C}则在B维度上进行分组归一化,放缩和偏移操作也在B维度上进行。

执行算子运算。src和dst分别为输入和输出的指针,scale和shift为放缩和偏移,mean和variance为均值和方差的指针,saveStats表示是否保存计算的均值和方差。eps用于避免除0异常。

Run(const void *src, void *dst, const void *scale, const void *shift, float *mean, float *variance, bool saveStats, const float eps)->void
表2 Run函数输入参数

参数名称

数据类型

描述

取值范围

src

void*

输入指针。

-

dst

void*

输出指针。

-

scale

void*

放缩指针。

-

shift

void*

偏移指针。

-

mean

float*

均值指针。

-

variance

float*

方差指针。

-

saveStats

bool

是否保存计算方差。

布尔值

eps

float

避免除0异常。

浮点数

验证GrouplNormalizationLayerFWD的输入参数,并在算子构造过程中自动触发执行。

ValidateInput(const TensorInfo &srcInfo, const TensorInfo &scaleshiftInfo, SizeType groupInfo,const TensorInfo &dstInfo, NormalizationFlags flags)->KDNN::Status
表3 ValidateInput输入参数

参数名称

数据类型

描述

取值范围

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);