现有框架BatchNorm的实现(DP,DDP)都是只考虑了single gpu。也就是说BN使用的均值和标准差是单个gpu算的,相当于缩小了batchsize。
对于比较消耗显存的训练任务时,往往单卡上的相对批量过小,影响模型的收敛效果。 之前在在图像语义分割的实验中,就发现使用大模型的效果反而变差,实际上就是BN在作怪。 跨卡同步 Batch Normalization 可以使用全局的样本进行归一化,这样相当于‘增大‘了批量大小,这样训练效果不再受到使用 GPU 数量的影响。 最近在图像分割、物体检测的论文中,使用跨卡BN也会显著地提高实验效果,所以跨卡 BN 已然成为竞赛刷分、发论文的必备神器。
但是为什么跨卡同步BN没有成为主流?
1)因为没有sync的需求,因为对于大多数vision问题,单gpu上的mini-batch已经够大了,完全不会影响结果。
2)影响训练速度,BN layer通常是在网络结构里面广泛使用的,这样每次都同步一下GPUs,十分影响训练速度。
从使用的经验来看,如果多卡训练没开BN同步,那么所得的结果和使用单GPU训练得到的结果基本一致,但是训练速度会得到提升。
而如果开了BN同步,训练结果会有将近一个点的提升
当然如果多卡训,但是单张卡上的batchsize就很大了,这样是开BN同步就没有太大作用
开了BN之后会让训练速度变慢,大概是不开5秒,开了8秒的样子
多卡训练中的BN(BatchNorm)
于 2022-01-24 13:31:03 首次发布