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

Pytorch Lightning在ddp模式下复制主脚本,pytorch,multi-gpu,ddp,pytorch-lightning,Pytorch,Multi Gpu,Ddp,Pytorch Lightning,当我在集群上以ddp模式(2个GPU)启动主脚本时,Pytorch Lightning复制主脚本中执行的任何内容,例如打印或其他逻辑。我需要一些扩展的训练逻辑,我想自己处理。例如,在Trainer.fit()之后做某事(一次!)。但由于复制了主脚本,这并不像我所希望的那样有效。我还尝试将它包装在中,如果uuuu name\uuuuu==“\uuuuu main\uuuuuu”,但它不会改变行为。如何解决这个问题?或者,我如何在没有重复项的情况下使用我的Trainer对象周围的一些逻辑?此后,我开

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

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

您可以通过将以下代码放在
Trainer.fit
之后退出重复的子进程:

导入系统 如果model.global_排名!=0: 系统出口(0) 其中,
model
继承自
LightningModule
,该模块具有指定机器等级的属性
global\u rank
。我们可以大致将其理解为gpu id或进程id。此代码之后的所有内容都将仅在主进程中执行,即
全局\u秩
=0的进程


有关更多信息,请参阅文档

您能提供一些代码吗?由于ddp强制所有节点对模型进行初始化,所以fit中的所有操作都需要执行多次,但我假设这不是您的问题?谢谢你的回答。是的,这也是我所期望的。然而,似乎不仅“.fit()”中的内容是并行的,而且它周围的所有代码也是并行的。例如,当我运行脚本“main.py”时,我会按顺序打印一些内容并调用Trainer.fit(),打印内容会按进程数(GPU)进行复制。这显然不是我所期望的。也许有人对此进行了攻击,但同时我发现,PyTorch中使用ddp的本机多处理要好几光年(至少对于研究而言),请看我自己的答案。