PyTorch Distributed Overview — PyTorch Tutorials 1.10.0+cu102 documentationhttps://pytorch.org/tutorials/beginner/dist_overview.html#
1.介绍
从PyTorch v1.6.0起,torch.distributed中的特性可分为三个主要组成部分:
- Distributed Data-Parallel Training (DDP):一种被广泛采用的单程序多数据的分布式训练模式。
- RPC-Based Distributed Training (RPC):用于支持无法适应数据并行训练的模型结构进行分布式训练(如强化学习等)。
- Collective Communication (c10d):这个库支持了 collective communication APIs (e.g., all_reduce and all_gather) 和P2P communication APIs (e.g., send and isend)。此库是DDP和RPC的基础,其中DDP使用collective communication而RPC使用P2P communication。
Pytorch的多GPU训练可分为“数据并行”和“模型并行”,其中常用的DP,DDP都属于数据并行,DDP能够结合模型并行,具体可见系列详情。本篇只做概括性的介绍和提供一些相关的官方参考链接。
2.数据并行训练(Data Parallel Training)
数据并行训练可以分为以下几个等级:
1.使用单设备训练。(无数据并行)
2.使用DataParallel进行单机器-多GPU训练。此方法实现起来最简单。
3.使用DistributedDataParallel进行单机器-多GPU训练。此方法只需要多写部分代码就能实现更快的加速。
4.使用DistributedDataParallel和launching script进行多机器-多GPU训练。
5.使用 torchelastic进行数据并行训练。此方法是为了支持错误恢复的(try-except),由于是多DistributedDataParallel是多进程训练,普通的try-excepted无法正常使用,如果有OOM这类的错误需要恢复程序,则需要特别用到此方法。
3.torch.nn.DataParallel
torch.nn.DataParallel是支持单机器-多GPU训练的最简单的方法,需要最少的代码修改。但是,由于DataParallel使用的是PS模式,它的通信速度受到限制。并且,由于它使用的是单进程-多线程的模式,自然而然地受到了python全局解释器锁(GIL)的限制。相关资料可见Optional: Data Parallelism (DP的基本用法,重点)
4.torch.nn.parallel.DistributedDataParallel
相对于DataParallel,DDP使用的是多进程的模式,因此不受到GIL的限制,速度更快。并且,DDP采用ring-all-reduce模式也能提升一定的通信速度。总的来说,虽然DP和DDP都是采用数据并行的方法(而不是模型并行),但DDP有着明显的优势(速度,显存消耗等)。
DDP相关材料如下:
1.DDP notes提供了初学者示例和一些简单的设计及实现描述。如果你初步接触DDP,可以从此文档开始。
2.Single-Machine Model Parallel Best Practices介绍了单机器-多GPU训练“模型并行”的相关情况。
3.Getting Started with Distributed Data Parallel介绍了一些DDP的基本用法。(重点)
4.Launching and configuring distributed data parallel application介绍了如何去使用DDP launching script以支持多机器-多GPU的训练模式。
5.Shard Optimizer States With ZeroRedundancyOptimizer介绍了ZeroRedundancyOptimizer如何减少分布式数据并行训练的优化器内存占用。
5.TorchElastic
当程序逻辑复杂,错误恢复功能总是格外重要。例如,当出现OOM(GPU内存不足)错误时,我们希望简单地将batchsize减少一半来继续运行这个程序。但是,由于DDP是由多进程实现的,本身不支持基础的try-except模式。所以,如果你需要在使用DDP时保证有错误恢复功能,则需要用到torchelastic
6.一般的分布式训练(General Distributed Training)
许多训练过程不支持数据并行训练(如:强化学习、Transformer等),此时的分布式训练就需要用到torch.distributed.rpc。(暂时不做了解)