语义分割分布式训练小结

借鉴文档
https://blog.csdn.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**

Original: https://blog.csdn.net/weixin_42702800/article/details/123877191
Author: 凡士林vasline
Title: 语义分割分布式训练小结

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/710614/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球