FilesLast commitLast update
13 days ago
13 days ago
7 days ago
13 days ago
12 days ago
13 days ago
8 days ago
12 days ago
13 days ago
README

ReduceStdWithMean

产品支持情况

产品 是否支持
Ascend 950PR&950DT系列产品 √
Atlas A3系列产品 √
Atlas A2系列产品 √
Atlas 200I/500 A2推理产品 √
Atlas推理系列产品 √
Atlas训练系列产品 √

Ascend 950PR/950DT 由本自定义算子包提供 kernel 实现(arch35);其余产品由 CANN 内置算子库支持。Ascend 950PR/950DT、Atlas A3、Atlas A2 支持 float16 / float32 / bfloat16;其余产品支持 float16 / float32。

功能说明

给定外部预计算的均值 mean,沿指定维度 dim 计算输入 x 的标准差(invert=false)或其倒数(invert=true)。是 BatchNorm/LayerNorm/GroupNorm 归一化层统计量计算的关键子步骤,以及 PyTorch torch.std/torch.std_mean/torch.batch_norm_stats 在 NPU 上的底层实现。

标准差模式(invert=false,correction 生效):

y=∑j=0N−1(xj−meanj)2max⁡(0,  N−correction)y = \sqrt{\frac{\sum_{j=0}^{N-1}(x_j - mean_j)^2}{\max(0,\; N - correction)}}

标准差倒数模式(invert=true,固定除以 N、加 epsilon,忽略 correction):

y=11N∑j=0N−1(xj−meanj)2+ϵy = \frac{1}{\sqrt{\dfrac{1}{N}\sum_{j=0}^{N-1}(x_j - mean_j)^2 + \epsilon}}

其中 N=∏d∈dimshape[d]N=\prod_{d \in dim}\text{shape}[d] 为归约维度元素总数,correctioncorrection 为 Bessel 校正因子(0=总体、1=样本),ϵ\epsilon 为数值稳定小量。

ReduceStdWithMean 为 CANN 内部 L0 算子,被 aclnnStd、aclnnStdMeanCorrection、aclnnBatchNormStats 三个上层 aclnn 接口组合调用,不直接暴露独立 aclnn 接口。

上层接口 功能 correction invert eps
aclnnStd 独立标准差 用户传入 false —
aclnnStdMeanCorrection 同时输出 (std, mean) 用户传入 false 0.001(固定)
aclnnBatchNormStats 输出 (mean, invstd) 0(固定) true 用户传入

参数说明

参数名 输入/输出/属性 描述 数据类型 数据格式
x 输入 待计算标准差的张量。 FLOAT16、FLOAT、BFLOAT16 ND
mean 输入 外部预计算均值(已广播到 x 形状),dtype 与 x 一致。 与 x 一致 ND
y 输出 输出张量,dtype 与 x 一致;shape 由 dim + keepdim 推导。 与 x 一致 ND
dim 可选属性 归约维度,范围 [-rank(x), rank(x)-1],空表示全部维度。默认 {}。 ListInt -
unbiased 可选属性 Bessel 校正(legacy 字段)。默认 true。 Bool -
keepdim 可选属性 是否保留归约维为 size 1。默认 false。 Bool -
invert 可选属性 true 返回 1/sqrt(var+eps),false 返回 sqrt(var)。默认 false。 Bool -
epsilon 可选属性 数值稳定项(仅 invert=true 使用),须为非负浮点数。默认 0.001。 Float -
correction 可选属性 校正因子:0=总体,1=样本。默认 1。 Int -

约束说明

  • x 与 mean 数据类型须一致,仅支持 float16 / float32 / bfloat16;输出 dtype 与 x 一致。
  • x 的 shape 维度不超过 8 维。
  • 支持 rank=0 标量输入(x/mean 为 0-D):dim 为空全归约,输出为标量(keepdim=true 时输出 1-D size 1)。
  • mean 的 shape 须与 x 完全一致(mean 须已广播到 x 形状)。
  • dim 取值范围 [-rank(x), rank(x)-1],空表示全部维度归约,且不能包含重复轴(负数轴归一化后判重)。
  • 输出 y 的 shape 须与 dim + keepdim 推导结果一致。
  • correction 仅支持非负整数;invert=true 时忽略 correction,固定除以 N。
  • epsilon 仅支持非负浮点数(默认 0.001),tiling 阶段对 epsilon<0 返回错误。
  • unbiased 为 legacy 字段:correction 属性有值时以 correction 为准,无值时按 unbiased=true→correction=1、unbiased=false→correction=0 折算。
  • 空张量(N=0)输出 NaN;N<=correction(invert=false)输出 +Inf 或 NaN(一般输入为 +Inf,全等输入为 0×Inf=NaN)。
  • 输入含动态标记(-1/-2)时按动态 shape 处理,具体语义由下游框架定义。

调用说明

调用方式 样例代码 说明
GE图模式 test_geir_reduce_std_with_mean.cpp 通过 GE IR 构图调用,算子 IR 原型见 op_graph/reduce_std_with_mean_proto.h
aclnn API test_aclnn_std_mean_correction.cpp 通过 aclnnStdMeanCorrection 接口方式调用ReduceStdWithMean算子。
aclnn API test_aclnn_batch_norm_stats.cpp 通过 aclnnBatchNormStats 接口方式调用ReduceStdWithMean算子。
aclnn API test_aclnn_std.cpp 通过 aclnnStd 接口方式调用ReduceStdWithMean算子(该接口实现在同仓 math/reduce_std_v2)。