pytorch并行法和分布式法是如何工作的?

Posted

技术标签:

【中文标题】pytorch并行法和分布式法是如何工作的?【英文标题】:How does pytorch's parallel method and distributed method work? 【发布时间】:2019-04-21 20:37:40 【问题描述】:

我不是分布式系统和 CUDA 方面的专家。但是 PyTorch 支持的一个非常有趣的特性是 nn.DataParallelnn.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()

PyTorch 可以拆分输入并将它们发送到多个 GPU 并将结果合并回来。

它如何管理并行模型或分布式模型的嵌入和同步? 我浏览了 PyTorch 的代码,但很难知道基本原理是如何工作的。

【问题讨论】:

在 pytorch 论坛上提问可能会更好。 我在论坛上的问题:discuss.pytorch.org/t/… 【参考方案1】:

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

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

从 DistributedDataParallel 开始,这更加棘手。这是目前更高级的方法,而且效率很高(参见here)。

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

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

现在,如果我们不等待所有批次完成计算并开始做分时的事情,每个节点在准备好时发送他的部分,这可以进一步优化。不讲细节,但事实证明,如果我们不等一切结束,尽快进行平均,也可能会加快梯度平均。

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

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

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

参考资料:

[1]Distributed Training of Deep Learning Models: A Taxonomic Perspective

【讨论】:

【参考方案2】:

使用 Pytorch 实现机器学习并行性

DataParallel 和 DistributedDataParallel 模型平行https://pytorch.org/tutorials/intermediate/model_parallel_tutorial.html

见Will switching GPU device affect the gradient in PyTorch back propagation?

【讨论】:

以上是关于pytorch并行法和分布式法是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

Pytorch使用分布式训练,单机多卡

pytorch分布式训练(DataParallel/DistributedDataParallel)

pytorch分布式训练(DataParallel/DistributedDataParallel)

pytorch分布式训练(DataParallel/DistributedDataParallel)

Pytorch-分布式数据并行混淆

Pytorch分布式数据并行(DistributedDataParallel)