PyTorch并行与分布式(一)概述
文章目录
- 数据并行
- 模型并行
- 数据并行训练
- 单机多GPU的DataParallel方式:
- 单机多GPU的DistributedDataParallel方式:
- 通用的分布式训练
- 参考
逃也逃不掉,并行与分布式肯定是要整起来的。本系列主要来自官方教程学习笔记。
从基本的并行化原理上来讲,分布式深度学习分为数据并行(Data Parallelism
)以及模型并行(Model Parallelism
)。
数据并行指每个设备有神经网络模型的完整拷贝并独立处理其输入数据流、每次迭代后将更新归并到参数服务器(Parameter Server
)上;
数据并行
在参数服务器策略中,worker
和parameter
进程的数量是可变的,每个worker
进程在GPU
内存中维护自己的模型独立副本。梯度更新计算如下:
- 在接收到开始信号后,每个工作进程为其特定的批处理片积累梯度。
- 这些
worker
将更新发送到参数服务器。 - 参数服务器会一直等待,直到它们拥有所有
worker
更新,然后对它们负责的梯度更新参数空间的那部分梯度求平均。 - 梯度更新被分散到
worker
上,然后将它们加起来,应用到内存中模型权重的副本上(从而保持worker模型同步)。 - 一旦每个
worker
都应用了更新,新的一批训练就可以开始了。
但是会要求n
个worker
的网络调用,速度取决于计算最慢的那个worker
。
更现代的分布式培训策略废除了参数服务器,在DistributedDataParallel
并行策略中,每个进程都是一个工作进程。每个进程仍然在内存中维护模型权重的完整副本,但是批处理片梯度更新现在是同步的,并且直接在工作进程本身上平均。这是使用从高性能计算领域借来的技术来实现的:全归约算法(all-reduce algorithm
)。
模型并行
模型并行指每个设备有模型的一部分参数、多个设备共同来处理一条输入数据流并更新各自部分的模型参数。
依据PyTorch
的1.6.0
版本,Pytorch
的并行包主要可以分为三类:
- 分布式数据并行训练(Distributed Data-Parallel Training (
DDP
))
分布式数据并行训练,在单个程序中将数据分布到多个GPU
上训练的一种范式。在DDP
中,模型会被复制到不同的进程中去,这些被复制到不同进程中的模型会被喂不同的数据样本。DDP
主要关心的是计算的梯度之间的通信,以此来保证这些复制的模型版本之间的同步关系,来保证加速训练。
- 基于
RPC
的分布式训练(RPC-Based Distributed Training (RPC
) )
基于RPC
的分布式训练是为了支持无法采用分布式数据并行这种方式而开发的一种泛化能力更强的训练结构。像分布式pipeline并行(distributed pipeline parallelism
),参数服务器并行(parameter server paradigm
),结合DDP
和其它训练的并行计算。
- 聚合通信(Collective Communication (c10d))
Collective Communication (c10d)
库支持在一个组内的各个进程之间发送 tensors
。它提供了集体通信API
(如all_reduce
和all_gather
)和P2P
通信API
(如send
和isend
)。
DDP
和RPC
(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.launch launch
程序来启动程序。参考Use nn.parallel.DistributedDataParallel instead of multiprocessing or nn.DataParallel
通用的分布式训练
在实际的应用场景中,单机并行的这种方式还是不太够用,需要上分布式。比如像parameter server paradigm
,distributed pipeline parallelism
,还有像强化学习中智能体的并行等方式。torch.distributed.rpc
就是用来解决这个问题。
参考
- PYTORCH DISTRIBUTED OVERVIEW
- PyTorch官方教程
- 什么是并行分布式深度学习?
- DLPerf—分布式深度学习最佳入门(踩坑)指南
- 分布式通信包torch.distributed
PyTorch并行与分布式(一)概述相关推荐
- 深度神经网络的分布式训练概述:常用方法和技巧全面总结
论文地址:https://arxiv.org/abs/1810.11787 深度学习已经为人工智能领域带来了巨大的发展进步.但是,必须说明训练深度学习模型需要显著大量的计算.在一台具有一个现代 GPU ...
- PyTorch多卡分布式训练:DistributedDataParallel (DDP) 简要分析
©作者 | 伟大是熬出来的 单位 | 同济大学 研究方向 | 机器阅读理解 前言 因为课题组发的卡还没有下来,先向导师问了实验室的两张卡借用.之前都是单卡训练模型,正好在这个机会实践以下单机多卡训练模 ...
- Pytorch 并行训练(DP, DDP)的原理和应用
Pytorch 并行训练(DP, DDP)的原理和应用 1. 前言 并行训练可以分为数据并行和模型并行. 模型并行 模型并行主要应用于模型相比显存来说更大,一块 device 无法加载的场景,通过把模 ...
- 并行与分布式、集群、网格计算、云计算的概念
转自:http://blog.163.com/litianyichuanqi@126/blog/static/1159794412012387453794/ 一.并行计算与分布式计算 并行计算:并行计 ...
- [并行与分布式程序设计] Flynn分类法 和 并行算法的评价指标
并行与分布式程序设计 Flynn's taxonomy SISD SIMD MISD MIMD 并行算法性能的评价指标 加速比 Amdahl's Law 效率 可扩展性 三级目录 Flynn's ta ...
- 快手八卦!突破TensorFlow、PyTorch并行瓶颈的开源分布式训练框架来了!
来源:AI前线本文约5200字,建议阅读8分钟 本文介绍了专门针对分布式场景设计了特定的优化算法同比,性能较同类提升60%. 近日,快手和苏黎世理工宣布开源分布式训练框架 Bagua(八卦),相比于 ...
- 当代研究生应当掌握的5种Pytorch并行训练方法(单机多卡)
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者丨纵横@知乎 来源丨https://zhuanlan.zhihu ...
- 概念区分:并行、分布式、集群、云、超算
并行计算(Parallel Computing) 并行计算的主要目的是快速解决大型且复杂的计算问题. 并行计算可以划分成时间并行和空间并行.时间并行即流水线技术,空间并行使用多个处理器执行并发计算,当 ...
- 分布式事务_实施分布式锁概述
分布式事务 众所周知,锁通常用于监视和控制多个线程同时访问共享资源. 它们基本上保护并发应用程序中的数据完整性和原子性,即,一次只能有一个线程可以获取共享资源上的锁,否则将无法访问该锁. 但是在分布式 ...
- 分布式事务概述 (资料)
2019独角兽企业重金招聘Python工程师标准>>> 什么是分布式系统 分布式系统是由一组通过网络进行通信.为了完成共同的任务而协调工作的计算机节点组成的系统.分布式系统的出现是为 ...
最新文章
- head部分关于搜索引擎
- CSS清除浮动大全共8种方法
- 关于Webview带参访问服务器
- Django 笔记6 -- 多表查询
- Uva 725 除法
- python整数格式显示_[python之路]格式化显示
- centos7 日志文件
- 使用Android OpenGL ES 2.0绘图之二:定义形状
- MySQL数据库安装、初始化及修改密码
- 拓端tecdat|Python多项式Logistic逻辑回归进行多类别分类和交叉验证准确度箱线图可视化
- C# 创建文件夹 Directory
- min-max容斥【概念+例题解析】
- Eclipse中配置mybatis-3-config.dtd
- gentoo AR9285 BCM57780 安装驱动
- catia怎么创建约束快捷键_CATIA怎么设置快捷键?
- 餐厅座位表 canvas实现
- redis 安装以及redis desktop manger 连接
- 彩色图像加密matlab算法,彩色图像混沌加密算法
- POJ 1370 Gossiping 笔记
- 常见测试用例设计之水杯
热门文章
- web安全day23:vim软件的最基本最常用操作
- Security+ 学习笔记34 硬件安全
- IS-IS for IPv6技术原理
- Open Xml 读取Excel中的图片
- Pyhton网络爬虫实例_豆瓣电影排行榜_Xpath方法爬取
- 047——VUE中css过渡动作实例
- 单源点最短路径(Bellman-Ford)原理及js实现
- 网络对抗技术——密码破解技术
- Apache Spark源码走读(十)ShuffleMapTask计算结果的保存与读取 WEB UI和Metrics初始化及数据更新过程分析...
- Office版本差别引发的语法问题