几种流行的并行方法了解

几种流行的并行方法:

  • 数据并行(data parallel)
  • 模型并行(model parallel)
    • tensor并行
    • pipeline并行
    • sequence并行
  • Zero Redundancy Data Parallelism(ZeRO)

Data parallelism (DP)

经典的数据并行算法是在多个设备上都拷贝一份完整的模型参数,彼此之间可以独立计算,所以每个设备传入的输入数据不一样​,这也是为什么叫数据并行。只不过,每隔一段时间(比如一个batch或者若干个batch)后需要彼此之间同步模型权重的梯度​。随着模型大小不断增大,单个GPU的内存已经无法容纳现如今的大模型,所以便有了后面会介绍的模型并行​。

Model Parallelism (MP)

Pipeline Parallelism (PP)

pipeline parallelism是比较常见的模型并行算法,它是模型做层间划分,即inter-layer parallelism。以下图为例,如果模型原本有6层,你想在2个GPU之间运行pipeline,那么每个GPU只要按照先后顺序存3层模型即可。

已经有很多Pipeline相关的研究工作了,例如PipeDream,GPipe,和Chimera。它们的主要目的都是降低bubble time。

Tensor Parallelism (TP)

前面介绍的Pipeline Parallelism是对模型层间做划分,叫inter-layer parallelism。那么另一种方式则是对模型层内做划分,即intra-layer Parallelism,也叫Tensor Parallelism。

1D Tensor Parallelism

Megatron-LM [1] 是最早提出1D Tensor并行的工作。该工作主要是为了优化transformer训练效率,把线性层按照行或者列维度对权重进行划分。如图4所示,原本线性层为${\rm{Y}} = {W_1}{W_2}X$,这里将${W_1}$按列进行划分,将${W_2}$按行进行划分。这样,每个GPU只需要存一半的权重即可,最后通过All-reduce操作来同步Y的结果。当GPU数量为N𝑁时,每个GPU只需要存1N的权重即可,只不过每层输出需要用All-reduce来补全结果之后才能继续下一层的计算。

1D Tensor并行对通信速度要求较高,不过1D在每层的输入和输出都有冗余的内存开销。以图4为例,我们可以看到虽然模型权重被划分了,但是每个GPU都有重复的输入X𝑋,另外All-reduce之后每个GPU也会有重复的输出Y𝑌,所以后续一些工作尝试从这里做进一步改进,包括2D, 2.5D,和3D tensor并行。

2D Tensor Parallelism

2D Tensor Parallel [2] 基于SUMMA和Cannon矩阵相乘算法沿着两个不同的维度对 输入数据模型权重每层的输出 进行划分。给定N𝑁个GPU,tensor会被划分成N𝑁个chunk(使用torch.chunk),每个GPU保存一个chunk。这N𝑁个GPU呈方形网络拓扑结构,即每行每列均为√N𝑁个GPU。图6b展示了常见的4-GPU的节点划分示意图,假设tensor的维度大小是[P,Q][𝑃,𝑄],那么划分后每个GPU上存的chunk大小即为[P/√N,Q/√N][𝑃/𝑁,𝑄/𝑁]。至此,每个GPU都只会保存部分的输入输出以及部分的权重。虽然相比于1D Tensor并行,2D额外增加了模型权重的通信,但是需要注意的是当GPU数量很多的时候,每个GPU上分配的模型权重就会小很多,而且因为使用的All-reduce通信方式,所以2D也还是要比1D更高效的。

2.5D Tensor Parallelism

2.5D Tensor Parallel [3] 是受2.5D矩阵乘法算法 [4] 启发进一步对2D Tensor并行的优化。具体来说2.5D增加了 depth 维度。当 depth=1 时等价于2D;当 depth>1 时,

同样假设有N𝑁个GPU,其中N=S2∗D𝑁=𝑆2∗𝐷,S𝑆类似于原来2D正方形拓扑结构的边长,而D𝐷 则是新增加的维度 depth 。D𝐷可以由用户指定,S𝑆 则会自动计算出来了。所以一般来说至少需要8个GPU才能运行2.5D算法,即S=2,D=2𝑆=2,𝐷=2。

3D Tensor Parallelism

3D Tensor Parallel [5] 是基于3D矩阵乘法算法 [6] 实现的。假设有 N𝑁个 GPU,tensor维度大小为[P,Q,K][𝑃,𝑄,𝐾],那么每个chunk的大小即为 [P/3√N,Q/3√N,K/3√N][𝑃/𝑁3,𝑄/𝑁3,𝐾/𝑁3]。当tensor维度小于3时,以全连接层为例,假设权重维度大小为 [P,Q][𝑃,𝑄] ,那么可以对第一个维度划分两次,即每个chunk的维度大小为 [P/(3√N)2,Q/3√N][𝑃/(𝑁3)2,𝑄/𝑁3] 。3D Tensor并行的通信开销复杂度是 O(N1/3)𝑂(𝑁1/3) ,计算和内存开销都均摊在所有GPU上。

