相关文章推荐
狂野的啄木鸟  ·  (完結).NET ...·  1 年前    · 
深沉的牙膏  ·  swagger2 ...·  1 年前    · 
近视的墨镜  ·  IDEA ...·  1 年前    · 

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)单一进程数据处理

通常有一些操作是没有必要以并行的方式进行处理的,如数据读取与处理操作,只需要一个进程进行处理并缓存,然后与其它进程共享缓存处理数据,但是由于不同进程是同步执行的,单一进程处理数据必然会导致进程之间出现不同步的现象,为此,torch中采用了barrier()函数对其它非主进程进行阻塞,来达到同步的目的。

(3)barrier()具体原理

在上面的代码示例中,如果执行create_dataloader()函数的进程不是主进程,即rank不等于0或者-1,上下文管理器会执行相应的torch.distributed.barrier(),设置一个阻塞栅栏,让此进程处于等待状态,等待所有进程到达栅栏处(包括主进程数据处理完毕);如果执行create_dataloader()函数的进程是主进程,其会直接去读取数据并处理,然后其处理结束之后会接着遇到torch.distributed.barrier(),此时,所有进程都到达了当前的栅栏处,这样所有进程就达到了同步,并同时得到释放。

参考文章:https://stackoverflow.com/questions/59760328/how-does-torch-distributed-barrier-work

参考代码:https://github.com/ultralytics/yolov5

在pytorch的多卡训练中,有一种基于分布式形式的训练模式,在此模式下,不同节点进程之间的数据同步是通过torch的一个函数torch.distributed.barrier()实现。
if args.local_rank not in [-1, 0]: torch.distributed.barrier() # Make sure only the first process in distributed training will download model & vocab ... (loads the model and the vocabulary) if args.local_rank == 0: torc.
先进的深度学习模型参数正以指数级速度增长:去年的GPT-2有大约7.5亿个参数,今年的GPT-3有1750亿个参数。虽然GPT是一个比较极端的例子但是各种SOTA模型正在推动越来越大的模型进入生产应用程序,这里的最大挑战是使用GPU卡在合理的时间内完成模型训练工作的能力。 为了解决这些问题,从业者越来越多地转向分布式训练。 分布式训练是使用多个GPU和/或多个机器训练深度学习模型的技术。 分布式训练作业使您能够克服单GPU内存瓶颈,通过同时利用多个GPU来开发更大,功能更强大的模型。 这篇文章是使用tor
torch.distributed.barrier作用 Pytorch分布式训练过程中,对于数据的读取是采用主进程预读取并缓存,然后其它进程从缓存中读取,不同进程之间的同步通信需要通过torch.distributed.barrier()实现 t = torch.tensor([self.count, self.total], dtype=torch.float64, device='cuda') dist.barrier() dist.all_reduce(t) 主要就是通过对其他进程进行阻塞来等所有
       在写微信小程序开发过程中,有时候为了画面美观,里面的文本内容需要给它开头空格,段落换行,但是常用的HTML的语法书写跟微信小程序又不一样,这个时候就需要运用微信小程序特写的如下技能。 书写前提条件注意: 必须在<text>标签中! 1.单个空格、换行、 \t     单个空格字符,无论写多少个都只会显示一个空格。 \n    换行字符
参考文献:https://www.cnblogs.com/jfdwd/p/11196439.html NVIDIA Collective Communication Library (NCCL) :NVIDIA分布式通信库,负责加速共同通信原语,不是一个并行编程框架。利用NCCL可以在多GPU训练下的优化。 下载安装链接:https://docs.nvidia.com/deeplearn...
<text space="nbsp">Hello World \n</text> <text space="ensp">Hello World \n</text> <text space="emsp">Hello World \n</text> space 文本空格的间距 ensp 半个中文字符大小 emsp 一个中文字符大小 Hello 和 World 之间距离越来越大 一、torch.nn.BCELoss(weight=None, size_average=True) 二、nn.BCEWithLogitsLoss(weight=None, size_average=True) 三、torch.nn.MultiLabelSoftMarginLoss(weight=None, size_average=True) 最近使用Pytorch做多标签分类任务,遇到了一些损失函数的问题,因为经常会忘记(好记性不如烂笔头囧rz),都是现学现用,所以自己写了一些代码探究一下,并在此记录,如果以后还遇到其他损失函数,继续在此补充。 如果有兴趣,我建
group:指进程组,默认为一组 backwend:指进程使用的通讯后端,Pytorch支持mpi、gloo、nccl、若是使用N卡推荐使用nccl world_size:指进程组中的进程数量 若使用单台机器多GPU,world_size表示使用的GPU数量 若使用多台机器多GPU,world_size表示使用的机器数量 rank:指当前进程的序号,用于进程间的通讯,rank=0表示为master。 若使用单台机器多GPU,rank表示当前正在使用的某个GPU 若使用多台机 RuntimeError: The Session graph is empty. Add operations to the graph before calling run() 24921 视觉弘毅: 感谢您的提问,您这个情况应该是数据读取阶段的事情,我目前了解的也不多,给您推荐两片相关的文章,可以参考,希望可以帮到你。 1. http://www-quic.zhihu.com/question/360391842 2. https://blog.csdn.net/qq_38737428/article/details/121208034 通俗理解torch.distributed.barrier()工作原理 视觉弘毅: 数据读取使用CPU的多线程进行,数据处理是使用多个显卡分布式处理,我是这样理解的。