【问题标题】:Training a model on GPU is very slow在 GPU 上训练模型非常慢
【发布时间】:2021-07-24 12:25:28
【问题描述】:

我正在使用A100-SXM4-40GB Gpu,但训练速度非常慢。我尝试了两个模型,一个是 cifar 的简单分类,一个是 Cityscapes 的 Unet。我在其他 GPU 上尝试了我的代码,它工作得非常好,但我不知道为什么在这个大容量 GPU 上训练超级慢。

我将不胜感激。

以下是 GPU 的其他一些属性。

GPU 0: A100-SXM4-40GB
GPU 1: A100-SXM4-40GB
GPU 2: A100-SXM4-40GB
GPU 3: A100-SXM4-40GB
  • 英伟达驱动版本:460.32.03
  • cuDNN 版本:无法收集

【问题讨论】:

  • 您确定正在使用 GPU 吗?培训前免费吗?
  • 我确信 GPU 是免费的,但我想知道的是,当我的模型正在训练时,当我检查 nvidia-smi 时,它不会在任何 gpus 上显示任何进程
  • 所以,GPU 没有被使用。 torch.cuda.is_available() 的输出是什么?
  • 我在我的代码中设置了这一行self.device = torch.device(f'cuda:{self.gpu}' if torch.cuda.is_available() else 'cpu'),我想既然我将self.gpu设置为我希望在其上运行的gpu的名称,它是在GPU上实现的。我现在会检查它。
  • 是的,它在 CPU 上运行

标签: pytorch gpu


【解决方案1】:

感谢您的回答。在尝试您的答案之前,我决定卸载 anaconda 并重新安装它,这解决了问题。

【讨论】:

  • 这是因为您的 pytorch 版本可能与您的 NVIDIA 驱动程序不兼容
【解决方案2】:

在初始化期间在模型上调用.cuda()

根据您的上述 cmets,您安装了 GPU 和 CUDA,因此没有必要使用 torch.cuda.is_available() 检查设备可用性。

此外,您应该将模型包装在 nn.DataParallel 中,以允许 PyTorch 使用您向其公开的每个 GPU。您也可以使用DistributedDataParallel,但DataParallel 一开始更容易掌握。

初始化示例:

model = UNet().cuda()
model = torch.nn.DataParallel(model)

此外,您可以通过执行带有以下标志的 python 脚本来确保将代码暴露给所有 GPU:

CUDA_VISIBLE_DEVICES=0,1,2,3 python3 train_unet.py

最后要注意 - nn.DataParallel 封装了模型本身,因此为了保存 state_dict,您需要访问 DataParallel 中的模块:

torch.save(model.module.state_dict(), 'unet.pth')

【讨论】:

  • “用torch.cuda.is_available()检查设备可用性没有意义”是不正确的。顺便说一句,甚至不需要安装 CUDA 就可以让 PyTorch 在 GPU 上运行。这不是该命令检查的内容。
  • 来自 PyTorch 文档:torch.cuda.is_available() - “返回一个布尔值,指示 CUDA 当前是否可用。”
  • 没错。这不是关于“正在安装”,而是关于“可用”。 CUDA 与 PyTorch 一起交付(因此,无需安装),但需要确保它与 NVIDIA 驱动程序兼容,否则 CUDA 将无法使用。
  • 是的,这是真的。但是在卸载然后安装anaconda之前,首先我检查了NVIDIA驱动程序的cuda版本11.2,然后我使用conda创建了一个new-env并安装了具有相同cuda版本的pytorch,除非我卸载它没有帮助conda 并重新安装。
猜你喜欢
  • 2021-04-10
  • 1970-01-01
  • 2020-12-27
  • 2020-11-27
  • 2021-05-26
  • 2020-04-07
  • 2017-11-30
  • 2021-04-19
  • 2017-06-17
相关资源
最近更新 更多