Pytorch Lightning 在 ddp 模式下复制主脚本

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

dibatian 回答:Pytorch Lightning 在 ddp 模式下复制主脚本

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

,

您可以通过将以下代码放在 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

,

在 GitHub 存储库中询问:https://github.com/PyTorchLightning/pytorch-lightning/issues/8563

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

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

本文链接:https://www.f2er.com/901585.html

大家都在问