1

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

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

trainer = Trainer(gpus=None)

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

trainer = Trainer(gpus=2, accelerator='dp')

这将启动培训课程,但给我一个 BroadcastBackward 错误,我只有在尝试使用 dp 加速器时才会收到该错误(详情如下)。

但是手册继续说

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

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

trainer = Trainer(gpus=2, accelerator='ddp')

但是现在当我跑步时trainer.fit,培训师会启动第二个过程(proc = subprocess.Popen(command, env=env_copy, cwd=cwd)在 ddp_accelerator.py.

一方面这是预期的行为(每个 gpu 一个进程),但另一方面,它确实重新运行了我的主脚本(它不仅仅是重新导入,因此保护 withif __name__ == "__main__":无济于事)。我的脚本是一个优化方案,流程如下:

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

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

顺便说一句,在 1 个 gpu 上运行可以正常工作(训练完成且没有错误):

trainer = Trainer(gpus=1, accelerator='ddp')

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

dp 错误详情:

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

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

4

0 回答 0