PyTorch的nn.DataParallel是否在每个GPU中加载相同的模型?

(逻辑上)似乎唯一可行的方法是将模型加载到每个GPU中。这意味着更新权重时,每个GPU也需要更新权重,与单个GPU相比,增加了工作量。这条推理线正确吗?

iCMS 回答:PyTorch的nn.DataParallel是否在每个GPU中加载相同的模型?

首先,it is advised改为使用torch.nn.parallel.DistributedDataParallel

您可以查看torch.nn.DataParallel文档,其中描述了该过程(您也可以查看source code并深入了解githubhere是模块复制的方式执行)。

大致是这样的:

初始化

所有(或选定的)设备ID均保存在构造函数和维度中,数据将沿该维度分散(几乎总是0,这意味着它将沿批处理拆分为设备)

转发

这是在每次运行forward期间完成的:

  1. 输入是分散的(沿尺寸tuplelistdict浅化复制,其他数据在线程之间共享)。
  2. 如果只有一台设备,只需返回module(*args,**kwargs)
  3. 如果有多个设备,请将网络从源计算机复制到其他设备(每次都完成!)
  4. 使用各自的输入在每个设备上向前运行
  5. 将设备的输出收集到单个源设备上(输出的串联)到源计算机上。
  6. 运行其余代码,反向传播,更新源计算机上的权重等。

默认情况下,源计算机为cuda:0,但可以选择它。此外,权重在单个device上进行更新,仅分散批次并收集输出。

本文链接:https://www.f2er.com/1952967.html

大家都在问