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就是用来解决这个问题。

参考

相关实践学习
在云上部署ChatGLM2-6B大模型(GPU版)
ChatGLM2-6B是由智谱AI及清华KEG实验室于2023年6月发布的中英双语对话开源大模型。通过本实验,可以学习如何配置AIGC开发环境,如何部署ChatGLM2-6B大模型。
相关文章
|
9天前
|
并行计算 算法 调度
基于串行并行ADMM算法的主从配电网分布式优化控制研究(Matlab代码实现)
基于串行并行ADMM算法的主从配电网分布式优化控制研究(Matlab代码实现)
|
10月前
|
机器学习/深度学习 边缘计算 人工智能
第二届边缘计算与并行、分布式计算国际学术会议(ECPDC 2025) 2025 2nd international Conference on Edge Computing, Parallel and Distributed Computing
第二届边缘计算与并行、分布式计算国际学术会议(ECPDC 2025) 2025 2nd international Conference on Edge Computing, Parallel and Distributed Computing 机器学习 计算学习理论 数据挖掘 科学计算 计算应用 数字图像处理 人工智能
221 6
|
存储 关系型数据库 分布式数据库
PolarDB 并行查询问题之分布式查询执行过程中的数据分发如何解决
PolarDB 并行查询问题之分布式查询执行过程中的数据分发如何解决
113 1
|
机器学习/深度学习 并行计算 PyTorch
PyTorch与DistributedDataParallel:分布式训练入门指南
【8月更文第27天】随着深度学习模型变得越来越复杂,单一GPU已经无法满足训练大规模模型的需求。分布式训练成为了加速模型训练的关键技术之一。PyTorch 提供了多种工具来支持分布式训练,其中 DistributedDataParallel (DDP) 是一个非常受欢迎且易用的选择。本文将详细介绍如何使用 PyTorch 的 DDP 模块来进行分布式训练,并通过一个简单的示例来演示其使用方法。
1924 2
|
分布式计算 并行计算 大数据
NumPy 并行计算与分布式部署
【8月更文第30天】随着数据量的不断增长,传统的单机计算模型已经难以满足对大规模数据集处理的需求。并行和分布式计算成为了处理这些大数据集的关键技术。虽然 NumPy 本身并不直接支持并行计算,但可以通过结合其他库如 Numba 和 Dask 来实现高效的并行和分布式计算。
169 1
|
SQL 存储 网络协议
分布式的概述
分布式的概述
|
机器学习/深度学习 分布式计算 PyTorch
构建可扩展的深度学习系统:PyTorch 与分布式计算
【8月更文第29天】随着数据量和模型复杂度的增加,单个GPU或CPU已无法满足大规模深度学习模型的训练需求。分布式计算提供了一种解决方案,能够有效地利用多台机器上的多个GPU进行并行训练,显著加快训练速度。本文将探讨如何使用PyTorch框架实现深度学习模型的分布式训练,并通过一个具体的示例展示整个过程。
500 0
|
存储 异构计算
自研分布式训练框架EPL问题之通过strategy annotation实现流水并行如何解决
自研分布式训练框架EPL问题之通过strategy annotation实现流水并行如何解决
|
1月前
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
190 2
|
1月前
|
存储 缓存 NoSQL
【📕分布式锁通关指南 12】源码剖析redisson如何利用Redis数据结构实现Semaphore和CountDownLatch
本文解析 Redisson 如何通过 Redis 实现分布式信号量(RSemaphore)与倒数闩(RCountDownLatch),利用 Lua 脚本与原子操作保障分布式环境下的同步控制,帮助开发者更好地理解其原理与应用。
97 0

热门文章

最新文章

推荐镜像

更多