BN多卡同步进行

为什么不进行多卡同步?

BatchNorm的实现都是只考虑了single gpu。也就是说BN使用的均值和标准差是单个gpu算的,相当于缩小了mini-batch size。至于为什么这样实现,1)因为没有sync的需求,因为对于大多数vision问题,单gpu上的mini-batch已经够大了,完全不会影响结果。2)影响训练速度,BN layer通常是在网络结构里面广泛使用的,这样每次都同步一下GPUs,十分影响训练速度。2

但是为了达到更好的效果, 实现Sync-BN也是很有意义的.

在深度学习平台框架中多数是采用数据并行的方式, 每个GPU卡上的中间数据没有关联.
为了实现跨卡同步BN, 在前向运算的时候需要计算全局的均值和方差,在后向运算时候计算全局梯度。 最简单的实现方法是先同步求均值,再发回各卡然后同步求方差,但是这样就同步了两次。实际上均值和方差可以放到一起求解, 只需要同步一次就可以. 数据并行的方式改为下图所示:

因此总体batch_size对应的均值和方差可以通过每张GPU中计算得到的 xi∑xi 和 x2i∑xi2 reduce相加得到. 在反向传播时也一样需要同步一次梯度信息.

原文: https://www.cnblogs.com/makefile/p/batch-norm.html?utm_source=debugrun&utm_medium=referral © 康行天下

posted @ 2019-03-21 11:28  you-wh  阅读(1123)  评论(0编辑  收藏  举报
Fork me on GitHub