Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Pytork';什么是并行方法和分布式方法?_Python 3.x_Parallel Processing_Pytorch_Distributed Computing - Fatal编程技术网

Python 3.x Pytork';什么是并行方法和分布式方法?

Python 3.x Pytork';什么是并行方法和分布式方法?,python-3.x,parallel-processing,pytorch,distributed-computing,Python 3.x,Parallel Processing,Pytorch,Distributed Computing,我不是分布式系统和CUDA方面的专家。但是PyTorch支持的一个非常有趣的特性是nn.DataParallel和nn.DistributedDataParallel。它们实际上是如何实施的?它们如何分离常见的嵌入和同步数据 下面是DataParallel的一个基本示例 import torch.nn as nn from torch.autograd.variable import Variable import numpy as np class Model(nn.Module):

我不是分布式系统和CUDA方面的专家。但是PyTorch支持的一个非常有趣的特性是
nn.DataParallel
nn.DistributedDataParallel
。它们实际上是如何实施的?它们如何分离常见的嵌入和同步数据

下面是
DataParallel
的一个基本示例

import torch.nn as nn
from torch.autograd.variable import Variable
import numpy as np

class Model(nn.Module):
    def __init__(self):
        super().__init__(
            embedding=nn.Embedding(1000, 10),
            rnn=nn.Linear(10, 10),
        )

    def forward(self, x):
        x = self.embedding(x)
        x = self.rnn(x)
        return x

model = nn.DataParallel(Model())
model.forward(Variable.from_numpy(np.array([1,2,3,4,5,6], dtype=np.int64)).cuda()).cpu()
Pytork可以拆分输入并将其发送到多个GPU,然后将结果合并回来

它如何管理并行模型或分布式模型的嵌入和同步

我浏览了PyTorch的代码,但很难知道基本原理是如何工作的。

这是一个很好的问题。
PyTorch DataParallel范例实际上非常简单,实现是开源的。请注意,今天不推荐使用他的范例,因为它在主GPU上存在瓶颈,并且数据传输效率不高

此容器通过以下方式并行给定:attr:
模块的应用程序
通过批处理中的分块在指定的设备上拆分输入
维度(每个设备将复制一次其他对象)。向前
通过后,模块将在每个设备上复制,并且每个复制副本处理一个
输入的一部分。在向后传球过程中,每个副本的梯度
将其汇总到原始模块中

对于DistributedDataParallel,这更棘手。这是目前比较先进的方法,而且非常有效(请参阅)

此容器通过以下方式并行给定模块的应用程序: 通过批处理中的分块在指定的设备上拆分输入 维在每台机器和每台设备上复制该模块,以及 每个这样的副本处理一部分输入。在倒退中 通过,将平均每个节点的渐变

对于如何平均每个节点的渐变,有几种方法。我会推荐这篇论文,以真正了解事情是如何运作的。一般来说,在将数据从一个GPU传输到另一个GPU之间,在带宽和速度方面存在一种权衡,我们希望这一部分真正高效。因此,一种可能的方法是将每对GPU用一个非常快速的协议连接成一个圆圈,并且只将一部分梯度从一个传递到另一个,总的来说,我们传输的数据更少,效率更高,所有节点都得到所有梯度(或者至少是它们的平均值)。在这种情况下仍然会有一个主GPU,或者至少是一个进程,但现在任何GPU上都没有瓶颈,它们共享相同数量的数据(最多…)

现在,如果我们不等待所有批处理完成计算并开始执行分时操作,即每个节点在准备就绪时发送其部分,那么这可以进一步优化。不要告诉我细节,但事实证明,如果我们不等待一切结束,并尽快进行平均,它也可能加快梯度平均

有关该领域的更多信息,请参阅文献,因为该领域仍在发展(截至今天)

PS 1:通常这些分布式培训在为该任务设置的机器上工作得更好,例如在硬件中实现这些协议的AWS深度学习实例

PS 2:免责声明:我真的不知道PyTorch开发者选择实现什么协议,以及根据什么选择什么。我从事分布式培训,更喜欢遵循PyTorch最佳实践,而不是试图超越他们。我建议你也这样做,除非你真的在研究这个领域

参考资料:


[1]

在pytorch论坛上提问可能会更好。我在论坛上的问题是: