繁体   English   中英

如何使用超过1个GPU训练PyTorch转移学习教程

[英]How to train PyTorch transfer learning tutorial with more then 1 GPU

我目前在以下网址关注PyTorch转移学习教程: https ://pytorch.org/tutorials/beginner/transfer_learning_tutorial.html

我已经能够完成教程并在CPU和1个GPU上进行培训。

我正在使用Google Cloud Platform Notebook实例,并使用4个NVIDIA Tesla k80 x 4 GPU。 在多于1个GPU上训练网络时,在这里遇到了服务器连接错误(无效响应:504)错误

model_ft = models.resnet18(pretrained=True)
num_ftrs = model_ft.fc.in_features
model_ft.fc = nn.Linear(num_ftrs, 2)

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

## Using 4 GPUs
if torch.cuda.device_count() > 1:
    model_ft = nn.DataParallel(model_ft)
model_ft = model_ft.to(device)

criterion = nn.CrossEntropyLoss()

optimizer_ft = optim.SGD(model_ft.parameters(), lr=0.001, momentum=0.9)

exp_lr_scheduler = lr_scheduler.StepLR(optimizer_ft, step_size=7, gamma=0.1)

model_ft = train_model(model_ft, criterion, optimizer_ft, exp_lr_scheduler, num_epochs=25)

想法是利用数据并行性功能来利用所有可用的GPU(为4)来训练网络。

我在实施中缺少什么,请指教。

谢谢

IMO,最简单的方法就是使用Horovod进行多GPU培训。 这是使用Horovod使用GPU的分布式培训脚本的示例: https : //github.com/horovod/horovod/blob/master/examples/pytorch_mnist.py

您将需要安装OpenMPI (可能已经装在盒子上),并且需要在python环境中pip install horovodpip install horovod完整的安装说明位于https://github.com/horovod/horovod#安装 )。

然后,您将使用horovodrun -np 4 python pytorch_mnist.py开始工作(以下有关如何开始Horovod运行的文档: https ://horovod.readthedocs.io/en/latest/mpirun.html)

这将使您不仅可以在具有多个GPU的一个节点上进行训练,而且还可以在多个节点上进行训练(例如,在每个具有4个GPU的2个节点上)进行训练。

Horovod进行分布式培训的重点是:

  • Horovod将按照您的指示启动尽可能多的进程,因此在您的情况下为4。每个进程将运行相同的脚本,只是在Horovod / MPI等级上不同。 然后使用该排名获取相应的cuda设备:
    # Horovod: pin GPU to local rank.
    torch.cuda.set_device(hvd.local_rank())
    torch.cuda.manual_seed(args.seed)
  • DistributedSampler用于在不同节点之间划分数据。 hvd.rank()用于确保每个进程使用不同的数据分区,并且hvd.size()捕获总共有多少个进程。
    train_sampler = torch.utils.data.distributed.DistributedSampler(
    train_dataset, num_replicas=hvd.size(), rank=hvd.rank())
  • DistributedOptimizer包装您的优化器-将在每个最小批处理的末尾处理跨过程的梯度聚合:
    # Horovod: wrap optimizer with DistributedOptimizer.
    optimizer = hvd.DistributedOptimizer(optimizer,
                                         named_parameters=model.named_parameters(),
                                         compression=compression)
  • 最重要的是,您不必修改实际的模型和训练循环,这非常简洁。

样本中还有一些更有趣的事情(例如,通过数量或过程来提高学习率,从一开始就广播您的参数)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM