Pytork分布式数据是否与不同的GPU速度同步权重?

2024-09-28 21:16:36 发布

您现在位置:Python中文网/ 问答频道 /正文

在下面的场景中,有2个GPU,每个GPU的速度明显不同:GPU0比GPU1快约40%。我想对模型进行100k步的训练,通常,如果速度相同,将在相当于50k步的时间内达到

但是,由于GPU的速度不同,当GPU0达到50K步数时,GPU1仅达到30K步数。有效地,该模型已经训练了80k步

实际上,PyTorch的分布式数据会与不同速度的GPU并行工作吗?目前,脚本[A]的运行使得GPU0以其原始速度运行,而无需等待GPU1,因此我想知道任何同步都将如何工作。我在同一个步骤中在每个GPU中打印了模型的参数,它们确实有很大的不同。如果是,同步在哪里工作

在DDP的原始源代码[B]中,似乎在模型的每次向前传递之前都进行了同步。但我不知道为什么在这种情况下,每个GPU中的参数之和会偏离总值的1-2%左右

获取参数值的函数如下所示:

def get_params_sum(net):
    total = 0
    for param in net.parameters():
        total = total + torch.sum(param)

    return total

有没有一种方法可以让GPU0在完成后自动接管GPU1的一些“剩余”训练

[A]可以在此处找到正在运行的脚本: https://github.com/yangkky/distributed_tutorial/blob/master/src/mnist-distributed.py

[B]https://github.com/pytorch/pytorch/blob/master/torch/nn/parallel/distributed.py#L707


Tags: https模型脚本参数netgpuparamtorch
1条回答
网友
1楼 · 发布于 2024-09-28 21:16:36

由于DDP在每一步都会完全同步渐变,因此速度较快的GPU0应始终等待速度较慢的GPU1

同步发生在向后的步骤allreduce渐变

DDP不是为在异构环境中运行而设计的。您可以考虑将输入除以两个GPU的计算功率,以及^ {A1}。

相关问题 更多 >