Torch.distributed.barrier()如何工作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Torch.distributed.barrier()如何工作相关的知识,希望对你有一定的参考价值。

我已经阅读了所有可以找到的有关torch.distributed.barrier()的文档,但是仍然很难理解它在this script中的使用方式,非常感谢您的帮助。

因此official doc of torch.distributed.barrier说它“同步所有进程。如果async_op为False,或者如果在wait()上调用了异步工作句柄,则该集合将阻塞进程,直到整个组进入该函数为止。”

在脚本的两个地方都使用过:

First place

    if args.local_rank not in [-1, 0] and not evaluate:
        torch.distributed.barrier()  # Make sure only the first process in distributed training process the dataset, and the others will use the cache

        ... (preprocesses the data and save the preprocessed data)

    if args.local_rank == 0 and not evaluate:
        torch.distributed.barrier() 

Second place

    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:
        torch.distributed.barrier()  # Make sure only the first process in distributed training will download model & vocab

我在将代码中的注释与官方文档中说明的此功能的功能联系起来时遇到麻烦。如何确保只有第一个进程在两次torch.distributed.barrier()调用之间执行代码,为什么它仅在第二个调用之前检查本地等级是否为0?

提前感谢!

答案

首先,您需要了解等级。简而言之:在多处理上下文中,我们通常假设等级0是第一个进程或基础进程。然后,其他进程的排名不同,例如一,二,三,共四个过程。

不必并行执行某些操作,或者您只需要一个进程进行一些预处理或缓存,以便其他进程可以使用该数据。

在您的示例中,在非基础流程输入的第一个if语句中,它们将阻塞(或“等待”),因为它们会遇到障碍。他们在那里等待,因为barrier()阻塞直到all进程到达障碍,但是基本进程尚未到达障碍。因此,此时非基本进程被阻止,但基本进程继续。基本进程将执行一些操作(在这种情况下,对数据进行预处理和缓存),直到达到第二个if语句为止。在那里,基本流程将遇到障碍。此时,所有进程都已停止在障碍处,这意味着可以解除障碍并继续进行所有过程。因为基本进程准备了数据,所以其他进程现在可以使用该数据。

也许最重要的要了解的是:

  • 当进程遇到障碍时,它将阻止
  • 屏障的位置并不重要(例如,并非所有进程都必须输入相同的if语句)
  • 一个过程被一个障碍物阻塞,直到所有过程都遇到一个障碍物,所有过程都在此障碍物上被解除

以上是关于Torch.distributed.barrier()如何工作的主要内容,如果未能解决你的问题,请参考以下文章