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

使用说明

接口定义

初始化NormalizationLayerFWD。构造时需要传入输入矩阵、缩放矩阵、输出矩阵的tensor信息,其中statsinfo是均值和方差的描述信息。

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

参数名称

数据类型

描述

取值范围

srcInfo

KDNN::TensorInfo

输入矩阵信息。

{shape{A, ... , D}, type, layout}

statsInfo

KDNN::TensorInfo

均值和方差的信息。

{shape{A, ...}, type, layout}

scaleShiftInfo

KDNN::TensorInfo

缩放矩阵信息。

{shape{D}, type, layout}

dstInfo

KDNN::TensorInfo

输出矩阵信息。

{shape{A, ... , D}, type, layout}

flags

KDNN::NormalizationFlags

枚举类,用于选择归一化方式。

默认NONE,可选以下参数:

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

执行算子运算。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异常。

浮点数

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

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

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

参数名称

数据类型

描述

取值范围

srcInfo

KDNN::TensorInfo

输入矩阵信息。

{shape{A, ... , D}, type, layout}

statsInfo

KDNN::TensorInfo

均值和方差的信息。

{shape{A, ...}, type, layout}

scaleShiftInfo

KDNN::TensorInfo

缩放矩阵信息。

{shape{D}, type, layout}

dstInfo

KDNN::TensorInfo

输出矩阵信息。

{shape{A, ... , D}, type, layout}

flags

KDNN::NormalizationFlags

枚举类,用于选择归一化方式。

默认NONE,可选

  • USE_GLOBAL_STATS
  • USE_SCALE
  • USE_SHIFT
  • FUSE_NORM_RELU

支持数据类型

  • NormalizationLayerFWD支持fp16/fp32数据类型。(TensorInfo对象初始化时需传入Shape、Type、Layout参数,此处列出为Type支持数据类型。)
    表4 TensorInfo对象初始化时支持的Type类型

    srcInfo

    statInfo

    scaleShiftInfo

    dstInfo

    KDNN::Element::Type::F16(fp16)

    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)

    KDNN::Element::Type::F32(float)

  • 最高支持5Dtensor,支持顺序数据排布:a、ab、abc、abcd、abcde。

    对应KDNN::Layout::A、KDNN::Layout::AB、KDNN::Layout::ABC、KDNN::Layout::ABCD、KDNN::Layout::ABCDE。

    表5 TensorInfo对象初始化时支持的Layout类型

    dimension

    srcInfo数据排布

    dstInfo数据排布

    2D

    ab

    ab

    3D

    abc

    abc

    4D

    abcd

    abcd

    5D

    abcde

    abcde

使用示例

使用float数据类型层归一化,srcInfo数据排布为KDNN::Layout::ABCDE,statInfo数据排布为KDNN::Layout::ABCD,scaleShiftInfo数据排布为KDNN::Layout::A,dstInfo数据排布KDNN::Layout::ABCDE。

 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(5, 5, 5, 5, 5);
// 定义张量信息
TensorInfo srcInfo = {shape, TypeF32, KDNN::Layout::ABCDE};
TensorInfo statInfo = {{shape[0], shape[1], shape[2], shape[3]}, TypeF32, KDNN::Layout::ABCD};
TensorInfo scaleShiftInfo = {{shape[4]}, TypeF32, KDNN::Layout::A};
TensorInfo dstInfo = {shape, TypeF32, KDNN::Layout::ABCDE};
KDNN::NormalizationFlags flags = KDNN::NormalizationFlags::NONE;
// 算子构造
KDNN::NormalizationLayerFWD lnormLayer(srcInfo, statInfo, scaleShiftInfo, dstInfo,
flags);
// 初始化矩阵数据
SizeType srcSize = srcInfo.GetTotalTensorSize();
SizeType dstSize = dstInfo.GetTotalTensorSize();
SizeType statSize = statInfo.GetTotalTensorSize();
SizeType innerSize = scaleShiftInfo.GetTotalTensorSize();
float *src = (float *)malloc(srcSize * sizeof(float));
float *dst = (float *)malloc(dstSize * sizeof(float));
float *dstRef = (float *)malloc(dstSize * sizeof(float));
float *mean = (float *)malloc(statSize * sizeof(float));
float *variance = (float *)malloc(statSize * sizeof(float));
float *scale = (float *)malloc(innerSize * sizeof(float));
float *shift = (float *)malloc(innerSize * sizeof(float));
float eps = 1e-5;
// 执行算子
lnormLayer.Run(src, dst, scale, shift, mean, variance, true, eps);