Fork me on GitHub

Pytorch多GPU并行处理

  • 可以参数2017coco detection 旷视冠军MegDet: MegDet 与 Synchronized BatchNorm
  • PyTorch-Encoding官方文档对CGBN(cross gpu bn)实现
  •  GPU捉襟见肘还想训练大批量模型?
    • 在一个或多个 GPU 上训练大批量模型: 梯度累积
    • 充分利用多 GPU 机器:torch.nn.DataParallel
    • 多 GPU 机器上的均衡负载 : PyTorch-Encoding 的 PyTorch 包,包括两个模块:DataParallelModel 和 DataParallelCriterion
    • 分布式训练:在多台机器上训练: PyTorch 的 DistributedDataParallel
  • Pytorch 的多 GPU 处理接口是 torch.nn.DataParallel(module, device_ids),其中 module 参数是所要执行的模型,而 device_ids 则是指定并行的 GPU id 列表。
  • 而其并行处理机制是,首先将模型加载到主 GPU 上,然后再将模型复制到各个指定的从 GPU 中,然后将输入数据按 batch 维度进行划分,具体来说就是每个 GPU 分配到的数据 batch 数量是总输入数据的 batch 除以指定 GPU 个数。每个 GPU 将针对各自的输入数据独立进行 forward 计算,最后将各个 GPU 的 loss 进行求和,再用反向传播更新单个 GPU 上的模型参数,再将更新后的模型参数复制到剩余指定的 GPU 中,这样就完成了一次迭代计算。所以该接口还要求输入数据的 batch 数量要不小于所指定的 GPU 数量。
 

这里有两点需要注意:

  1. 主 GPU 默认情况下是 0 号 GPU,也可以通过 torch.cuda.set_device(id) 来手动更改默认 GPU。
  2. 提供的多 GPU 并行列表中需要包含有主 GPU

但是,DataParallel 有一个问题:GPU 使用不均衡。在一些设置下,GPU-1 会比其他 GPU 使用率高得多。

posted @ 2018-12-13 13:43  ranjiewen  阅读(15402)  评论(0编辑  收藏  举报