Loading [MathJax]/jax/input/TeX/jax.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >并行训练算法一锅炖: DDP, TP, PP, ZeRO

并行训练算法一锅炖: DDP, TP, PP, ZeRO

作者头像
marsggbo
发布于 2022-11-30 03:54:59
发布于 2022-11-30 03:54:59
5.1K0
举报

本文主要参考ColossalAI论文 Colossal-AI: A Unified Deep Learning System For Large-Scale Parallel Training ColossalAI框架开源提供了本文介绍的所有并行训练: https://github.com/hpcaitech/ColossalAI

前言

本文会介绍几种流行的并行方法,包括

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

下图给出了这些并行方法的示意图,非常直观好懂。

不过在介绍各种并行训练方法之前,我们首先对一些概念做一个声明,方便后面理解

模型训练过程中涉及到的参数主要包含两大类,model datanon-model data,具体表示如下:

  • model data
    • 模型权重
    • 模型权重的梯度
    • 优化器的状态
  • non-model data
    • 模型逐层的特征向量(也叫作activations)

Data parallelism (DP)

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所示,原本线性层为

Y=W1W2X

,这里将

W1

按列进行划分,将

W2

按行进行划分。这样,每个GPU只需要存一半的权重即可,最后通过All-reduce操作来同步Y的结果。当GPU数量为

N

时,每个GPU只需要存

1N

的权重即可,只不过每层输出需要用All-reduce来补全结果之后才能继续下一层的计算。

对于土豪公司,可以使用NVLink来连接GPU(如图5a),从而提供高带宽来降低通信开销。但是土豪终归是少数的,大部分公司和个人是没法承担这昂贵的硬件费用,因此比较常见的GPU连接方式是图5b,即节点内花点钱实现NVLink连接,节点之间通过PCIe连接。

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=S2D

S

类似于原来2D正方形拓扑结构的边长,而

D

则是新增加的维度 depth

D

可以由用户指定,

S

则会自动计算出来了。所以一般来说至少需要8个GPU才能运行2.5D算法,即

S=2,D=2

3D Tensor Parallelism

3D Tensor Parallel [5] 是基于3D矩阵乘法算法 [6] 实现的。假设有

N

个 GPU,tensor维度大小为

[P,Q,K]

,那么每个chunk的大小即为

[P/3N,Q/3N,K/3N]

。当tensor维度小于3时,以全连接层为例,假设权重维度大小为

[P,Q]

,那么可以对第一个维度划分两次,即每个chunk的维度大小为

[P/(3N)2,Q/3N]

。3D Tensor并行的通信开销复杂度是

O(N1/3)

,计算和内存开销都均摊在所有GPU上。

小结

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

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

Sequential Parallelism

Tensor parallelism主要是为了解决由 model data (模型权重,梯度和优化器状态)导致的内存瓶颈,但是 non-model data也可能成为性能瓶颈。比如像AlphaFold和NAS任务中会存在很多中间特征值(也叫activations)。

以DARTS算法为例,它的模型参数量其实并不多,但是它有很多分支,所以activations会消耗大量GPU内存,这也是为什么很多NAS算法只能在CIFAR-10上搜索到合适的模型结构后,再做人工扩展,最后应用到ImageNet上做性能验证。

同样地,在使用Transformer训练语言模型时,由于Transformer层中的Self-attention机制的复杂度是

O(n2)

,其中

n

是序列长度。换言之,长序列数据将增加中间activation内存使用量,从而限制设备的训练能力。

Sequential Parallelism (SP) [7] 就为了解决non-model data导致的性能瓶颈而提出的。下图给出了SP在Transform并行训练上的应用,具体的原理可以查看原论文。

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/N

的数据量,并且每次也只负责更新这

1/N

的数据。

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

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

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

关于ZeRO更详细的介绍可以查看原论文或者看看这篇博客 [8]

未完待续。。。

