从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...
replicas = replicate(module, used_device_ids) outputs = parallel_apply(replicas, inputs, module_kwargs, used_device_ids) return gather(outputs, output_device, dim) 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. ...
replicas: 将模型复制若干份,这里只有两个GPU,所以复制两份 scatter: 将输入数据若干等分,这里划分成了两份,会返回一个tuple。因为batch size=16,所以刚好可以划分成8和8,那如果是15怎么办呢?没关系,它会自动划分成8和7,这个你自己可以做实验感受一下。 parallel_apply: 现在模型和数据都有了,所以当然就是并行...
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: 现在模型和数据都有了,所以当然就是并行化的计算咯,最后返回的是一个list,每个元素是对应GPU的计算结果。 gather:每个GPU计算完了之后需要将结果发送到第一个GPU上进行汇总,可以看到最终的tensor大小是[16,20],这符合预期。 __EOF__
并行的应用(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...
Pytorch并行计算:nn.parallel.replicate, scatter, gather, parallel_apply,最后输出为可以看到整个流程如下:replicas:将模型复制若干份,这里只有两个GPU,所以复制两份scatter:将输入数据若干等分,这里划分成了两份,会返回一个tuple。因为batchsize=16,所以刚好可以
一般来说,pytorch的nn.parallel原语可以独立使用。我们实现了简单的类似MPI的原语: 复制:在多个设备上复制模块 散点:在第一维中分配输入 收集:收集并连接第一维中的输入 parallel_apply:将一组已经分布的输入应用于一组已经分布的模型。 为了给出更好的清晰度,这里的功能data_parallel使用这些集合 ...
parallel_apply:将我们从我们从Scatter中得到的一套分布式的input,输入到相应的分布式Module中,我们是通过复制得到的这些模块。#将模块复制到设备id中的设备replicas = nn.parallel.replicate(module, device_ids)#将输入分配到设备id中的设备inputs = nn.parallel.scatter(input, device_ids)#将模型应用于相应的...
https://github.com/pytorch/pytorch/blob/master/torch/nn/parallel/parallel_apply.py#L22 Is this a compulsion to have input to module to be of type variable or nested list of variables? In one of my use cases, I wanted it to have a dict as input. ...