PyTorch训练(二):DP(DataParallel)【“单机多卡”训练模式】【简单方便、速度慢、GPU 负载不均衡】【不推荐使用DP,推荐使用DDP】[

本文介绍了PyTorch的DataParallel(DP)用于单机多卡训练的原理和使用方法,指出其简单易用但速度慢、GPU负载不均衡的缺点。通过实战示例展示了DP的实现步骤,包括模型和数据的修改以及运行命令。同时,文章提到了在使用DP时可能出现的loss.backward()报错问题及其解决方案,并建议使用DistributedDataParallel(DDP)代替DP。
摘要由CSDN通过智能技术生成

一、概述

我们知道 PyTorch 本身对于单机多卡提供了两种实现方式

  • DataParallel(DP):Parameter Server模式,一张卡位reducer,实现也超级简单,一行代码。
  • DistributedDataParallel(DDP):All-Reduce模式,本意是用来分布式训练,但是也可用于单机多卡。

DataParallel(DP)是基于Parameter server的算法,实现比较简单,只需在原单机单卡代码的基础上增加一行:

gpu_ids = [0, 2, 3]
model = nn.DataParallel(model, device_ids=gpu_id)

此时运行时就直接使用第0/2/3块GPU来并行训练

但是DP模式负载不均衡的问题比较严重,有时在模型较大的时候(比如bert-large),reducer的那张卡会多出3-4g的显存占用,并且速度也比较慢。

运行命令:CUDA_VISIBLE_DEVICES='0,2,3' python main.py

二、DataParallel使用(简单方便、较慢、GPU 负载不均衡、不推荐使用)

DataParallel 可以帮助我们(使用单进程控)将模型和数据加载到多个 GPU 中,控制数据在 GPU 之间的流动,协同不同 GPU 上的模型进行并行训练(细粒度的方法有 scatter,gather 等等)。

DataParallel 使用起来非常方便,我们只需要用 DataParallel 包装模型,再设置一些参数即可。需要定义的参数包括:参与训练的 GPU 有哪些,device_ids=gpus;用于汇总梯度的 GPU 是哪个,output_device=gpus[0] 。DataParallel 会自动帮我们将数据切分 load 到相应 GPU,将模型复制到相应 GPU,进行正向传播计算梯度并汇总:

model = nn.DataParallel(model.cuda(), device_ids=gpus, output_device=gpus[0])

值得注意的是,模型和数据都需要先 load 进 GPU 中,DataParallel 的 module 才能对其进行处理,否则会报错:

# 这里要 model.cuda()
model = nn.DataParallel(model.cuda(), device_ids=gpus, output_device=gpus[0])

for epoch in range(100):
   for batch_idx, (data, target) in enumerate(train_loader):
      # 这里要 images/target.cuda()
      images = images.cuda(non_blocking=True)
      target = target.cuda(non_blocking=True)
      .
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值