语义分割分布式训练小结

借鉴文档 https://blog..net/weixin_44966641/article/details/121872773 https://zhuanlan.zhihu.com/p/373395654

基础概念 group: 进程组,大部分情况下,ddp的各个进程都是在一个group下面。 world_size:总的进程数量,一般一个进程占用一个GPU。 rank: 当前进程的序号,用于进程之间的通信,rank=0的主机为master节点。 local_rank:当前进程对应的gpu号。

例如: 单机8卡分布式训练,worldsize=8,rank和localrank分别都是0-7。 双机16卡分布式训练,每台机器8卡,worldsize=16,rank编号为0-15,但是localrank还是0-7(对应的是单个gpu上)。

实操第一步

1.1 初始化进程组 rank = int(os.environ[‘RANK’]) local_rank = int(os.environ[‘LOCAL_RANK’]) args.world_size = int(os.environ[‘WORLD_SIZE’]) torch.cuda.set_device(local_rank) torch.distributed.init_process_group(backend=“nccl”,world_size=args.world_size,rank=rank)

1.2:打印信息太多太乱,只打印主进程信息 增加函数 def setup_for_distributed(is_master): import builtins as builtin builtin_print = builtin.print def print(*args,**kwargs): if is_master: builtin_print (*args,**kwargs) torch.distributed.barrier() setup_for_distributed(rank==0)

第二步: ###修改model和dataloader的设置 from torch.utils.data.distributed import DistributedSampler from torch.nn.parallel import DistributedDataParallel

###模型修改 model = torch.nn.SyncBatchNorm.convert_sync_batchnorm(model)#不转换的话测试时会产生4个模型和结果 model.to(local_rank) model=torch.nn.parallel.DistributedDataParallel(model)

###采样修改 train_sampler = DistributedSampler(train_dataset) # 这个sampler会自动分配数据到各个gpu上 train_loader = DataLoader(train_dataset, batch_size=batch_size, sampler=train_sampler)#如果原始DataLoader里面有shuffle=True的话改成False,应为distributed——sample默认为True,导致冲突。

###记得在训练过程中加入set_epoch for epoch in range(start_epoch,max_epoch): train_sample = set_epoch(epoch)

第三步:运行: 在运行中需要用torch.distributed.launch为每台主机上创建多进程,例如 python -m torch.distributed.launch --nproc_per_node=8 --use_env trian.py**

经验分享 程序员 微信小程序 职场和发展