6

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

4

3 回答 3

4

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

于 2021-03-03T19:48:13.297 回答
1

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

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

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

于 2021-07-28T06:12:57.070 回答
0

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

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

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

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

于 2021-06-08T12:37:38.497 回答