PyTorch并行与分布式(一)概述

简介: PyTorch并行与分布式(一)概述

  逃也逃不掉,并行与分布式肯定是要整起来的。本系列主要来自官方教程学习笔记。

  从基本的并行化原理上来讲,分布式深度学习分为数据并行Data Parallelism)以及模型并行(Model Parallelism)。

  数据并行指每个设备有神经网络模型的完整拷贝并独立处理其输入数据流、每次迭代后将更新归并到参数服务器(Parameter Server)上;

数据并行

  在参数服务器策略中,workerparameter进程的数量是可变的,每个worker进程在GPU内存中维护自己的模型独立副本。梯度更新计算如下:

  1. 在接收到开始信号后,每个工作进程为其特定的批处理片积累梯度。
  2. 这些worker将更新发送到参数服务器。
  3. 参数服务器会一直等待,直到它们拥有所有worker更新,然后对它们负责的梯度更新参数空间的那部分梯度求平均。
  4. 梯度更新被分散到worker上,然后将它们加起来,应用到内存中模型权重的副本上(从而保持worker模型同步)。
  5. 一旦每个worker都应用了更新,新的一批训练就可以开始了。

  但是会要求nworker的网络调用,速度取决于计算最慢的那个worker

  更现代的分布式培训策略废除了参数服务器,在DistributedDataParallel并行策略中,每个进程都是一个工作进程。每个进程仍然在内存中维护模型权重的完整副本,但是批处理片梯度更新现在是同步的,并且直接在工作进程本身上平均。这是使用从高性能计算领域借来的技术来实现的:全归约算法(all-reduce algorithm)。

模型并行

  模型并行指每个设备有模型的一部分参数、多个设备共同来处理一条输入数据流并更新各自部分的模型参数。

  依据PyTorch1.6.0版本,Pytorch的并行包主要可以分为三类:

  1. 分布式数据并行训练(Distributed Data-Parallel Training (DDP))

  分布式数据并行训练,在单个程序中将数据分布到多个GPU上训练的一种范式。在DDP中,模型会被复制到不同的进程中去,这些被复制到不同进程中的模型会被喂不同的数据样本。DDP主要关心的是计算的梯度之间的通信,以此来保证这些复制的模型版本之间的同步关系,来保证加速训练。

  1. 基于RPC的分布式训练(RPC-Based Distributed Training (RPC) )

  基于RPC的分布式训练是为了支持无法采用分布式数据并行这种方式而开发的一种泛化能力更强的训练结构。像分布式pipeline并行(distributed pipeline parallelism),参数服务器并行(parameter server paradigm),结合DDP和其它训练的并行计算。

  1. 聚合通信(Collective Communication (c10d))

  Collective Communication (c10d)库支持在一个组内的各个进程之间发送 tensors。它提供了集体通信API(如all_reduceall_gather)和P2P通信API(如sendisend)。

  DDPRPC(ProcessGroup Backend)从v1.6.0开始就建立在c10d上,其中前者使用聚合通信,后者使用P2P通信。

数据并行训练

  pytorch为数据并行训练提供了几种方式:

单机多GPU的DataParallel方式:

  • torch.nn.DataParallel

  torch.nn.DataParallel这种方式能够以较简单的方式实现单机多GPU的并行训练,但是它的性能并不好,因为在多个GPU上的数据最后汇总会有Python解释器的GIL导致的性能开销。因此官方推荐使用DistributedDataParallel

单机多GPU的DistributedDataParallel方式:

  • torch.nn.parallel.DistributedDataParallel

  与DataParallel相比,DistributedDataParallel要求更多一步init_process_group

  DistributedDataParallel和 之间的区别DataParallel是:DistributedDataParallel使用multiprocessing,即为每个GPU创建一个进程,而DataParallel使用多线程。因此DDP的方式复制的各个模型之间没有GIL的关系。关于DDP更详细的资料,可以参考论文:PyTorch Distributed: Experiences on Accelerating Data Parallel Training

  多机器的情况下只能使用DistributedDataParallel方式。如果您使用DistributedDataParallel,则可以使用torch.distributed.launchlaunch程序来启动程序。参考Use nn.parallel.DistributedDataParallel instead of multiprocessing or nn.DataParallel

通用的分布式训练

  在实际的应用场景中,单机并行的这种方式还是不太够用,需要上分布式。比如像parameter server paradigmdistributed pipeline parallelism,还有像强化学习中智能体的并行等方式。torch.distributed.rpc就是用来解决这个问题。

参考

相关实践学习
基于阿里云DeepGPU实例,用AI画唯美国风少女
本实验基于阿里云DeepGPU实例,使用aiacctorch加速stable-diffusion-webui,用AI画唯美国风少女,可提升性能至高至原性能的2.6倍。
相关文章
|
8天前
|
存储 人工智能 PyTorch
基于PyTorch/XLA的高效分布式训练框架
基于PyTorch/XLA的高效分布式训练框架
48 2
|
8天前
|
机器学习/深度学习 负载均衡 PyTorch
PyTorch分布式训练:加速大规模数据集的处理
【4月更文挑战第18天】PyTorch分布式训练加速大规模数据集处理,通过数据并行和模型并行提升训练效率。`torch.distributed`提供底层IPC与同步,适合定制化需求;`DistributedDataParallel`则简化并行过程。实际应用注意数据划分、通信开销、负载均衡及错误处理。借助PyTorch分布式工具,可高效应对深度学习的计算挑战,未来潜力无限。
|
8天前
|
分布式计算 并行计算 数据处理
NumPy的并行与分布式计算实践
【4月更文挑战第17天】本文探讨了如何使用NumPy进行并行和分布式计算以提升效率。介绍了利用`numexpr`加速多核CPU计算,设置`NUMPY_NUM_THREADS`环境变量实现多线程,并通过Dask和PySpark进行分布式计算。Dask允许无缝集成NumPy,而PySpark则将NumPy数组转换为RDD进行并行处理。这些方法对处理大规模数据至关重要。
|
8天前
|
并行计算 PyTorch 算法框架/工具
基于mps的pytorch 多实例并行推理
基于mps的pytorch 多实例并行推理
127 1
|
6月前
|
并行计算 PyTorch 算法框架/工具
Pytorch:模型的保存/加载、并行化、分布式
Pytorch:模型的保存/加载、并行化、分布式
99 0
|
9月前
|
算法 安全 调度
基于串行和并行ADMM算法在分布式调度中的应用(Matlab代码实现)
基于串行和并行ADMM算法在分布式调度中的应用(Matlab代码实现)
|
9月前
|
机器学习/深度学习 并行计算 安全
PyTorch并行与分布式(四)Distributed Data Papallel
PyTorch并行与分布式(四)Distributed Data Papallel
172 0
|
9月前
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch并行与分布式(三)DataParallel原理、源码解析、举例实战
PyTorch并行与分布式(三)DataParallel原理、源码解析、举例实战
374 0
|
8天前
|
NoSQL Java 关系型数据库
【Redis系列笔记】分布式锁
分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁,只要大家使用的是同一把锁,那么我们就能锁住线程,不让线程进行,让程序串行执行,这就是分布式锁的核心思路
137 2
|
8天前
|
存储 监控 NoSQL
【Redis】分布式锁及其他常见问题
【Redis】分布式锁及其他常见问题
36 0