我一直在阅读some documentation和example code,最终目的是为分布式计算(运行PyTorch)编写脚本,但是这些概念使我感到困惑。
假设我们有一个带有4个GPU的单个节点,并且我们希望在这4个GPU上运行脚本(即每个GPU一个进程)。在这种情况下,排名世界的大小和排名是多少?我经常找到关于世界规模的解释:该工作涉及的过程总数,所以我认为在我们的示例中是4,但是等级呢?
为了进一步解释,具有多个节点和多个GPU的另一个示例也可能有用。
[当我学习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。
这些概念与并行计算有关。稍微了解一下并行计算将很有帮助,例如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。