在分布式计算中,世界规模和排名是多少?



我一直在阅读一些文档和示例代码,最终目标是为分布式计算编写脚本(运行 PyTorch(,但这些概念让我感到困惑。

假设我们有一个具有 4 个 GPU 的节点,并且我们希望在这 4 个 GPU 上运行我们的脚本(即每个 GPU 一个进程(。在这种情况下,排名世界大小和排名是多少?我经常找到世界大小的解释:作业中涉及的进程总数,所以我假设在我们的示例中是四个,但是排名呢?

为了进一步解释它,另一个具有多个节点和多个GPU的示例也可能很有用。

这些概念与并行计算有关。学习一些关于并行计算的知识会很有帮助,例如 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集合和基本概念的文章。链接在这里。

当我学习torch.distributed时,我也对这些术语感到困惑。以下内容基于我自己的理解和 API 文档,如果我错了,请指正。

我认为首先应该正确理解group。它可以被认为是"一组过程"或"世界",一个工作通常对应于一个组。world_size是这个group中的进程数,也是参与作业的进程数。rankgroup中每个进程的唯一 ID。

因此,在您的示例中,world_size是 4,进程的rank[0,1,2,3].

有时,我们也可能有local_rank参数,这意味着一个进程内的 GPU ID。例如,rank=1local_rank=1,表示第二个进程中的第二个GPU。

最新更新