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

参考

相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
相关文章
|
6月前
|
机器学习/深度学习 分布式计算 数据处理
分布式计算框架:并行力量的交响乐章
分布式计算框架如Apache Spark解决单机计算挑战,通过拆分任务到多机并行处理提升效率。Spark以其内存计算加速处理,支持批处理、查询、流处理和机器学习。以下是一个PySpark统计日志中每日UV的示例,展示如何利用SparkContext、map和reduceByKey进行数据聚合分析。这些框架的运用,正改变大数据处理领域,推动数据分析和机器学习的边界。【6月更文挑战第18天】
253 2
|
1月前
|
机器学习/深度学习 边缘计算 人工智能
第二届边缘计算与并行、分布式计算国际学术会议(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 机器学习 计算学习理论 数据挖掘 科学计算 计算应用 数字图像处理 人工智能
60 6
|
4月前
|
分布式计算 并行计算 大数据
NumPy 并行计算与分布式部署
【8月更文第30天】随着数据量的不断增长,传统的单机计算模型已经难以满足对大规模数据集处理的需求。并行和分布式计算成为了处理这些大数据集的关键技术。虽然 NumPy 本身并不直接支持并行计算,但可以通过结合其他库如 Numba 和 Dask 来实现高效的并行和分布式计算。
45 1
|
3月前
|
SQL 存储 网络协议
分布式的概述
分布式的概述
|
4月前
|
机器学习/深度学习 并行计算 PyTorch
PyTorch与DistributedDataParallel:分布式训练入门指南
【8月更文第27天】随着深度学习模型变得越来越复杂,单一GPU已经无法满足训练大规模模型的需求。分布式训练成为了加速模型训练的关键技术之一。PyTorch 提供了多种工具来支持分布式训练,其中 DistributedDataParallel (DDP) 是一个非常受欢迎且易用的选择。本文将详细介绍如何使用 PyTorch 的 DDP 模块来进行分布式训练,并通过一个简单的示例来演示其使用方法。
537 2
|
4月前
|
机器学习/深度学习 分布式计算 PyTorch
构建可扩展的深度学习系统:PyTorch 与分布式计算
【8月更文第29天】随着数据量和模型复杂度的增加,单个GPU或CPU已无法满足大规模深度学习模型的训练需求。分布式计算提供了一种解决方案,能够有效地利用多台机器上的多个GPU进行并行训练,显著加快训练速度。本文将探讨如何使用PyTorch框架实现深度学习模型的分布式训练,并通过一个具体的示例展示整个过程。
194 0
|
4月前
|
存储 异构计算
自研分布式训练框架EPL问题之通过strategy annotation实现流水并行如何解决
自研分布式训练框架EPL问题之通过strategy annotation实现流水并行如何解决
|
5月前
|
分布式计算 API 对象存储
Ray是一个开源的分布式计算框架,用于构建和扩展分布式应用。它提供了简单的API,使得开发者可以轻松地编写并行和分布式代码,而无需担心底层的复杂性。
Ray是一个开源的分布式计算框架,用于构建和扩展分布式应用。它提供了简单的API,使得开发者可以轻松地编写并行和分布式代码,而无需担心底层的复杂性。
1013 11
|
6月前
|
存储 关系型数据库 MySQL
深入OceanBase内部机制:高性能分布式(实时HTAP)关系数据库概述
深入OceanBase内部机制:高性能分布式(实时HTAP)关系数据库概述
|
2月前
|
NoSQL Java Redis
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
Redis分布式锁在高并发场景下是重要的技术手段,但其实现过程中常遇到五大深坑:**原子性问题**、**连接耗尽问题**、**锁过期问题**、**锁失效问题**以及**锁分段问题**。这些问题不仅影响系统的稳定性和性能,还可能导致数据不一致。尼恩在实际项目中总结了这些坑,并提供了详细的解决方案,包括使用Lua脚本保证原子性、设置合理的锁过期时间和使用看门狗机制、以及通过锁分段提升性能。这些经验和技巧对面试和实际开发都有很大帮助,值得深入学习和实践。
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?