从PyTorch 0.2版本开始,PyTorch新增分布式GPU支持。
注意分布式和并行的区别:分布式是指有多个GPU在多台服务器上,而并行一般指的是一台服务器上的多个GPU。分布式涉及了服务器之间的通信,因此比较复杂,PyTorch封装了相应的接口,可以用几句简单的代码实现分布式训练。
分布式对普通用户来说比较遥远,因为搭建一个分布式集群的代价很大,使用也比较复杂。相比之下,一机多卡更现实。
如果服务器具有多个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)
于 2021-02-08 23:48:48 首次发布