torch.nn.parallel.DistributedDataParallel 使用笔记

1、报错:

ERROR: Unexpected bus error encountered in worker. This might be caused by insufficient shared memory (shm).

是由于在DataLoader中的num_workers设置过大,系统的共享内存不够用。

Please note that PyTorch uses shared memory to share data between processes, so if torch multiprocessing is used (e.g. for multithreaded data loaders) the default shared memory segment size that container runs with is not enough
所以,减小num_workers的数量。

2、

torch.distributed.init_process_group(backend='nccl', init_method="env://")

backend: 不同GPU通信的后端, 实际上是多个机器之间交换数据的协议
init_method: 机器(GPU)之间交换数据, 需要指定一个主节点, 而这个参数就是指定主节点的

3、

torch.utils.data.DataLoader()中,如果设置了sampler参数,那么,shuffle参数的值应该设置为FALSE,这两个参数是互斥的。

train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset)
opt.batchSize = int(opt.batchSize / opt.ngpus_per_node)
train_dataloader = DataLoader(train_dataset, batch_size=opt.batchSize, collate_fn=collafe_fn,
                              shuffle=False, drop_last=True, num_workers=4, pin_memory=True, sampler=train_sampler)

在每个epoch开始,执行:

train_sampler.set_epoch(epoch)

原因:

In distributed mode, calling the set_epoch method is needed to make shuffling work; each process will use the same random seed otherwise.

4、

分布式训练的流程,参考这个github:https://github.com/tczhangzhi/pytorch-distributed

 

torch.nn.parallel.DistributedDataParallel()方法封装的模型,forword()函数和backward()函数必须交替执行。如果执行多个(次)forward()然后执行一次backward(), 会报错。但是,在GAN-based 模型中,将多个discriminator的判别结果进行相加,然后再执行backwar()通常是常见,此时,解决方法如下:

(1)discriminator要同时接受real data 和fake data,并返回关于real data 和 fake data的判别结果,这样就避免了对真假数据的判别需要调用两次discriminator。

(2)不同的discriminator在torch.nn.parallel.DistributedDataParallel()中,使用process_group参数,封装到不同的进程组中。process_group的参数使用如下的语句来创建:

torch.distributed.new_group(range(torch.distributed.get_world_size()))

(3)对于torch.nn.parallel.DistributedDataParallel()封装的模型,在保存checkpoint时,需要注意,不同进程的不要对写同一个文件,否则,在用torch.load()函数加载函数时,会报错:

RuntimeError: storage has wrong size

解决办法是:

 只让一个进程去写,因为不同GPU上的模型是一致的。所以,只需要加一个判断语句就行

if args.local_rank == 0:
     torch.save()

,但是,这样的话,不同的GPU执行的进度就不相同了。是否会遇到问题,等程序运行后,再看看。

 

5、报错:

当调用model.train()时,会出现如下的错误

TypeError: 'NoneType' object is not callable

原因是,我用了赋值语句:model = model.train()。直接model.train()或者model.eval()即可。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值