小结

1D Tensor并行每一层的输出是不完整的,所以在传入下一层之前都需要做一次All-gather操作,从而使得每个GPU都有完整的输入,如图7a所示。

2D/2.5D/3D Tensor 并行算法因为在一开始就对输入进行了划分, 所以中间层不需要做通信,只需要在最后做一次通信即可。在扩展到大量设备(如GPU)时,通信开销可以降到很小。这3个改进的Tensor并行算法可以很好地和Pipeline并行方法兼容。

Zero Redundancy Data Parallelism (ZeRO)

训练过程中GPU内存开销主要包含以下几个方面:

  • 模型状态内存(Model State Memory):
    • 梯度
    • 模型参数
    • 优化器状态:当使用像Adam这样的优化器时,优化器的状态会成为GPU内存开销的大头。前面介绍的DP,TP, PP算法并没有考虑这个问题。
  • 激活内存(Activation Memory):在优化了模型状态内存之后,人们发现激活函数也会导致瓶颈。激活函数计算位于前向传播之中,用于支持后向传播。
  • 碎片内存(Fragmented Memory):深度学习模型的低效有时是由于内存碎片所导致的。在模型之中,每个张量的生命周期不同,由于不同张量寿命的变化而会导致一些内存碎片。由于这些碎片的存在,会导致即使有足够的可用内存,也会因为缺少连续内存而使得内存分配失败。ZeRO 根据张量的不同寿命主动管理内存,防止内存碎片。

ZeRO针对模型状态的三部分都做了对应的内存改进方法:

  • ZeRO1:只划分优化器状态(optimizer states, os),即Pos
  • ZeRO2:划分优化器状态和梯度(gradient, g),即Pos+g
  • ZeRO3:划分优化器状态和梯度和模型参数(parameters, p),即Pos+g+p

下图给出了三种方法带来的内存开销收益

不管采用三种方法的哪一种,ZeRO简单理解就是给定N𝑁个设备,然后把一堆data等分到这些设备上,每个设备只存1/N1/𝑁的数据量,并且每次也只负责更新这1/N1/𝑁的数据。

因为对数据做了划分,ZeRO在每一层都需要有通信操作。我们考虑ZeRO在某一层的具体操作:

  • 在forward的时候,会首先使用all-gather让每个设备拥有该层完整的模型权重,然后计算得到输出,最后每个设备会只保留原来的权重,即把all-gather过来的权重扔掉,这样可以节省开销。
  • 在backward的时候,同样会先all-gather该层的所有权重,然后计算梯度,最后也会把梯度进行划分,每个设备上只会存1/N对应的梯度数据。

注意ZeRO对数据划分方式并没有什么具体的要求,可以是随意划分,因为最后反正会用all-gather使得所有设备商都有用完整的数据;当然,也可以使用前面提到的Tensor Parallelism的划分方式,这样一来可以有效降低通信开销,进一步提高效率。

参考链接:https://www.cnblogs.com/marsggbo/p/16871789.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/649568.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基本Java语法和语义 (Reading 2)

(1)Java和C在变量类型命名和使用 基本数据类型 对象类型与引用类型 特殊类型 关键字和修饰符 (2)快照图: IDE调试工具: 许多IDE(如Eclipse、IntelliJ IDEA)提供了调试功能,可以…

智慧水坝:科技变革的里程碑

在曾经的水利工程领域,水坝只是为了水资源的调配和控制,提供一定的安全储备。然而,随着现代科技的不断发展,传统的水坝已经不再是单一的水源控制工程,而是变成了一个充满智慧与创新的生态系统。智慧水坝的概念已经超越…

远大阀门集团携创新产品亮相南京,展现石化行业新风采

2024年5月22日,备受瞩目的第八届中国石油和化工行业采购大会在江苏省南京市盛大开幕。作为石化行业物资采购领域极具影响力的年度盛会,本次大会吸引了众多国内外能源化工企业、化工新材料企业、工程公司以及相关领域的供应商参加。远大阀门集团作为特邀优…

Python筑基之旅专栏(导航)

目录 一、Python筑基之旅专栏博文清单及链接 二、推荐阅读 一、Python筑基之旅专栏博文清单及链接 01、溯源及发展 02、变量和数据类型 03、搭建Python开发环境及库 04、两个重要函数/列表/元组 05、字符串(一) 06、字符串(二) 07、字符串(三) 08、字典 09、集合 10…

看汽车冲压件的工厂,如何做PFMEA分析?

为了确保冲压件的质量稳定,提高生产效率,PFMEA(过程潜在失效模式及影响分析)分析成为了汽车冲压件工厂不可或缺的重要工具。本文将带您走进汽车冲压件工厂,一探PFMEA分析的奥秘与实践。 PFMEA分析,作为一种…

I.MX6ULL的蜂鸣器实验

