[图像算法]-(yolov5.train)-通俗理解torch.distributed.barrier()工作原理

1.背景介绍

在pytorch的多卡训练中,通常有两种方式,一种是单机多卡模式(存在一个节点,通过torch.nn.DataParallel(model)实现),一种是多机多卡模式(存在一个节点或者多个节点,通过torch.nn.parallel.DistributedDataParallel(model),在单机多卡环境下使用第二种分布式训练模式具有更快的速度。pytorch在分布式训练过程中,对于数据的读取是采用主进程预读取并缓存,然后其它进程从缓存中读取,不同进程之间的数据同步具体通过torch.distributed.barrier()实现。

2.通俗理解torch.distributed.barrier()

代码示例如下:

def create_dataloader(): #使用上下文管理器中实现的barrier函数确保分布式中的主进程首先处理数据,然后其它进程直接从缓存中读取 with torch_distributed_zero_first(rank): dataset = LoadImagesAndLabels() from contextlib import contextmanager #定义的用于同步不同进程对数据读取的上下文管理器 @contextmanager def torch_distributed_zero_first(local_rank: int): Decorator to make all processes in distributed training wait for each local_master to do something. if local_rank not in [-1, 0]: torch.distributed.barrier() yield #中断后执行上下文代码,然后返回到此处继续往下执行 if local_rank == 0: torch.distributed.barrier()
(1)进程号rank理解

在多进程上下文中,我们通常假定rank 0是第一个进程或者主进程,其它进程分别具有0,1,2不同rank号,这样总共具有4个进程。

(2)单一进程数据处理