pytorch分布式

nn.DataParallel,最初的方法,最大问题就是负载极不平衡,当你在数据并行的时候,你的loss却不是这样的,每次都会在第一个GPU相加计算,这就造成了第一个GPU的负载远远大于剩余其他的显卡。

pytorch-encoding,一个第三库,可以一试
推荐官方:distributedDataparallel,多机多卡,单机多卡也可以

初始化

#初始化使用nccl后端(这个),当然还有别的后端,可以查看官方文档,介绍的比较清晰
torch.distributed.init_process_group(backend=“nccl”)(官方说这个就行)
也有
torch.distributed.init_process_group(‘nccl’, init_method=‘env://’)
torch.distributed.init_process_group(backend=‘nccl’, init_method=‘tcp://localhost:23456’, rank=0, world_size=1)
第一个参数是pytorch支持的通讯后端, 后面会继续介绍, 但是这里单机多卡, 这个就是走走过场. 第二个参数是各个机器之间通讯的方式, 后面会介绍, 这里是单机多卡, 设置成localhost就行了, 后面的端口自己找一个空着没用的就行了. rank是标识主机和从机的, 这里就一个主机, 设置成0就行了. world_size是标识使用几个主机, 这里就一个主机, 设置成1就行了, 设置多了代码不允许.

使用DistributedSampler

因为distributedDataparallel不会自己分数据

如果自己写数据流,得根据torch.distributed.get_rank()去shard数据,获取自己应用的一份
如果用Dataset API,则需要在定义Dataloader的时候用DistributedSampler 去shard:

train_dataset = self.dataset(
 self.opt.data_path, train_filenames, self.opt.height, self.opt.width,
 self.opt.frame_ids, 4, is_train=True, img_ext=img_ext)
 
train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset)

train_loader = DataLoader(
            train_dataset, self.opt.batch_size, False,
 num_workers=self.opt.num_workers, pin_memory=True, drop_last=True,sampler=train_sampler)

pip_memory=true:多GPU训练的时候注意机器的内存是否足够(一般为使用显卡显存x2),如果不够,建议关闭pin_memory(锁页内存)选项。
采用DistributedDataParallel多GPUs训练的方式比DataParallel更快一些,如果你的Pytorch编译时有nccl的支持,那么最好使用DistributedDataParallel方式。
关于什么是锁页内存:
pin_memory就是锁页内存,创建DataLoader时,设置pin_memory=True,则意味着生成的Tensor数据最开始是属于内存中的锁页内存,这样将内存的Tensor转义到GPU的显存就会更快一些。
主机中的内存,有两种存在方式,一是锁页,二是不锁页,锁页内存存放的内容在任何情况下都不会与主机的虚拟内存进行交换(注:虚拟内存就是硬盘),而不锁页内存在主机内存不足时,数据会存放在虚拟内存中。显卡中的显存全部是锁页内存,当计算机的内存充足的时候,可以设置pin_memory=True。当系统卡住,或者交换内存使用过多的时候,设置pin_memory=False。因为pin_memory与电脑硬件性能有关,pytorch开发者不能确保每一个炼丹玩家都有高端设备,因此pin_memory默认为False。

分布式训练

model=torch.nn.parallel.DistributedDataParallel(model)

命令行
python -m torch.distributed.launch --nproc_per_node=NUM_GPUS_YOU_HAVE yourscript.py

文件中加

parser = argparse.ArgumentParser()
parser.add_argument('--local_rank', default=0, type=int, help='node rank for distributed training')#机器数
args = parser.parse_args()
#print(args.local_rank)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值