Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.
MVNV2(Mean Variance Normalization V2)是均值方差归一化算子:对输入张量 x 沿指定 axes 计算均值 mean 与标准差 std,然后执行 y = (x - mean) / (std + eps),使归一化后的输出均值为 0、方差为 1。它对齐 ONNX MeanVarianceNormalization 算子,是 Caffe MVN 的 V2 版本(接口更灵活,用 axes 列表指定规约轴,而非 across_channels/normalize_variance 布尔开关)。
MVNV2
x
axes
mean
std
y = (x - mean) / (std + eps)
MeanVarianceNormalization
MVN
across_channels
normalize_variance
MVN 归一化与 BatchNorm/InstanceNorm/LayerNorm 类似都是减均值除标准差,但 MVN 的规约轴由 axes 任意指定(默认 [0, 2, 3] 即跨 batch 与空间维、per-channel),且无可学习参数(gamma/beta),是纯统计归一化。
[0, 2, 3]
gamma
beta
从算子本质看,MVNV2 是含 规约求均值(reduce_sum + 除 N)+ 残差减(x-mean)+ 方差规约((x-mean)² 的 reduce_sum + 除 N)+ sqrt + 归一化除 的浮点运算。其核心难点在 NPU 上的高效实现:沿 axes 的 reduce_sum(多核切分按非规约轴)、均值/方差的广播对齐、sqrt 的精度(Newton 迭代)、fp16 输入的 fp32 中间精度、5 步融合为单 kernel 省中间 tensor。
给定输入 x=[N,C,H,W]、属性 eps、axes(默认 [0,2,3]),输出 y shape 同 x:
x=[N,C,H,W]
eps
[0,2,3]
y
mean = reduce_mean(x, axes, keepdim=True) var = reduce_mean((x - mean)², axes, keepdim=True) std = sqrt(var) y = (x - mean) / (std + eps)
约束:x 4-D NCHW;dtype float16/float32;axes 元素在 [0,3] 内。
[0,3]
本次需求要点:
aclnnMVNV2
aclnnMVNV2GetWorkspaceSize
ascend950
Ascend 950PR/950DT
sub
div
/workspace/chenjialiang/Ascend/cann-9.1.0/
nn_norm_ops.h
ops_proto_legacy.h
aic-ascend950-ops-info-legacy.json
ops_legacy/mvn_v2.py
/workspace/chenjialiang/Ascend
source.md
输入:
[N, C, H, W]
1e-9
计算:
# 沿 axes 规约(默认 [0,2,3],即每个 channel c 独立地在所有 batch×空间位置上统计) mean = reduce_mean(x, axes, keepdim=True) # [1, C, 1, 1] var = reduce_mean((x - mean)², axes, keepdim=True) # [1, C, 1, 1] std = sqrt(var) # [1, C, 1, 1] y = (x - mean) / (std + eps) # 广播逐元素
展开:
y[n, c, h, w] = (x[n, c, h, w] - mean[c]) / (std[c] + eps)
其中 mean[c] = (1/(N*H*W)) * Σ_{n,h,w} x[n,c,h,w],std[c] = sqrt((1/(N*H*W)) * Σ_{n,h,w} (x[n,c,h,w]-mean[c])²)。
mean[c] = (1/(N*H*W)) * Σ_{n,h,w} x[n,c,h,w]
std[c] = sqrt((1/(N*H*W)) * Σ_{n,h,w} (x[n,c,h,w]-mean[c])²)
输出 y:4-D NCHW [N, C, H, W],dtype 同 x。
要点:
axes=[0,2,3]
across_channels=true, normalize_variance=true
[2,3]
[0,1,2,3]
std + eps
std=0
reduce_sum
vmuls(1/num)
vmul
(x-mean)²
vmuls
vsqrt
vdiv
high_precision
MVNV2 的反向梯度为标准归一化反向:对 y = (x - mean) / (std + eps),考虑 mean/std 对 x 的依赖:
grad_x = (grad_y - mean(grad_y) - (x-mean) * mean(grad_y * (x-mean)) / (var + eps)) / (std + eps)
(沿 axes 规约 mean 项)。CANN 未提供独立 MVNV2Grad 算子(反向通常由框架 autograd 或 MVNGrad 处理,或推理场景不需反向)。
MVNV2Grad
MVNGrad
cannbot长尾算子团队
Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.
Backgroud(背景信息)
1 需求背景
MVNV2(Mean Variance Normalization V2)是均值方差归一化算子:对输入张量x沿指定axes计算均值mean与标准差std,然后执行y = (x - mean) / (std + eps),使归一化后的输出均值为 0、方差为 1。它对齐 ONNXMeanVarianceNormalization算子,是 CaffeMVN的 V2 版本(接口更灵活,用axes列表指定规约轴,而非across_channels/normalize_variance布尔开关)。MVN 归一化与 BatchNorm/InstanceNorm/LayerNorm 类似都是减均值除标准差,但 MVN 的规约轴由
axes任意指定(默认[0, 2, 3]即跨 batch 与空间维、per-channel),且无可学习参数(gamma/beta),是纯统计归一化。从算子本质看,
MVNV2是含 规约求均值(reduce_sum + 除 N)+ 残差减(x-mean)+ 方差规约((x-mean)² 的 reduce_sum + 除 N)+ sqrt + 归一化除 的浮点运算。其核心难点在 NPU 上的高效实现:沿axes的 reduce_sum(多核切分按非规约轴)、均值/方差的广播对齐、sqrt 的精度(Newton 迭代)、fp16 输入的 fp32 中间精度、5 步融合为单 kernel 省中间 tensor。给定输入
x=[N,C,H,W]、属性eps、axes(默认[0,2,3]),输出yshape 同x:约束:
x4-D NCHW;dtype float16/float32;axes元素在[0,3]内。本次需求要点:
MVNV2(op_typeMVNV2,aclnn 函数aclnnMVNV2/aclnnMVNV2GetWorkspaceSize,待新建)。ascend950(假设,采用 skill 默认Ascend 950PR/950DT)。MeanVarianceNormalization(语义基准);PyTorchmean+std+sub+div基础算子组合(数学等价)。TensorFlow 无原生对应。x/yfloat16/float32(对齐 CANN 内置 GE REG_OP + ops-info)。/workspace/chenjialiang/Ascend/cann-9.1.0/)内置 GE REG_OP(nn_norm_ops.h/ops_proto_legacy.h)+ ops-info(aic-ascend950-ops-info-legacy.json)+ legacy TBE/DSL kernel(ops_legacy/mvn_v2.py)。/workspace/chenjialiang/Ascend下的 toolkit 包(cann-9.1.0)。2 模型分析
source.md
2.1 算子数学背景
2.1.1 功能定义
MVNV2(Mean Variance Normalization V2)是均值方差归一化算子:对输入张量x沿指定axes计算均值mean与标准差std,然后执行y = (x - mean) / (std + eps),使归一化后的输出均值为 0、方差为 1。它对齐 ONNXMeanVarianceNormalization算子,是 CaffeMVN的 V2 版本(接口更灵活,用axes列表指定规约轴,而非across_channels/normalize_variance布尔开关)。MVN 归一化与 BatchNorm/InstanceNorm/LayerNorm 类似都是减均值除标准差,但 MVN 的规约轴由
axes任意指定(默认[0, 2, 3]即跨 batch 与空间维、per-channel),且无可学习参数(gamma/beta),是纯统计归一化。2.1.2 前向公式
输入:
x:4-D NCHW 张量[N, C, H, W],dtype float16/float32。eps:float,防除零的小常数,默认1e-9。axes:listInt,规约轴列表,默认[0, 2, 3](跨 N、H、W 维,per-channel 归一化)。计算:
展开:
其中
mean[c] = (1/(N*H*W)) * Σ_{n,h,w} x[n,c,h,w],std[c] = sqrt((1/(N*H*W)) * Σ_{n,h,w} (x[n,c,h,w]-mean[c])²)。输出
y:4-D NCHW[N, C, H, W],dtype 同x。要点:
axes=[0,2,3]对应 per-channel 归一化(每个 channel 独立统计跨 N×H×W 的均值/方差),等价于MVN的across_channels=true, normalize_variance=true。axes可改为[2,3](per-sample-per-channel,即 InstanceNorm 风格)或[0,1,2,3](全局归一化)等。eps加在std上(std + eps),防std=0时除零。reduce_sum+vmuls(1/num)求 mean(而非 reduce_mean),vmul求(x-mean)²,reduce_sum+vmuls求 var,vsqrt求 std,vdiv归一化。sqrt 用 Newton 迭代提升精度(high_precision模式 3 次迭代)。gamma/beta仿射)。2.1.3 反向(梯度)
MVNV2的反向梯度为标准归一化反向:对y = (x - mean) / (std + eps),考虑mean/std对x的依赖:(沿 axes 规约 mean 项)。CANN 未提供独立
MVNV2Grad算子(反向通常由框架 autograd 或MVNGrad处理,或推理场景不需反向)。Origin(信息来源)
cannbot长尾算子团队
Benefit / Necessity (价值/作用)
Design(设计方案)