已关闭
[Requirement|需求建议]: A5新增MVNV2算子 #4878
Davon创建于  19 天前关闭于  18 天前
Davon成员
19 天前 创建

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。它对齐 ONNX MeanVarianceNormalization 算子,是 Caffe MVN 的 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]、属性 epsaxes(默认 [0,2,3]),输出 y shape 同 x

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] 内。

本次需求要点:

  • 目标算子MVNV2(op_type MVNV2,aclnn 函数 aclnnMVNV2 / aclnnMVNV2GetWorkspaceSize,待新建)。
  • 目标芯片ascend950(假设,采用 skill 默认 Ascend 950PR/950DT)。
  • 开发方式:使用 Ascend C(registry-invoke)开发单算子。
  • 对标参考:ONNX MeanVarianceNormalization(语义基准);PyTorch mean+std+sub+div 基础算子组合(数学等价)。TensorFlow 无原生对应。
  • 支持数据类型x/y float16/float32(对齐 CANN 内置 GE REG_OP + ops-info)。
  • 参考基线:CANN toolkit(/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)。
  • toolkit:使用 /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。它对齐 ONNX MeanVarianceNormalization 算子,是 Caffe MVN 的 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 归一化)。

计算:

# 沿 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])²)

输出 y:4-D NCHW [N, C, H, W],dtype 同 x

要点:

  • 默认 axes=[0,2,3] 对应 per-channel 归一化(每个 channel 独立统计跨 N×H×W 的均值/方差),等价于 MVNacross_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 次迭代)。
  • dtype float16/float32;fp16 内部可能升 fp32 计算 reduce/sqrt 保精度。
  • 无可学习参数(纯统计归一化,非 BatchNorm 的 gamma/beta 仿射)。

2.1.3 反向(梯度)

MVNV2 的反向梯度为标准归一化反向:对 y = (x - mean) / (std + eps),考虑 mean/stdx 的依赖:

grad_x = (grad_y - mean(grad_y) - (x-mean) * mean(grad_y * (x-mean)) / (var + eps)) / (std + eps)

(沿 axes 规约 mean 项)。CANN 未提供独立 MVNV2Grad 算子(反向通常由框架 autograd 或 MVNGrad 处理,或推理场景不需反向)。

Origin(信息来源)

cannbot长尾算子团队

Benefit / Necessity (价值/作用)

Design(设计方案)

likedislike
DDavon成员
19 天前 添加了label:requirement
yuning_chenyuning_chen成员
19 天前 将 Davon14272 设为负责人
CANN-robotCANN-robot成员
18 天前 关闭了 issue
CANN-robotCANN-robot成员
18 天前 添加了label:resolved