torch.DistributedDataParallel复盘

用多GPU跑torch程序,DDP是最好的工具。在研究过程中基本是单机多GPU而不是多机多GPU,此处对单机多GPU的情况做一个总结。
import torch.DistributedDataParallel as DDP
import torch.distributed as dist
用法:

  1. 由于是单机多GPU,所以rank == local_rank. 使用argparse从外部获取–local_rank后,加入dist.init_process_group(backend=‘nccl’) 这一句话来初始化。
  2. 数据集方面。使用sampler = th.utils.data.distributed.DistributedSampler(training_set) 来定义training set 的sampler,这样可以保证在训练时,不同GPU使用不同(没有交集)的batch.注意!!!在测试的时候要想清楚测试数据的顺序是不是有影响。例如今天写的代码,要使用前四个测试数据来画图,这个时候shuffle要设为false, sampler也不用定义,一定不能惯性思维。batch_size的设置也要格外留意。
  3. 网络方面,要在.cuda()后加上model = DDP(model, device_ids=[dist.get_rank()], output_device=dist.get_rank()) # 再次强调,在单机多卡的情况下,rank == local_rank,所以在这里直接使用rank就行
  4. .cuda的问题。 在这里,模型和数据不能简单地input.cuda(), model.cuda(),而要在cuda()中指定device,否则会有数据和模型在不同 GPU上的情况。正确的做法是 input.cuda(torch.device(“cuda”, dist.get_rank())).
  5. 学习率要随着batch_size的变化而变化。batch_size增大几倍,学习率就要相应增大几倍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值