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

      从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并行计算教程_霹雳吧啦Wz-CSDN博客_pytorch多gpu并行训练

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

### 训练的基础概念 在PyTorch中,`torch.distributed` 是用于实现分布式训练的核心模块[^1]。它支持种后端(如 `gloo`, `mpi`, 和 `nccl`),并允许开发者灵活配置通信方式以适应不同的硬件环境。 #### 初始化分布式环境 要启动一个训练过程,首先需要初始化分布式环境。这通常通过设置 `init_method` 参数完成,可以指定为文件路径或URL地址以便各进程同步状态[^4]。以下是典型的初始化代码: ```python import torch import torch.distributed as dist from torch.nn.parallel import DistributedDataParallel as DDP def setup_distributed(rank, world_size): # 设置默认的GPU设备 torch.cuda.set_device(rank) # 初始化进程组 dist.init_process_group( backend='nccl', # 使用NCCL作为后端 init_method='env://', world_size=world_size, rank=rank ) ``` #### 构建分布式模型 一旦分布式环境被成功初始化,就可以使用 `DistributedDataParallel` 来封装模型实例[^2]。这样做的目的是让每个进程只负责一部分计算负载,并通过高效的参数同步机制保持一致性。 ```python model = YourModel().to(rank) ddp_model = DDP(model, device_ids=[rank]) ``` 上述代码片段展示了如何将自定义模型转换成适合分布式的版本。注意这里指定了 `device_ids` 参数,确保每张显仅处理属于自己的那一部分输入数据。 #### 数据加载器调整 对于大规模的数据集来说,在个节点上共享相同的数据可能会带来额外开销甚至冲突风险。因此推荐采用专门设计过的 `DistributedSampler` 类型采样器来替代普通的随机采样策略。 ```python train_sampler = torch.utils.data.distributed.DistributedSampler(dataset) dataloader = torch.utils.data.DataLoader( dataset, batch_size=batch_size, shuffle=False, # 当启用sampler时应禁用手动shuffle操作 num_workers=num_workers, sampler=train_sampler ) ``` 以上就是关于PyTorch下执行跨服务器间协同工作的基本流程介绍[^1]。值得注意的是虽然本文提到的方法主要针对GPU场景进行了优化讨论,但实际上整个框架同样适用于纯CPU架构下的情况只是性能表现会有所差异而已。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值