【问题标题】:Pytorch Lightning duplicates main script in ddp modePytorch Lightning 在 ddp 模式下复制主脚本
【发布时间】:2021-05-21 12:13:46
【问题描述】:

当我使用 ddp 模式(2 个 GPU)在集群上启动我的主脚本时,Pytorch Lightning 会复制主脚本中执行的任何内容,例如打印或其他逻辑。我需要一些扩展的训练逻辑,我想自己处理。例如。在Trainer.fit() 之后做某事(一次!)。但是由于主脚本的重复,这并不像我想要的那样工作。我还尝试将其包装在 if __name__ == "__main__" 中,但它不会改变行为。如何解决这个问题?或者,我怎样才能在我的 Trainer 对象周围使用一些逻辑而不重复?

【问题讨论】:

  • 你能提供一些代码吗?由于 ddp 强制所有节点对模型进行初始化,因此 fit 范围内的所有内容都应执行多次,但我认为这不是您的问题? pytorch-lightning.readthedocs.io/en/stable/advanced/…
  • 感谢您的回答。是的,这也是我所期望的。然而,似乎不仅“.fit()”中的内容是并行发生的,而且它周围的所有代码也是并行发生的。例如。当我运行脚本“main.py”时,我在其中按顺序打印一些内容并调用 Trainer.fit(),打印结果与进程数(GPU)重复。这显然不是我所期望的。也许有一个 hack 解决这个问题,但与此同时我发现,在 PyTorch 中使用 ddp 进行本地多处理要好几光年(至少对于研究而言),请参阅我自己的答案。

标签: pytorch multi-gpu ddp pytorch-lightning


【解决方案1】:

此后,我开始在 PyTorch 中使用原生“ddp”进行多处理。据我了解,PytorchLightning (PTL) 只是在多个 GPU 上多次运行您的主脚本。如果您只想在脚本的一次调用中拟合模型,这很好。然而,在我看来,一个巨大的缺点是在训练过程中失去了灵活性。与您的实验交互的唯一方法是通过这些(记录不充分的)回调。老实说,在 PyTorch 中使用原生多处理更加灵活方便。最后它实现起来更快更容易,而且你不必通过 PTL 文档搜索年龄来实现简单的事情。 我认为 PTL 正在朝着一个好的方向发展,移除了大部分样板,但是,在我看来,Trainer 的概念需要一些认真的返工。在我看来太封闭了,违反了 PTL 自己的“重组 PyTorch 代码,保留原生 PyTorch 代码”的理念。 如果你想使用 PTL 进行简单的多 GPU 训练,我个人强烈建议不要使用它,对我来说这是浪费时间,最好学习原生 PyTorch 多处理。

【讨论】:

    【解决方案2】:

    在 GitHub 存储库中提出这个问题:https://github.com/PyTorchLightning/pytorch-lightning/issues/8563

    有不同的加速器用于训练,虽然 DDP (DistributedDataParallel) 每个 GPU 运行一次脚本,但 ddp_spawn 和 dp 不会。

    但是,某些插件(如 DeepSpeedPlugin)是基于 DDP 构建的,因此更改加速器不会阻止主脚本多次运行。

    【讨论】:

      【解决方案3】:

      您可以通过在Trainer.fit 后面添加以下代码来退出重复的子流程:

      import sys
      if model.global_rank != 0:
          sys.exit(0)
      

      其中model 继承自LightningModule,它有一个属性global_rank 指定机器的等级。我们可以粗略的理解为gpu id或者进程id。此代码之后的所有内容都只会在主进程中执行,即global_rank = 0 的进程。

      更多信息请参考文档https://pytorch-lightning.readthedocs.io/en/latest/common/lightning_module.html#global_rank

      【讨论】:

        猜你喜欢
        • 2021-03-03
        • 2021-06-25
        • 2021-02-06
        • 2021-10-12
        • 2021-03-03
        • 2021-06-04
        • 2020-11-23
        • 2021-11-13
        • 1970-01-01
        相关资源
        最近更新 更多