【问题标题】:In 2020 what is the optimal way to train a model in Pytorch on more than one GPU on one computer?在 2020 年,在一台计算机上的多个 GPU 上使用 Pytorch 训练模型的最佳方式是什么?
【发布时间】:2021-01-14 06:15:36
【问题描述】:

在一台机器上在多个 GPU 上训练一个神经网络的最佳做法是什么?

nn.DataParallel 的不同选项与使用 .to('cuda:0') and .to('cuda:1') 在不同 GPU 上放置不同层的不同选项让我有些困惑。我在 Pytorch docs 中看到后一种方法的日期是 2017 年。是否有标准,还是取决于偏好或模型类型?

方法一

class ToyModel(nn.Module):
    def __init__(self):
        super(ToyModel, self).__init__()
        self.net1 = torch.nn.Linear(10, 10)
        self.relu = torch.nn.ReLU()
        self.net2 = torch.nn.Linear(10, 5)

    def forward(self, x):
        x = self.relu(self.net1(x))
        return self.net2(x)

model = ToyModel().to('cuda')
model = nn.DataParallel(model)

方法二

class ToyModel(nn.Module):
    def __init__(self):
        super(ToyModel, self).__init__()
        self.net1 = torch.nn.Linear(10, 10).to('cuda:0')
        self.relu = torch.nn.ReLU()
        self.net2 = torch.nn.Linear(10, 5).to('cuda:1')

    def forward(self, x):
        x = self.relu(self.net1(x.to('cuda:0')))
        return self.net2(x.to('cuda:1'))  

我不确定 Pytorch 是否提供了更多方法来在多个 GPU 上进行训练。 这两种方法似乎都会导致我的系统冻结,具体取决于我使用的模型。在 Jupyter 中,单元格停留在 [*],如果我不重新启动内核,屏幕会冻结,我必须进行硬重置。一些关于多 GPU 的教程导致我的系统像这样挂起和冻结。

【问题讨论】:

    标签: parallel-processing neural-network pytorch gpu


    【解决方案1】:

    如果您无法将模型的所有层都放在单个 GPU 上,那么您可以使用 model parallel(那篇文章描述了模型在单台机器上并行,layer0.to('cuda:0')layer1.to('cuda:1') 就像您提到的那样)。

    如果您可以,那么您可以尝试distributed data parallel - 每个工作人员将拥有自己的整个模型(所有层)的副本,并将处理每个工作人员中的一小部分数据批。建议使用 DDP 而不是 DP,即使您只使用一台机器。

    您是否有一些示例可以重现您遇到的问题? 您是否尝试过使用少量输入运行代码并添加打印语句以查看是否正在取得进展?

    【讨论】:

    • RE:我遇到的问题。当我使用 Pytorch 在多个 GPU 上使用任何训练方法时,我的系统就会死机。我发布了另一个关于它的问题here。我没有深究。我想这一定是我的系统的问题。我认为在我将新 SSD 插入 PCIe 插槽之前,多 GPU 可能已经工作了几周。我的电脑有一个奇怪的设置。无论如何,我正在考虑获得新的 30 系列卡,也许是两张 30 系列泰坦,这样我的训练时间就可以提高 10 倍。我有两个 1080tis &use 1
    【解决方案2】:

    既然你说2020最佳,答案是肯定DDP, Distributed Data ParallelDataParallel 的效率要低得多,仅适用于 2020 年的快速简便培训。我不认为 DataParallel 接近最优。从 DP 到 DDP 的转变很痛苦,但对我来说绝对值得。

    到今天为止,我认为关于 DDP 的官方教程仍然是一堆乱七八糟的东西。我个人选择this tutorial

    我将重点介绍在学习过程中让我感到困惑的一些要点。获得这些要点非常重要,不仅仅是为了让代码运行,而是为了确保它正确地训练。可能有一些细微的错误会在没有运行时错误的情况下破坏训练。

    1. 在 DDP 中,我们为每个 GPU 生成一个进程。如果您的代码从 main.py 开始并且您使用 2 个 GPU,想象有人会调用 python main.py --local_rank=0python main.py --local_rank=1 来生成两个 python 进程。
    2. 每个进程都会收到其本地排名和全局池大小。使用它们来区分进程。
    3. 每个进程独立初始化其Dataset 对象。他们从自己的数据加载器中收集自己的样本。那么我们如何确保他们不会获得相同的数据点呢?将 DistributedSampler 传递给数据加载器。
    4. 每个进程独立执行前向、后向和损失计算。他们以同步的方式传达梯度。
    5. nn.parallel.DistributedDataParallel 中变形您的模型。然后 PyTorch 将为您完成 (4)。

    【讨论】:

      猜你喜欢
      • 2020-11-29
      • 1970-01-01
      • 2021-08-19
      • 2018-03-28
      • 2010-09-23
      • 2021-09-30
      • 1970-01-01
      • 2017-08-17
      相关资源
      最近更新 更多