Pytorch(十一) —— 分布式(多GPU/多卡)训练 并行 (DP & DDP)

      从PyTorch 0.2版本开始,PyTorch新增分布式GPU支持

      注意分布式和并行的区别:分布式是指有多个GPU在多台服务器上,而并行一般指的是一台服务器上的多个GPU。分布式涉及了服务器之间的通信,因此比较复杂,PyTorch封装了相应的接口,可以用几句简单的代码实现分布式训练。

       分布式对普通用户来说比较遥远,因为搭建一个分布式集群的代价很大,使用也比较复杂。相比之下,一机多卡更现实

Pytorch(十一) —— 分布式(多GPU/多卡)训练 并行 (DP & DDP)_第1张图片

       如果服务器具有多个GPU,tensor.cuda()方法会将tensor保存到第一块GPU上,等价于tensor.cuda(0)。此时如果想使用第二块GPU,需手动指定tensor.cuda(1)

Pytorch多卡训练的原理

(1)将模型加载到一个指定的主GPU上,然后将模型复制(浅拷贝)到其它的从GPU上;

(2)将总的batch数据等分到不同的GPU上进行计算(坑:需要先将数据加载到主GPU上);

(3)每个GPU根据自己分配到的数据进行forward计算得到loss,并通过backward得到权重梯度;

(4)得到的输出在主GPU上进行汇总,主GPU将所有从GPU得到的梯度进行合并并更新主GPU上的权值。再将更新后的模型参数复制到其他GPU 中

要区分DP和DDP,不能这么笼统地说,二者不一样

主 GPU 默认情况下是 0 号 GPU,也可以通过 torch.cuda.set_device(id) 来手动更改默认 GPU。

Pytorch中多GPU并行计算(分布式)

我们主要谈论的是单主机多GPU(单机多卡)训练

  • DataParallel(DP) 实现简单,代码量较少,启动速度快一点。但速度较慢,且存在负载不均衡的问题。单进程,多线程主卡显存占用比其他卡会多很多。不支持 Apex 的混合精度训练。是Pytorch官方很久之前给的一种方案。
  • DistributedDataParallel(DDP)   All-Reduce模式,本意是用来分布式训练(多机多卡),但是也可用于单机多卡。配置稍复杂。多进程数据分配较均衡。是新一代的多卡训练方法。使用torch.distributed 库。

现在都是用DistributedDataParallel

使用DistributedDataParallel,需要用torch.distributed.launch去launch程序,
 

DP的话就像这样

Pytorch(十一) —— 分布式(多GPU/多卡)训练 并行 (DP & DDP)_第2张图片

所有的卡都是一个进程

Pytorch中多GPU并行计算教程_霹雳吧啦Wz-CSDN博客_pytorch多gpu并行训练

Pytorch中多GPU并行计算教程_霹雳吧啦Wz-CSDN博客_pytorch多gpu并行训练

你可能感兴趣的:(Pytorch)