Pytorch Lightning 为每个 GPU 重复主脚本

5Ke*_*5Ke 5 gpu machine-learning pytorch pytorch-lightning

我有一台带有两个显卡的机器。我想用两者来训练我的模型。为了让我的生活更轻松,我正在使用 pytorch lighting。

当我在没有 GPU 的情况下运行脚本时,一切正常:

trainer = Trainer(gpus=None)
Run Code Online (Sandbox Code Playgroud)

但我想在多个 GPU 上运行它。令人困惑的是,手册首先指出,对于一台具有多个 GPU 的机器,您应该使用“dp”加速器:

trainer = Trainer(gpus=2, accelerator='dp')
Run Code Online (Sandbox Code Playgroud)

这会启动训练课程,但会出现一个 BroadcastBackward 错误,只有当我尝试使用 dp 加速器时才会出现该错误(详细信息如下)。

然而手册继续说

PyTorch 和 Lightning 不鼓励使用 DP。使用更稳定且至少快 3 倍的 DDP

听起来很棒!所以我这样做:

trainer = Trainer(gpus=2, accelerator='ddp')
Run Code Online (Sandbox Code Playgroud)

但现在当我运行时trainer.fit,训练器启动第二个进程(proc = subprocess.Popen(command, env=env_copy, cwd=cwd)在 ddp_accelerator.py 中)。

一方面,这是预期的行为(每个 GPU 一个进程),但另一方面,它确实重新运行了我的主脚本(它不仅仅是重新导入,因此保护并if __name__ == "__main__":没有帮助)。我的脚本是一个优化方案,流程如下:

  1. 生成超参数(基于早期运行的结果)
  2. 构建、训练、评估模型:回报绩效衡量
  3. 从 1 开始重复

这意味着第二个进程获得的超参数与第一个进程不同,这显然会引发错误。

顺便说一句,在 1 个 GPU 上运行效果很好(训练完成且没有错误):

trainer = Trainer(gpus=1, accelerator='ddp')
Run Code Online (Sandbox Code Playgroud)

我应该如何解决这个问题?坚持使用“dp”并修复我的 BroadcastBackward 错误?或者坚持使用 ddp,但是如何修复脚本重复错误呢?

dp错误详细信息:

在文件 X,第 X 行,向前 self.RMr.lerp_(Mr.squeeze(),exponential_average_factor) 运行时错误:BroadcastBackward 的输出 0 是一个视图,正在就地修改。该视图是返回多个视图的函数的输出。此类函数不允许就地修改输出视图。您应该将就地操作替换为异地操作。

系统详细信息:ubuntu、python:3.8、pytorch-lightning:1.0.7、pytorch:1.6.0