多卡训练中的BN(BatchNorm)

     现有框架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秒的样子

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
MPI(Message Passing Interface)是一种并行计算的标准,可以实现跨节点的数据通信和计算任务分配。在多卡训练,我们可以使用MPI来实现多个GPU之间的数据通信和计算协同。 在使用MPI进行多卡训练时,需要使用mpiexec命令来启动训练程序。mpiexec命令可以指定使用的GPU数量和每个GPU使用的进程数,例如: ``` mpiexec -n 4 -bind-to none python train.py ``` 其,-n参数指定了使用的进程数量,这里使用4个进程,即使用4个GPU进行训练;-bind-to none参数表示不绑定进程和CPU核心,可以让MPI自动进行进程和GPU的分配;train.py为训练程序的入口文件。 在训练程序,可以使用MPI相关的库进行数据通信和计算协同。例如,使用mpi4py库可以实现Python程序与MPI的交互,可以使用MPI的发送和接收函数进行数据传输,例如: ``` from mpi4py import MPI comm = MPI.COMM_WORLD rank = comm.Get_rank() size = comm.Get_size() if rank == 0: data = [i for i in range(10)] comm.send(data, dest=1) elif rank == 1: data = comm.recv(source=0) print(data) ``` 在这个例子,使用MPI的COMM_WORLD对象获取进程的rank和size信息,rank为进程的编号,size为进程的总数。使用comm.send函数将数据发送给编号为1的进程,使用comm.recv函数从编号为0的进程接收数据,并打印接收到的数据。 这只是一个简单的例子,实际上在多卡训练需要更复杂的数据通信和计算协同。但是使用MPI可以很好地实现多卡训练,并发挥多GPU的计算能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值