系列文章目录 I.MX6ULL的蜂鸣器实验 I.MX6ULL的蜂鸣器实验 系列文章目录一、前言二、有源蜂鸣器简介三、硬件原理分析四、程序编写五、编译下载验证5.1编写 Makefile 和链接脚本5.2编译下载 一、前言 在 I.MX6U-ALPHA 开发板上有一个有源蜂鸣器,通过 IO 输出高低电…

git中忽略文件的配置

git中忽略文件的配置 一、在项目根目录下创建.gitignore文件二、配置规则如果在配置之前已经提交过文件了,要删除提交过的,如何修改,参考下面的 一、在项目根目录下创建.gitignore文件 .DS_Store node_modules/ /dist# local env files .env…

设计模式基础——设计原则介绍

1.概述 ​ 对于面向对象软件系统的设计而言,如何同时提高一个软件系统的可维护性、可复用性、可拓展性是面向对象设计需要解决的核心问题之一。面向对象设计原则应运而生,这些原则你会在设计模式中找到它们的影子,也是设计模式的基础。往往判…

电脑由于ntdll.dlI丢失导致exe崩溃有什么解决办法?解决ntdll.dll丢失问题

相信有一些用户正在面临一个叫做“ntdll.dll丢失”的问题,这种情况多半发生在试图运行某个程序时,系统会提示一条错误消息:“程序无法启动,因为计算机中丢失了ntdll.dll”。那么,为何ntdll.dll文件会丢失,又…

全能集成开发平台Team·IDE

三甲医院的床位太难等了。反正也是小手术,老苏周五在附近找了家二甲医院,幸运的是,门诊迅速为我开具了入院证。周六早晨就接受了手术,周日挂了一天水,周一下午就出院了。准备在家先休息两天。 2~4 周之后把支架取出来…

Pytorch深度学习实践笔记9(b站刘二大人)

🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:pytorch深度学习 🎀CSDN主页 发狂的小花 🌄人生秘诀:学习的本质就是极致重复! 《PyTorch深度学习实践》完结合集_哔哩哔哩_bilibi…

YOLOv10:全面的效率-准确性驱动模型设计

YOLOv10:全面的效率-准确性驱动模型设计 提出背景精细拆分解法双重标签分配一致的匹配度量以效率为导向的模型设计 YOLO v10 总结1. 双重标签分配策略2. 一致匹配度量策略 论文:https://arxiv.org/pdf/2405.14458 代码:https://github.com/T…

【源码】java + uniapp交易所源代码/带搭建教程java交易所/完整源代码

java uniapp交易所源代码/带搭建教程java交易所/完整源代码 带简洁教程,未测 java uniapp交易所源代码/带搭建教程java交易所/完整源代码 - 吾爱资源网

数据结构第二篇【关于java线性表(顺序表)的基本操作】

【关于java线性表(顺序表)的基本操作】 线性表是什么?🐵🐒🦍顺序表的定义🦧🐶🐵创建顺序表新增元素,默认在数组最后新增在 pos 位置新增元素判定是否包含某个元素查找某个…

HTTP 与 HTTPS 对比

HTTP:HTTPS:超文本传输协议 超文本传输安全协议加入SSL/TLS协议,依靠证书来验证服务器的身份需要到CA申请证书,需要一定费用TCP 协议 80 端口 TCP 协议 443 端口更耗费服务器资源

zabbix自定义监控项

文章目录 1、配置conf文件(zabbix_agent2)linuxwindows 2、配置监控项3、配置触发器4、查看监控数据 示例自定义程序 hash_tool:输出指定目录的哈希值 调用指令: hash_tool --path [指定目录] 1、配置conf文件(zabbix_agent2) linux vim /etc/zabbix/z…

Pandas03

目录 数据修改 修改列名 修改行索引 修改索引名(重置索引)rename_axis 修改值 修改类型 替换值 数据增加 新增列(固定值) 新增列(计算值) 新增列(比较值) 新增列&#x…

从零自制docker-15-【实现 mydocker run -d 支持后台运行容器】

文章目录 实现目的莫名奇妙的问题对之前upper层出现root补充对run某些命令出现找不到文件或目录的原因代码效果 实现目的 docker run -d时容器在后台运行,而不会进入命令行交互形式 首先是需要添加-d选项然后设置当添加-d选项时候主进程不会等待子进程&#xff0c…

下跌孕线烛台如何交易?昂首平台2步盈利

下跌孕线烛台如何交易?其实很简单,昂首平台2步盈利。发现下跌孕线烛台形态,在上升趋势即将终结时,当第二根烛线完全闭合,并跌破低点时,即可卖出。 将止损设在该模式的最高点上方。 设定止盈于最近的支撑位置…

早餐店燃气安全岂能马虎?探头选择与年检必须到位

在现代都市生活中,早餐店作为人们日常生活中的重要一环,其安全性问题日益受到人们的关注。其中,燃气泄漏引发的火灾和爆炸事故尤为令人担忧。 因此,点式可燃气体报警器在早餐店中的应用显得尤为重要。 在这篇文章中,…