我已经阅读了所有关于torch.distributed.barrier()的文档,但是仍然很难理解它是如何在这个剧本中使用的,我很想得到一些帮助。
因此,torch.distributed.barrier官方医生说它“同步所有processes.This集合块进程,直到整个组进入这个函数,如果async_op是假的,或者如果在wait()上调用异步工作句柄”。
它在脚本中的两个地方使用:
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()
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?
提前感谢!
发布于 2020-01-16 09:24:29
首先你需要了解军衔。简单地说:在多处理上下文中,我们通常假定级别0是第一个流程或基本流程。然后对其他过程进行不同的排序,例如1、2、3,总共有四个过程。
有些操作不需要并行执行,或者您只需要一个进程进行一些预处理或缓存,以便其他进程可以使用这些数据。
在您的示例中,如果第一个if语句是由非基本进程(级别1、2、3)输入的,它们将阻塞(或“等待”),因为它们遇到了障碍。他们在那里等待,因为barrier()
阻塞直到所有进程都达到了一个障碍,但是基本进程还没有达到一个障碍。
因此,此时非基本进程(1,2,3)被阻塞,但基本进程(0)仍在继续。基进程将执行一些操作(在本例中是预处理和缓存数据),直到到达第二个if-语句为止。在那里,基本进程将遇到一个障碍。在这一点上,所有的进程已经停止在一个障碍,这意味着所有当前的障碍可以取消,所有进程可以继续。因为基本进程准备了数据,其他进程现在可以使用该数据。
也许最重要的理解是:
https://stackoverflow.com/questions/59760328
复制相似问题