微信公众号:AutoML机器学习

MARSGGBO♥原创 如有意合作或学术讨论欢迎私戳联系~ 邮箱:marsggbo@foxmail.com


  1. M. Shoeybi, M. Patwary, R. Puri, P. LeGresley, J. Casper, and B. Catan- zaro, “Megatron-lm: Training multi-billion parameter language models using model parallelism,” arXiv preprint arXiv:1909.08053, 2019. ↩︎
  2. Q. Xu, S. Li, C. Gong, and Y. You, “An efficient 2d method for training super-large deep learning models,” arXiv preprint arXiv:2104.05343, 2021 ↩︎
  3. B. Wang, Q. Xu, Z. Bian, and Y. You, “2.5-dimensional distributed model training,” arXiv preprint arXiv:2105.14500, 2021. ↩︎
  4. E. Solomonik and J. Demmel, “Communication-optimal parallel 2.5d matrix multiplication and lu factorization algorithms,” in Euro-Par, 2011. ↩︎
  5. Z. Bian, Q. Xu, B. Wang, and Y. You, “Maximizing parallelism in distributed training for huge neural networks,” arXiv preprint arXiv:2105.14450, 2021. ↩︎
  6. R. C. Agarwal, S. M. Balle, F. G. Gustavson, M. Joshi, and P. Palkar, “A three-dimensional approach to parallel matrix multiplication,” IBM Journal of Research and Development, vol. 39, no. 5, pp. 575–582, 1995. ↩︎
  7. S. Li, F. Xue, Y. Li, and Y. You, “Sequence parallelism: Long sequence training from system perspective,” 2021. [Online]. Available: https://arxiv.org/abs/2105.13120 ↩︎
  8. https://www.cnblogs.com/rossiXYZ/p/15782054.html ↩︎
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[源码解析] 模型并行分布式训练 Megatron (3) ---模型并行实现
NVIDIA Megatron 是一个基于 PyTorch 的分布式训练框架,用来训练超大Transformer语言模型,其通过综合应用了数据并行,Tensor并行和Pipeline并行来复现 GPT3,值得我们深入分析其背后机理。
罗西的思考
2022/11/28
2.3K0
[源码解析] 模型并行分布式训练 Megatron (3) ---模型并行实现
大模型训练:Megatron-Core中的通信优化
来源丨https://zhuanlan.zhihu.com/p/694877232
BBuf
2024/06/03
1.2K0
大模型训练:Megatron-Core中的通信优化
[源码解析] 模型并行分布式训练Megatron (1) --- 论文 & 基础
NVIDIA Megatron 是一个基于 PyTorch 的分布式训练框架,用来训练超大Transformer语言模型,其通过综合应用了数据并行,Tensor并行和Pipeline并行来复现 GPT3,值得我们深入分析其背后机理。
罗西的思考
2022/05/09
3.4K0
[源码解析] 模型并行分布式训练Megatron (1) --- 论文 & 基础
Megatron-LM 分布式执行调研
Created by: strint Created time: May 31, 2023 6:02 PM
BBuf
2023/08/22
2.2K0
Megatron-LM 分布式执行调研
[源码解析] 模型并行分布式训练Megatron (5) --Pipedream Flush
NVIDIA Megatron 是一个基于 PyTorch 的分布式训练框架,用来训练超大Transformer语言模型,其通过综合应用了数据并行,Tensor并行和Pipeline并行来复现 GPT3,值得我们深入分析其背后机理。本系列有 5 篇文章,通过论文和源码和大家一起学习研究。本文将看看 Megatron 如何给流水线各个阶段安排执行执行序列。
罗西的思考
2022/05/09
1.8K0
[源码解析] 模型并行分布式训练Megatron (5) --Pipedream Flush
以 GPT-175B 为例,聊聊大语言模型分布式训练的最佳实践
导读本文分享主题为大语言模型分布式训练的相关技术及量化分析,并以GPT-175B 为例,介绍相关技术的最佳实践。
NewBeeNLP
2023/12/20
1.8K0
以 GPT-175B 为例,聊聊大语言模型分布式训练的最佳实践
AI智算中心,大模型训练背后的网络流量“奥秘”
前言:自2017年起,AI模型的规模每半年翻一番,从初代Transformer的6500万增长到GPT-4的1.76万亿,预计下一代大语言模型将达到10万亿规模。另一方面,用于模型训练的数据量持续增长,如C4数据集,原始数据量累计超过9.5PB,每月新增200-300TB,目前经过清洗加工后的数据集大小约38.5 TB,训练样本数364.6M。进一步,随着多模态大模型的兴起,训练数据从单一的文本过渡到图像和视频乃至3D点云,数据规模将是文本数据的1万倍以上。
星融元Asterfusion
2024/07/24
6420
AI智算中心,大模型训练背后的网络流量“奥秘”
DeepSeek组网的演进与效率提升
近年来,千亿至万亿参数规模的大语言模型(LLM)训练已成为人工智能领域的核心战场。随着模型复杂度的指数级增长, 并行计算与网络拓扑的协同设计逐渐成为突破算力瓶颈的关键挑战。
星融元Asterfusion
2025/03/24
1730
让训练更长序列模型成为可能-Sequence Parallelism
自注意力机制是Transformer中的一个关键部件,但其占用显存大小和序列长度呈平方关系,导致我们实际并不能用很长的序列(如BERT是固定为512)。在这篇工作里,我们提出了序列并行(Sequence Parallelism),将序列切分成一个个小块,放置在每一个计算设备上。计算注意力需要将Query和全局的Key交互,受启发于Ring-Allreduce算法,我们以类似的方式实现注意力计算,并称为Ring Self Attention。该并行方式能够与现有的数据并行,模型并行,流水线并行一起使用,实现4D并行
BBuf
2021/12/22
7.2K2
让训练更长序列模型成为可能-Sequence Parallelism
Facebook推出数据并行训练算法FSDP:采用更少的GPU,更高效地训练更大数量级的模型
作者 | Facebook工程团队 译者 | 王强 策划 | 刘燕 大规模训练 AI 模型并非易事。 除了需要大量算力和资源外,训练非常大的模型背后也有着相当大的工程复杂性。在 Facebook AI Research(FAIR)Engineering,我们一直在努力构建各种工具和基础设施,让大型 AI 模型训练起来更加轻松。 我们最近的一部分成果包括了 层内模型并行、流水线模型并行、优化器状态 + 梯度分片 和 多专家模型 等领域的工作,旨在提升为任意数量的任务训练高级 AI 模型的效率。 完全分片数据
深度学习与Python
2023/04/01
1.2K0
Facebook推出数据并行训练算法FSDP:采用更少的GPU,更高效地训练更大数量级的模型
【AI系统】完全分片数据并行 FSDP
上一篇文章内容介绍了通用的数据并行和分布式数据并行,主要是对神经网络模型的输入数据 mini-batch 进行分布式处理。并且讨论了同步数据并行和异步数据并行的差异点,深入到 PyTorch AI 框架的弹性数据并行是如何实现与处理的。在本文内容中,将会重点关注 AI 框架中如何实现针对权重数据、优化器数据和梯度数据进行分布式并行,并在 PyTorch 框架的具体实现方案。
用户11307734
2024/12/09
4110
[源码分析] Facebook如何训练超大模型---(1)
我们在前文介绍过,微软 ZeRO 可以对一个万亿参数模型可以使用 8 路模型并行、64 路管道并行和 8 路数据并行在 4,096 个 NVIDIA A100 GPU 上进行扩展。
罗西的思考
2022/05/09
2K0
[源码分析] Facebook如何训练超大模型---(1)
[源码解析] 模型并行分布式训练 Megatron (4) --- 如何设置各种并行
NVIDIA Megatron 是一个基于 PyTorch 的分布式训练框架,用来训练超大Transformer语言模型,其通过综合应用了数据并行,Tensor并行和Pipeline并行来复现 GPT3,值得我们深入分析其背后机理。
罗西的思考
2022/05/09
2.5K0
[源码解析] 模型并行分布式训练 Megatron (4) --- 如何设置各种并行
[论文翻译] 分布式训练 Parameter Sharding 之 Google Weight Sharding
本系列会以5~6篇文章,介绍parameter sharding。Parameter sharding 就是把模型参数等切分到各个GPU之上。我们会以 Google,微软和Facebook的论文,博客以及代码来进行分析。
罗西的思考
2022/05/09
1.1K0
[论文翻译] 分布式训练 Parameter Sharding 之 Google Weight Sharding
大语言模型--流水线并行原理及实现
Google 2019年发表的论文GPipe: Easy Scaling with Micro-Batch Pipeline Parallelism,1811.06965 (arxiv.org)
aaronwjzhao
2024/05/11
1.1K0
【AI系统】混合并行
混合并行(HybridParallel)是一种用于分布式计算的高级策略,它结合了数据并行和模型并行的优势,以更高效地利用计算资源,解决深度学习中的大模型训练问题。混合并行不仅能提高计算效率,还能在有限的硬件资源下处理更大的模型和数据集。在深度学习中,数据并行和模型并行各自有其适用的场景和局限性。数据并行适用于训练样本较多而模型较小的情况,通过将数据集分割成多个子集并在不同的设备上同时训练来提高训练速度。而模型并行则适用于模型较大无法单独放入一个设备内存的情况,通过将模型切分成不同的部分分别在多个设备上进行计算。混合并行通过将这两种并行方式结合,加速计算和处理超大模型,从而在各种硬件条件下实现高效的神经网络模型训练。现主流的混合并行为 3D 混合并行,但由于他们一般都在大规模分布式深度学习训练框架中使用,如:Deepspeed 和 Colossal AI,而不是 AI 框架,因此只进行简单讨论。
用户11307734
2024/12/09
2450
炼丹知识点:模型训练里的Tricks
大规模模型训练其实就是在和计算、存储和通信玩的过程,所以我列一下跟这些相关的文章。
炼丹笔记
2022/05/23
1.5K0
炼丹知识点:模型训练里的Tricks
[源码分析] Facebook如何训练超大模型 --- (2)
我们在前文介绍过,微软 ZeRO 可以对一个万亿参数模型可以使用 8 路模型并行、64 路管道并行和 8 路数据并行在 4,096 个 NVIDIA A100 GPU 上进行扩展。
罗西的思考
2022/05/09
2K0
[源码分析] Facebook如何训练超大模型 --- (2)
AI Infra论文阅读之将流水线并行气泡几乎降到零(附基于Meagtron-LM的ZB-H1开源代码实现解读)
这篇论文对应的链接为:https://openreview.net/pdf?id=tuzTN0eIO5 ,最近被ICLR 2024接收,但不少AI Infra的同行已经发现了这个工作的价值,并且已经开源在 https://github.com/sail-sg/zero-bubble-pipeline-parallelism ,在一些AI Infra相关的地方也存在一些讨论和介绍。比如 https://www.zhihu.com/question/637480969/answer/3354692418
BBuf
2024/02/22
2.5K0
AI Infra论文阅读之将流水线并行气泡几乎降到零(附基于Meagtron-LM的ZB-H1开源代码实现解读)
LLM 学习笔记-Deepspeed-MoE 论文
论文 DeepSpeed-MoE: Advancing Mixture-of-Experts Inference and Training to Power Next-Generation AI Scale
marsggbo
2023/12/08
1.5K0
推荐阅读
相关推荐
[源码解析] 模型并行分布式训练 Megatron (3) ---模型并行实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档