WelfordFinalize

功能说明

Welford计算是一种在线计算均值和方差的方法。一方面,它可以在不存储所有样本的情况下,逐步计算所有样本的均值和方差,更适合处理海量数据;另一方面,它只需要对数据进行一次遍历,能减少访存次数,提高计算性能。本接口为Welford算法的后处理。

LayerNorm算法中reduce轴较大的场景,可以通过切分reduce轴,联合使用本接口与WelfordUpdate,能够实现等效计算LayerNorm。本接口的计算公式如下:

函数原型

由于该接口的内部实现中涉及复杂的计算,需要额外的临时空间来存储计算过程中的中间变量。临时空间支持接口框架申请和开发者通过sharedTmpBuffer入参传入两种方式。

接口框架申请的方式,开发者需要预留临时空间;通过sharedTmpBuffer传入的情况,开发者需要为tensor申请空间。临时空间大小BufferSize的获取方式如下:通过WelfordFinalize Tiling中提供的GetWelfordFinalizeMaxMinTmpSize接口获取所需最大和最小临时空间大小,最小空间可以保证功能正确,最大空间用于提升性能。

参数说明

表1 模板参数说明

参数名

描述

isReuseSource

该参数预留,传入默认值false即可。

表2 接口参数说明

参数名

输入/输出

描述

outputMean

输出

均值目的操作数。

类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。

Atlas 推理系列产品AI Core,支持的数据类型为:float

Atlas A2 训练系列产品/Atlas 800I A2 推理产品,支持的数据类型为:float

outputVariance

输出

方差目的操作数。

类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。

Atlas 推理系列产品AI Core,支持的数据类型为:float

Atlas A2 训练系列产品/Atlas 800I A2 推理产品,支持的数据类型为:float

inputMean

输入

均值源操作数。shape为[abLength]。

类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。

Atlas 推理系列产品AI Core,支持的数据类型为:float

Atlas A2 训练系列产品/Atlas 800I A2 推理产品,支持的数据类型为:float

inputVariance

输入

方差源操作数。shape为[abLength]。

类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。

Atlas 推理系列产品AI Core,支持的数据类型为:float

Atlas A2 训练系列产品/Atlas 800I A2 推理产品,支持的数据类型为:float

counts

输入

源操作数。shape为[abLength]。

类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。

Atlas 推理系列产品AI Core,支持的数据类型为:int32_t

Atlas A2 训练系列产品/Atlas 800I A2 推理产品,支持的数据类型为:int32_t

sharedTmpBuffer

输入

临时空间。

类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。

Atlas 推理系列产品AI Core,支持的数据类型为:uint8_t

Atlas A2 训练系列产品/Atlas 800I A2 推理产品,支持的数据类型为:uint8_t

接口内部复杂计算时用于存储中间变量,由开发者提供。

临时空间大小BufferSize的获取方式请参考WelfordFinalize Tiling

para

输入

计算所需的参数信息。WelfordFinalizePara类型,定义如下。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
struct WelfordFinalizePara {
    uint32_t rnLength; 
    uint32_t abLength; 
    uint32_t headCount; 
    uint32_t headCountLength; 
    uint32_t tailCount;
    uint32_t tailCountLength; 
    float abRec; 
    float rRec; 
};
  • rnLength:输入的Reduce轴,按abLength为一次计算的大小,拆分的次数。如果拆分后有尾块,则次数向上取整。
  • abLength:Reduce轴拆分的大小。在不带counts参数的接口中,abLength=headCountLength+tailCountLength。
  • headCount:在不带counts参数的接口中使能该参数,作为公式中非尾块的counts系数,headCount值。
  • headCountLength:在不带counts参数的接口中使能该参数,headCount值对应的长度。
  • tailCount:在不带counts参数的接口中使能该参数,作为公式中尾块的counts系数,tailCount值。
  • tailCountLength:在不带counts参数的接口中使能该参数,tailCount值对应的长度。
  • abRec:abLength的倒数,即为1/abLength的值。
  • rRec:输入的Reduce轴拆分后,若没有尾块,表示1/(rnLength*abLength)的值,若有尾块,表示1/R的值。

返回值

支持的型号

Atlas 推理系列产品AI Core

Atlas A2 训练系列产品/Atlas 800I A2 推理产品

约束说明

调用示例

1
2
3
4
pipe.InitBuffer(sharedTmpBuffer, stackBufferSize);        
AscendC::LocalTensor<uint8_t> tmpLocalTensor = sharedTmpBuffer.Get<uint8_t>();         
struct AscendC::WelfordFinalizePara para = {rnLength, abLength, head, headLength, tail, tailLength, abRec, rRec};
AscendC::WelfordFinalize<false>(meanLocal, varianceLocal, inputMeanLocal, inputVarianceLocal, inputCountsLocal, tmpLocalTensor, para);