跑用户的一个模型,单机单卡、单机单卡关闭L2Decay、多机nccl2接口分布式、多机fleet接口分布式下,均出现batch_norm_grad获取的conv1_bn_offset@GRAD的shape为0,见下图log。
该错误在上述不同单机多机下的表现形式又不一样:
fleet多机运行出现allreduce中tensor未初始化现象
nccl2的log中,conv1_bn_offset@GRAD应该初始化了的,不过size仍然为0。且在之后的L2Decay正则化过程中,shape被_generated_var_0给重新扭回去了
单机单卡中,size也为0,且在L2Decay中shape给Infer回去了
单机单卡未加正则化,size一样为0,且在MomentumOp中出错。
分布式开fuse策略,一开始conv1_bn_offset@GRAD的shape正常。原因在fuse的时候直接用的给grad赋param Shape。
Paddle/paddle/fluid/operators/coalesce_tensor_op.cc
Lines 70 to 74 in 40f0905
Paddle/paddle/fluid/operators/batch_norm_op.cc
Lines 447 to 451 in 65c8eac
Lines 466 to 469 in 65c8eac
framework::GradVarName("Scale")
不过有个有个问题,是否用户有一个冻结一个不冻结的需求?
Line 568 in 65c8eac
上面的错误有很多环节都出了问题
是否有Scale和Bias一个可训练,一个不可训练的需求
#21801 这个PR解决了前两个问题。
第5个问题: 用户的代码中在使用nccl2接口时设置build_strategy.memory_optimize为True,fleet接口未设置。 设置为True时,shape={0}的tensor会初始化,未设置时shape={0}的tensor不初始化。
因为显存复用策略可能会让它初始化
同时这个策略不推荐使用了,没必要设置这个。
现象
fleet多机运行出现allreduce中tensor未初始化现象

nccl2的log中,conv1_bn_offset@GRAD应该初始化了的,不过size仍然为0。且在之后的L2Decay正则化过程中,shape被_generated_var_0给重新扭回去了


单机单卡中,size也为0,且在L2Decay中shape给Infer回去了

单机单卡未加正则化,size一样为0,且在MomentumOp中出错。

分布式开fuse策略,一开始conv1_bn_offset@GRAD的shape正常。原因在fuse的时候直接用的给grad赋param Shape。

Paddle/paddle/fluid/operators/coalesce_tensor_op.cc
Lines 70 to 74 in 40f0905
原因分析
Paddle/paddle/fluid/operators/batch_norm_op.cc
Lines 447 to 451 in 65c8eac
Paddle/paddle/fluid/operators/batch_norm_op.cc
Lines 466 to 469 in 65c8eac
上面代码段中,当没有
framework::GradVarName("Scale")
时则不会给Bias的梯度赋Shape,恰好符合log中的情况。后查阅用户代码,其中有一段逻辑写的或许不太符合常理。其中scale设置为冻结参数,bias却是可学习的。
后询问用户,这个写的是有问题的,一般要么两者都可学习,要么两者都冻结。
在paddle实际计算grad norm梯度的过程也是这么处理的。
不过有个有个问题,是否用户有一个冻结一个不冻结的需求?
Paddle/paddle/fluid/operators/batch_norm_op.cc
Line 568 in 65c8eac
总结
上面的错误有很多环节都出了问题
是否有Scale和Bias一个可训练,一个不可训练的需求