parallel_apply: 现在模型和数据都有了,所以当然就是并行化的计算咯,最后返回的是一个list,每个元素是对应GPU的计算结果。 gather:每个GPU计算完了之后需要将结果发送到第一个GPU上进行汇总,可以看到最终的tensor大小是[16,20],这符合预期。
parallel_apply: 现在模型和数据都有了,所以当然就是并行化的计算咯,最后返回的是一个list,每个元素是对应GPU的计算结果。 gather:每个GPU计算完了之后需要将结果发送到第一个GPU上进行汇总,可以看到最终的tensor大小是[16,20],这符合预期。 MARSGGBO♥原创 2019-9-17 MARSGGBO♥原创 2019-9-17 __EOF__...
从forward 函数可以看出,关键函数有 scatter, replicate, parallel_apply 和 gather,我们一个一个看一下。 首先是 scatter 函数,即 scatter_kwargs 函数。 def scatter_kwargs(inputs, kwargs, target_gpus, dim=0): r"""Scatter with support for kwargs dictionary""" # 主要函数 inputs = scatter(input...
criterion_parallel_apply是仿照torch/nn/parallel/parallel_apply.py文件中的函数parallel_apply写的。 classDataParallelCriterion(DataParallel):defforward(self,inputs,*targets,**kwargs):# 接收的输入不同,DataParallel只有*inputs,# 两者不同在于,inputs在这之前被scatter了,而targets还没有ifnotself.device_ids:...
并行的应用(parallel_apply):将第三步得到的分布式的输入数据应用到第一步中拷贝的多个模型上。 实现代码如下 #Replicate module to devices in device_idsreplicas =nn.parallel.replicate(module, device_ids)#Distribute input to devices in device_idsinputs =nn.parallel.scatter(input, device_ids)#Apply the...
代码就是 model=torch.nn.DaraParallel(model)。 实际上 DP 是一个Pytorch的nn.Module,所以模型和优化器都需要使用.module来得到实际的模型和优化器。 把数据载入到主GPU。 data,label= data.cuda(),label.cuda() 进行前向传播。 DP 会把模型module 在每个device上复制一份。
接下来,nn.DataParallel会在每个GPU上分别计算模型的输出,并使用torch.nn.parallel.gather函数将各个GPU上的输出合并起来,得到最终的输出。最后,nn.DataParallel会计算损失函数和梯度,并使用torch.nn.parallel.parallel_apply函数将梯度应用到各个GPU上的模型副本上,最终得到更新后的模型参数。
Pytorch并行计算:nn.parallel.replicate, scatter, gather, parallel_apply,最后输出为可以看到整个流程如下:replicas:将模型复制若干份,这里只有两个GPU,所以复制两份scatter:将输入数据若干等分,这里划分成了两份,会返回一个tuple。因为batchsize=16,所以刚好可以
parallel_apply:将我们从我们从Scatter中得到的一套分布式的input,输入到相应的分布式Module中,我们是通过复制得到的这些模块。#将模块复制到设备id中的设备replicas = nn.parallel.replicate(module, device_ids)#将输入分配到设备id中的设备inputs = nn.parallel.scatter(input, device_ids)#将模型应用于相应的...
(self, inputs, kwargs, device_ids): return scatter_kwargs(inputs, kwargs, device_ids, dim=self.dim) def parallel_apply(self, replicas, inputs, kwargs): return parallel_apply(replicas, inputs, kwargs, self.device_ids[:len(replicas)]) def gather(self, outputs, output_device): return...