目前大家基本都在使用DistributedDataParallel(简称DDP)用来训练,该方法主要用于分布式训练,但也可以用在单机多卡。
第一步:初始化分布式环境,主要用来帮助进程间通信
torch.distributed.init_process_group(backend='nccl')
第二步:负责创建 args.local_rank 变量,并接受 torch.distributed.launch 注入的值
归根到底是创建一个变量,来接收torch.distributed.launch 注入。
目前代码中常见的两种方式:
local_rank = int(os.environ["LOCAL_RANK"]) # 这种是从自定义config文件中获取LOCAL_RANK
另外一种是parser:
parser = argparse.ArgumentParser()
parser.add_argument("--local_rank", type=int, default=-1)
args = parser.parse_args()
第三步:每个进程根据自己的local_rank设置应该使用的GPU
torch.cuda.set_device(args.local_rank)
torch.manual_seed(hps.train.seed) # 非必要,尽可能固定种子
第四步:分布式数据和模型
# 分布式数据
train_sampler = DistributedSampler(train_dataset)
train_loader = torch.utils.data