DP和DDP是并行训练的两种方法,本文简单介绍它们两者的区别。
一、DP (Data Parallel)
DP是单进程,多线程的,每个线程负责一个GPU,它只实用于一台机器。DP训练的流程如下图所示(图片转载自:https://medium.com/@mlshark/dataparallel-vs-distributeddataparallel-in-pytorch-whats-the-difference-0af10bb43bc7):
- 选择一个GPU作为主GPU,后面梯度(gradients)的计算和模子参数的更新都是在主GPU上完成;
- 每个GPU都会收到初始模子;
- 训练数据被均分到每个显卡;
- 每个GPU各自独立地举行前向传播和反向传播计算,得到各自的梯度。除了主GPU,其他GPU都会把梯度拷贝到共享内存中;
- 主GPU从共享内存中收集gather其他所有GPU的梯度,然后做reduce(mean or sum)计算。得到末了梯度后,对模子参数举行更新,更新后的模子会拷贝到共享内存中,其他GPU会从共享内存中拷贝出(scatter)更新后的模子。至此,一轮训练就结束了,每个GPU上的模子都被更新了而且都保持同等(sync)。
从上面的过程中可以看到,梯度的计算和模子的更新都只在一个GPU上举行,这限定了训练的效率;同时,为了保持各个GPU上的模子同步同等,DP训练涉及大量的内存拷贝。DP训练的这种scatter updated model - gather gradients - per-iteration model copy模式,以及Python中多线程GIL的限定,带来了极大的性能负担,所以即使在一台机器上DP一般都会比DPP训练慢。因此,DP训练只实用于小型或中型模子,不适合大型模子。
二、DDP (Distributed Data Parallel)
DDP是多进程,每个进程负责一个GPU,支持在一台机器或多台机器上并行训练。DDP训练的过程如下:
- 每个进程都会拿到相同的模子初始状态;
- 训练数据被均分到每个GPU;
- 每个GPU各自独立地举行前向传播和反向传播计算,得到各自的梯度;
- 当进步程的梯度ready后,会异步调用allreduce方法对所有进程的梯度举行均匀。此过程完成后,所有进程的梯度都会更新为相同的均匀后的梯度;
- 每个进程独立地更新模子参数。因为每个进程开始时拿到的都是相同的初始模子,每次反向传播后拿到的也是相同的均匀梯度,所以每轮训练过后,所有进程中的模子都是保持同等的(sync)。
跟DP相比,DDP中每个进程都是独立地更行模子参数,最大化利用了硬件资源,因此训练更高效快速。
此外DPP比DP有更好的容错机制。如果训练过程中某个GPU出问题了,对于DP,整个训练就会中断甚至失败;对于DDP,它的内置容错机制可以让训练继续下去,最小水平地受到某个GPU断线的影响。
三、其他一些知识点
- DDP中的allreduce具体是怎么对所有GPU的梯度举行均匀的,可以参考这篇文章:https://bobondemon.github.io/2020/12/20/Distributed-Data-Parallel-and-Its-Pytorch-Example/
- 在DDP训练中,机器又叫node,GPU又叫device。假设有N个node,每个node上有G个GPU,那么所有的process数量总和(N*G)就是World Size (W),每个node上所有的process数量总和叫做Local World Size (L)。每个process都会有两个ID:local rank [0, L-1]和global rank [0, w-1]。
- nccl与gloo: 设置DDP环境的时候,通常访问到nccl和gloo两个设置。nccl是专门用于NVIDIA GPU与GPU之间通信的。gloo既支持CPU又支持GPU,但是性能肯定不如nccl。
- dist.init_process_group("gloo", rank=rank, world_size=world_size)
- dist.init_process_group("nccl", rank=rank, world_size=world_size)
复制代码
参考整理自:
- https://www.run.ai/guides/distributed-computing/pytorch-parallel-training
- https://medium.com/@mlshark/dataparallel-vs-distributeddataparallel-in-pytorch-whats-the-difference-0af10bb43bc7
- https://pytorch.org/docs/main/notes/ddp.html
- https://github.com/pytorch/examples/blob/main/distributed/ddp/README.md
- https://pytorch.org/tutorials/intermediate/ddp_tutorial.html
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |