(逻辑上)似乎唯一可行的方法是将模型加载到每个GPU中。这意味着更新权重时,每个GPU也需要更新权重,与单个GPU相比,增加了工作量。这条推理线正确吗?
iCMS 回答:PyTorch的nn.DataParallel是否在每个GPU中加载相同的模型?
首先,it is advised改为使用torch.nn.parallel.DistributedDataParallel
。
您可以查看torch.nn.DataParallel
文档,其中描述了该过程(您也可以查看source code并深入了解github,here是模块复制的方式执行)。
大致是这样的:
初始化
所有(或选定的)设备ID均保存在构造函数和维度中,数据将沿该维度分散(几乎总是0
,这意味着它将沿批处理拆分为设备)
转发
这是在每次运行forward
期间完成的:
- 输入是分散的(沿尺寸
tuple
,list
,dict
浅化复制,其他数据在线程之间共享)。 - 如果只有一台设备,只需返回
module(*args,**kwargs)
- 如果有多个设备,请将网络从源计算机复制到其他设备(每次都完成!)
- 使用各自的输入在每个设备上向前运行
- 将设备的输出收集到单个源设备上(输出的串联)到源计算机上。
- 运行其余代码,反向传播,更新源计算机上的权重等。
默认情况下,源计算机为cuda:0
,但可以选择它。此外,权重在单个device
上进行更新,仅分散批次并收集输出。