Skip to content

  • 体验新版
    • 正在加载...
  • 登录
  • PaddlePaddle
  • Paddle
  • Issue
  • #21804

P
Paddle
  • 项目概览

PaddlePaddle / Paddle
大约 2 年 前同步成功

通知 2325
Star 20933
Fork 5424
  • 代码
    • 文件
    • 提交
    • 分支
    • Tags
    • 贡献者
    • 分支图
    • Diff
  • Issue 1423
    • 列表
    • 看板
    • 标记
    • 里程碑
  • 合并请求 543
  • Wiki 0
    • Wiki
  • 分析
    • 仓库
    • DevOps
  • 项目成员
  • Pages
P
Paddle
  • 项目概览
    • 项目概览
    • 详情
    • 发布
  • 仓库
    • 仓库
    • 文件
    • 提交
    • 分支
    • 标签
    • 贡献者
    • 分支图
    • 比较
  • Issue 1,423
    • Issue 1,423
    • 列表
    • 看板
    • 标记
    • 里程碑
  • 合并请求 543
    • 合并请求 543
  • Pages
  • 分析
    • 分析
    • 仓库分析
    • DevOps
  • Wiki 0
    • Wiki
  • 成员
    • 成员
  • 收起侧边栏
  • 动态
  • 分支图
  • 创建新Issue
  • 提交
  • Issue看板
已关闭
开放中
Opened 12月 18, 2019 by saxon_zh@saxon_zhGuest

batch_norm_grad输出的Output为0,导致后续出错

Created by: wangxicoding

现象

跑用户的一个模型,单机单卡、单机单卡关闭L2Decay、多机nccl2接口分布式、多机fleet接口分布式下,均出现batch_norm_grad获取的conv1_bn_offset@GRAD的shape为0,见下图log。 image

该错误在上述不同单机多机下的表现形式又不一样:

  1. fleet多机运行出现allreduce中tensor未初始化现象 image

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

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

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

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

https://github.com/PaddlePaddle/Paddle/blob/40f0905852e3bfcedb3e3b0f30531142dda51477/paddle/fluid/operators/coalesce_tensor_op.cc#L70-L74

原因分析

  1. batch norm中代码问题 https://github.com/PaddlePaddle/Paddle/blob/65c8eac9fe4cfeff0b4da172125163f082bad9b2/paddle/fluid/operators/batch_norm_op.cc#L447-L451 https://github.com/PaddlePaddle/Paddle/blob/65c8eac9fe4cfeff0b4da172125163f082bad9b2/paddle/fluid/operators/batch_norm_op.cc#L466-L469 上面代码段中,当没有framework::GradVarName("Scale")时则不会给Bias的梯度赋Shape,恰好符合log中的情况。
  2. 用户代码问题 后查阅用户代码,其中有一段逻辑写的或许不太符合常理。其中scale设置为冻结参数,bias却是可学习的。 4404EA4C12E01A443C31FF4854590DBA 后询问用户,这个写的是有问题的,一般要么两者都可学习,要么两者都冻结。 在paddle实际计算grad norm梯度的过程也是这么处理的。不过有个有个问题,是否用户有一个冻结一个不冻结的需求? https://github.com/PaddlePaddle/Paddle/blob/65c8eac9fe4cfeff0b4da172125163f082bad9b2/paddle/fluid/operators/batch_norm_op.cc#L568

总结

上面的错误有很多环节都出了问题

  1. batch_norm_grad的Infer Shape出了问题,需要修复。另:是否有Scale和Bias一个可训练,一个不可训练的需求
  2. allreduce对于shape的判断不严谨,需要有>0的判断
  3. WeightDecay中对于shape没有加判断,导致错误的shape也能使用,且给Infer回去了。
  4. fuse策略下直接给grad赋param的Shape值,这个没有问题,不过却绕过了此issue中的错误。
  5. nccl2接口和fleet接口,size为0的tensor,一个初始化了,一个未初始化,和fleet加的策略有关系,需查明。
指派人
分配到
无
里程碑
无
分配里程碑
工时统计
无
截止日期
无
标识: paddlepaddle/Paddle#21804
渝ICP备2023009037号

京公网安备11010502055752号

网络110报警服务 Powered by GitLab CE v13.7
开源知识
Git 入门 Pro Git 电子书 在线学 Git
Markdown 基础入门 IT 技术知识开源图谱
帮助
使用手册 反馈建议 博客
《GitCode 隐私声明》 《GitCode 服务条款》 关于GitCode
Powered by GitLab CE v13.7