分布式训练与单卡训练精度存在差异的几个原因

  • 一个主要因素是Batch norm。Batch norm依赖当前batch来计算均值和方差,而主流框架(tf,pytorch)的实现是在当前卡上计算这些统计量。显然单个卡上计算出来的统计量是不能代替整个并行batch的结果。考虑一个极端情形,每张卡batch size=1,这时候单卡的方差为0,而整个并行batch的方差不为0。所以单个sample的前向计算结果不一样,最后计算出来的梯度也不一样。深度学习中多GPU训练是否等价于增大batch size? - 小朱的回答 - 知乎

  • NLP 中经常有一个 batch 里各条数据长度不同需要 mask 的情况,而有时候损失函数是 per token 而不是 per sample 的。导致的结果就是,在做数据并行的时候,假如分到每张卡上的 batch 中 token 数量不同,那么总的梯度其实应该等价于每张卡上的梯度以某种方式加权平均(而不是直接平均)。实际实现的时候可以通过根据长度分桶等方式,使得每张卡上的有效 token 数量差异不大,然后所有卡直接平均即可。

  • Numeric stability,由于计算机浮点数的舍入误差,运算的结合律在一定规模下是不成立的。比如对于一个只有1位精度的浮点数,(1+0.5)+0.5=2+0.5=4,0.5在每次加法中因为舍入产生了一次进位,但是换一个计算顺序,我们又有1+(0.5+0.5)=1+1=2。因此不同的计算顺序可能得到不同的计算结果,从而产生差异。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值