在分布式计算中,世界规模和排名是多少?
Posted
技术标签:
【中文标题】在分布式计算中,世界规模和排名是多少?【英文标题】:In distributed computing, what are world size and rank? 【发布时间】:2020-02-04 20:55:46 【问题描述】:我一直在阅读 some documentation 和 example code,最终目标是为分布式计算(运行 PyTorch)编写脚本,但这些概念让我感到困惑。
假设我们有一个带有 4 个 GPU 的节点,并且我们希望在这 4 个 GPU 上运行我们的脚本(即每个 GPU 一个进程)。在这种情况下,排名世界大小和排名是多少?我经常找到关于世界大小的解释:作业中涉及的进程总数,所以我假设在我们的示例中是四个,但是排名呢?
为了进一步解释,另一个具有多个节点和多个 GPU 的示例也很有用。
【问题讨论】:
【参考方案1】:这些概念与并行计算有关。了解一些关于并行计算的知识会很有帮助,例如,MPI。
您可以将world
视为一个包含分布式训练的所有流程的组。通常,每个 GPU 对应一个进程。 world
中的进程可以相互通信,这就是为什么您可以分布式训练模型并仍然获得正确的梯度更新的原因。所以世界规模是您训练的进程数,通常是您用于分布式训练的 GPU 数量。
Rank
是赋予进程的唯一 ID,以便其他进程知道如何识别特定进程。 本地排名是在单个节点中运行的进程的唯一本地ID,这是我与@zihaozhihao的观点不同的地方。
让我们举一个具体的例子。假设我们在 2 个服务器或节点上运行我们的训练,每个节点有 4 个 GPU。世界大小为 4*2=8。进程的等级将是[0, 1, 2, 3, 4, 5, 6, 7]
。在每个节点中,本地排名将是[0, 1, 2, 3]
。
我还写了一篇关于 MPI 集合体和基本概念的文章。链接是here。
【讨论】:
我试过这个dist.init_process_group("gloo",rank=[0,1], world_size=2)
但得到错误:排名必须是整数。我不明白
@mikey init_process_group
被分布式训练中的每个子进程使用。所以它只接受一个等级,而不是等级列表。【参考方案2】:
我在学习torch.distributed
时,也被这些术语弄糊涂了。以下内容基于我自己的理解和API文档,如有错误请指正。
我认为首先应该正确理解group
。它可以被认为是“一组进程”或“世界”,一个作业通常对应一个组。 world_size
是这个group
中的进程数,也就是参与作业的进程数。 rank
是group
中每个进程的唯一ID。
因此,在您的示例中,world_size
是 4,进程的 rank
是 [0,1,2,3]
。
有时,我们也可以有local_rank
参数,它表示一个进程内的GPU id。比如rank=1
和local_rank=1
,表示第二个进程中的第二个GPU。
【讨论】:
为了进一步澄清,你能用另一个例子扩展吗?两个节点各有两个 GPU 的世界大小是多少? 世界大小取决于参与作业的进程数。因此,如果您有两个节点,每个 GPU 一个进程。该组共有四个进程,因此世界大小为 4。 排名将是 [0, 1, 0, 1]? @BramVanroy 不,它将是 0,1,2,3。 Rank 是一个唯一的 ID。以上是关于在分布式计算中,世界规模和排名是多少?的主要内容,如果未能解决你的问题,请参考以下文章