用多GPU跑torch程序,DDP是最好的工具。在研究过程中基本是单机多GPU而不是多机多GPU,此处对单机多GPU的情况做一个总结。
import torch.DistributedDataParallel as DDP
import torch.distributed as dist
用法:
- 由于是单机多GPU,所以rank == local_rank. 使用argparse从外部获取–local_rank后,加入dist.init_process_group(backend=‘nccl’) 这一句话来初始化。
- 数据集方面。使用sampler = th.utils.data.distributed.DistributedSampler(training_set) 来定义training set 的sampler,这样可以保证在训练时,不同GPU使用不同(没有交集)的batch.注意!!!在测试的时候要想清楚测试数据的顺序是不是有影响。例如今天写的代码,要使用前四个测试数据来画图,这个时候shuffle要设为false, sampler也不用定义,一定不能惯性思维。batch_size的设置也要格外留意。
- 网络方面,要在.cuda()后加上model = DDP(model, device_ids=[dist.get_rank()], output_device=dist.get_rank()) # 再次强调,在单机多卡的情况下,rank == local_rank,所以在这里直接使用rank就行
- .cuda的问题。 在这里,模型和数据不能简单地input.cuda(), model.cuda(),而要在cuda()中指定device,否则会有数据和模型在不同 GPU上的情况。正确的做法是 input.cuda(torch.device(“cuda”, dist.get_rank())).
- 学习率要随着batch_size的变化而变化。batch_size增大几倍,学习率就要相应增大几倍。
本文详细介绍如何使用PyTorch的DistributedDataParallel (DDP)进行单机多GPU训练。包括初始化进程组、定义数据采样器、配置模型、处理输入数据及调整学习率等方面的关键步骤。
718

被折叠的 条评论
为什么被折叠?



