0. 概览
数据并行(Data Parallelism):在不同的GPU上运行同一批数据的不同子集;
流水并行(Pipeline Parallelism):在不同的GPU上运行模型的不同层;
模型并行(Tensor Parallelism):包含张量并行,将单个数学运算(如矩阵乘法)拆分到不同的GPU上运行;
1. 数据并行
数据并行(Data Parallelism)是将相同的模型副本放在多个设备上,并将训练数据划分为不同的批次,每个设备处理一部分数据。每个设备独立地计算前向传播和反向传播,然后在每一轮迭代结束时,设备之间同步梯度并更新模型参数。
-
DP(Data Parallelism):最早的数据并行模式,一般采用参数服务器(Parameters Server)这一编程框架,实际中多用于单机多卡
-
DDP(Distributed Data Parallelism):分布式数据并行,采用 Ring AllReduce 的通讯方式,实际中多用于多机场景
基本思想是将训练数据集拆分到多个 GPU 上,每个 GPU 都维护模型的完整副本。在每次训练迭代期间:
-
数据集被分成小批次,每个批次分配给不同的 GPU。每个 GPU 使用其自己的复制模型独立计算其指定批次的梯度。
-
汇总所有 GPU 的梯度,聚合梯度用于更新所有 GPU 上的模型参数。
这种方法允许训练随 GPU 数量线性扩展,因为每个 GPU 可以并行处理不同的数据批次。主要优点是,它允许您有效利用多个 GPU 的总内存和计算能力来训练比单个 GPU 更大的模型。
下面我们看下数据并行如何更新模型状态、参数。
1.1 同步与异步更新
1.1.1 同步更新
同步更新方法中,所有 GPU 的梯度都会被汇总,每次迭代后,模型参数都会在所有 GPU 上同时更新,由于更新是同时应用的,因此模型状态在所有 GPU 上都是同步的,可确保模型状态在所有 GPU 上保持一致。
问题:如果 GPU 之间的通信速度较慢,则可能会限制训练吞吐量。
1.1.2 异步更新
异步更新方法中,每个 GPU 都会独立更新其本地模型副本,而无需等待其他 GPU。参数更新会与其他 GPU 异步共享,这可以提高训练吞吐量,但也会导致 GPU 之间的模型状态不一致,可能会影响收敛。
问题: 如果将梯度更新发送到所有其他节点或中央服务器并立即应用,那么就会出现扩展问题。随着 GPU 数量的增加,参数服务器将不可避免地遇到瓶颈。如果没有参数服务器,网络拥塞也会成为问题。即使使用了许多 GPU,我们训练模型的速度也会比预期的要慢。
1.1.3 异步更新的挑战
选择同步更新还是异步更新通常需要在训练吞吐量和模型收敛之间进行权衡。同步更新通常可实现更稳定的训练,而异步更新速度更快,但可能需要更仔细地调整超参数。
异步更新的关键问题是 GPU 之间模型状态可能不一致。当每个 GPU 独立更新其本地模型副本而不等待其他 GPU 时,可能会导致以下问题:
-
过时:一个 GPU 所做的参数更新可能无法及时传播到其他 GPU。这可能导致某些 GPU 使用与最新更新不同步的“过时”模型参数进行训练。
-
发散:每个 GPU 上的独立更新可能会导致模型参数发散,从而导致副本之间的内部状态不一致。这可能会对模型收敛到稳定解决方案的能力产生负面影响。
-
瓶颈:正如您所指出的,如果没有中央参数服务器,则需要通过分布式网络传达参数更新,这可能会导致拥塞并成为性能瓶颈,尤其是在 GPU 数量增加的情况下。
但是,AllReduce 可以有效地处理这个问题。其中,Ring-AllReduce 是一种称为的去中心化异步算法 AllReduce,Ring-AllReduce 以有向单向环的形式组织节点。
1.2 AllReduce工作原理
AllReduce 是一种常用的分布式计算中的通信模式,尤其在并行计算和深度学习训练中非常关键。它是一个集体通信操作,意味着所有的参与进程都会执行相同的操作,并且每个进程最终都会得到相同的结果。AllReduce 的主要目的是将所有参与节点的数据聚合起来,并将聚合后的结果广播回所有的节点。
AllReduce 的基本步骤:
-
Reduce(归约):在这个阶段,每个参与节点贡献一部分数据(通常是某个局部计算的结果)。这些数据会被收集起来,并通过某种归约运算(比如求和、取平均、最大值、最小值等)合并成一个全局结果。
-
Broadcast(广播):在完成归约之后,所有参与节点都会接收到这个全局结果,从而确保每个节点都拥有相同的最终数据。
下面 AllReduce 工作图:
上图算法存在冗余通信
上图算法 GPU_1 随着 GPU 数量的增加而遭遇瓶颈。
1.3 Ring-AllReduce工作原理
尽管 AllReduce 算法存在障碍,但 Ring-AllReduce 为这些挑战提供了一个优雅的解决方案。其主要优点 Ring-AllReduce 是:
-
高效通信:Ring-AllReduce 以环形拓扑结构组织 GPU,允许高效地聚合梯度,每个 GPU 仅需与环中的直接邻居进行通信。
-
去中心化:基于环的通信模式 Ring-AllReduce 消除了对集中式参数服务器的需求。这避免了参数服务器架构可能出现的瓶颈。
-
同步:此类 AllReduce 操作可确保参数更新在所有 GPU 上同步,从而保持一致的模型状态并避免完全异步更新可能出现的分歧问题。
通过使用 Ring-AllReduce,分布式训练系统可以实现异步更新的优势(更快的吞吐量),同时减轻潜在的缺点(不一致的模型状态和发散)。提供的同步 Ring-AllReduce 有助于稳定训练过程并提高收敛性,即使在异步参数更新的情况下也是如此。
Ring-AllReduce 有两个步骤,Scatter-Reduce 和 AllGather。
1.3.1 Scatter-Reduce
我们假设有 4 个 GPU,每个 GPU 都有相同的模型副本,该模型由 4 个神经元组成。完成梯度计算后,每个模型都有自己的梯度。比如模型的 GPU_1 梯度为 A1、B1、C1、D1:
所有 GPU 都会将其梯度的一个元素发送到下一个 GPU。
1.3.2 AllGather
完成后 Scatter-Reduce,每个 GPU 都有分布在所有 GPU 中的梯度元素的总和。如上所示,GPU_1 有来自所有 GPU 的第二个元素的总和。
AllGather 让所有 GPU 都具有相同的梯度聚合。因此,第一个 GPU 将其元素总和发送到第二个 GPU。最后,所有 GPU 都具有相同的梯度。
1.4 数据并行总结
数据并行是分布式训练的核心技术,其中数据集被分成多个 GPU,每个 GPU 都有模型的完整副本,跨 GPU 更新模型状态主要有两种方法:
-
同步更新:在所有 GPU 上聚合梯度并同时更新模型参数
-
异步更新:每个 GPU 独立更新其本地模型,异步共享更新。
异步更新可以提高训练吞吐量,但由于 GPU 之间的模型状态不一致,可能会导致陈旧、发散和瓶颈等问题。
Ring-AllReduce 是一种去中心化异步算法,通过以环形拓扑组织 GPU 来提供有效的解决方案。这允许相邻 GPU 之间进行高效通信,消除对中央参数服务器的需求,并同步参数更新以保持一致的模型状态
Ring-AllReduce 有两个主要步骤。Scatter-Reduce 通过在相邻 GPU 之间传递元素来聚合梯度,AllGather 在所有 GPU 之间共享聚合梯度。
2. 流水并行
流水线并行(Pipeline Parallelism)是一种在分布式计算环境中实现模型并行的技术,主要用于深度学习领域,特别是在处理大规模神经网络模型时。通过将模型的不同部分(如神经网络的层)分配到不同的计算节点上,流水线并行能够在不牺牲训练效率的情况下,利用集群中的多台机器共同完成模型训练。
2.1 简单流水并行
我们将模型拆分成多个部分,并将每个部分分配给一个 GPU。然后,我们在小批量上进行常规训练,在拆分模型的边界处插入通信步骤。
我们以 4 层顺序模型为例:
我们将计算划分到两个 GPU 上,如下所示:
-
GPU1 计算:
-
GPU2 计算:
前向传递,itermediate
在 GPU1 上进行计算并将结果张量传输到 GPU2。然后,GPU2 计算模型的输出并开始反向传递。
反向传递,intermediate
GPU2 的梯度发送到 GPU1。然后,GPU1 根据发送的梯度完成反向传递。
流水线并行卵石图
在上图中,我们可以观察到一些简单模型并行的低效率。
-
GPU 利用率低:在任何给定时间,只有一个 GPU 处于繁忙状态,而另一个 GPU 处于空闲状态。低利用率表明可以通过将有用的工作分配给当前处于空闲状态的 GPU 来加快训练速度。
-
通信和计算不交错:当我们通过网络发送中间输出 (FWD) 和梯度 (BWD) 时,没有 GPU 执行任何操作。
-
高内存需求:GPU1 一直到最后都需要缓存整个批次的激活状态。如果批量很大,这可能会产生内存问题。
下面介绍 GPipe 算法,与简单流水并行算法相比,该算法的 GPU 利用率要高得多。
2.2 GPipe算法
2.2.1 Gpipe原理
GPipe 通过将每个 minibatch 分割成更小、大小相等的 microbatches 来提高效率。我们可以为每个 microbatches 独立计算前向和反向传递。如果我们将每个 microbatches 的梯度相加,我们就会得到整个批次的梯度。该过程称为_梯度积累_。
由于每一层只存在于一个 GPU 上,因此 microbatches 梯度的累加可以在本地执行,无需任何通信。
让我们考虑一个跨 4 个 GPU 划分的模型。对于简单的管道并行性,最终的调度将如下所示:
Timestep | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
GPU3 | ||||||||
FWD | BWD | |||||||
GPU2 | ||||||||
FWD | ||||||||
BWD | ||||||||
GPU1 | ||||||||
FWD | ||||||||
BWD | ||||||||
GPU0 | FWD | |||||||
BWD |
在任何给定时间点,只有一个 GPU 处于繁忙状态。此外,每个时间步骤都会花费相当长的时间,因为 GPU 必须为整个小批量运行前向传递。
使用 GPipe,我们现在将 minibatch 分成多个 microbatches,假设有 4 个。
Timestep | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
GPU3 | ||||||||||||||
F1 | F2 | F3 | F4 | B4 | B3 | B2 | B1 | |||||||
GPU2 | ||||||||||||||
F1 | F2 | F3 | F4 | |||||||||||
B4 | B3 | B2 | B1 | |||||||||||
GPU1 | ||||||||||||||
F1 | F2 | F3 | F4 | |||||||||||
B4 | B3 | B2 | B1 | |||||||||||
GPU0 | F1 | F2 | F3 | F4 | ||||||||||
B4 | B3 | B2 | B1 |
这里的 F1
意思是使用当前 GPU 上存储的层分区执行 microbatches 1 的前向传递。
由于模型各个层之间的依赖关系,流水线中还是存在没有进行任何有用工作的点,称为气泡,图中圈出来的部分。
GPipe 气泡
浪费在气泡上的时间比例取决于管道深度 n 和 microbatches 数量 m,其实就是计算图中气泡的面积占整体的比例:
因此,增加 m,即 microbatches 数量可以降低气泡的占比。
2.2.2 GPipe 空间复杂度
增加批量大小会线性增加缓存激活的内存需求,在 GPipe 论文中,作者利用 gradient checkpointing 来降低内存需求。在 gradient checkpointing 中,我们不会缓存计算梯度所需的所有激活,而是在反向传递过程中动态重新计算激活,这降低了内存需求但增加了计算成本。
假设所有层的大小大致相同,如果不执行 gradient checkpointing ,则缓存激活的空间复杂度为:
相反,执行 gradient checkpointing 只缓存层边界上的输入(即缓存从前一个 GPU 发送给我们的张量),这可以降低每个GPU的显存峰值需求,空间复杂度:
GPipe gradient checkpointing
2.3 PipeDream算法
PipeDream 在最终管道阶段完成相应的前向传递后立即开始 microbatches 的反向传递。我们可以在执行相应的反向传递后立即丢弃第 m 个 microbatches 的缓存激活。使用 PipeDream,此反向传递比在 GPipe 中发生得更早,从而减少了内存需求。
下面是 PipeDream 时间表的图,有 4 个 GPU 和 8 个 microbatches。蓝色框表示前向传递,以其 microbatches ID 进行编号,而反向传递则为绿色。
PipeDream 时间表
对于 GPipe 和 PipeDream,缓存激活的空间复杂度可以形式化为(无 gradient checkpointing):
就气泡比例而言,PipeDream 和 GPipe 之间没有区别,由于 PipeDream 释放显存的时间更早,因此会降低对显存的需求。
2.4 流水线总结
流水线并行特别适用于那些层与层之间可以清晰划分的模型,例如由多个 Transformer 层组成的语言模型。这种方法已经被成功应用于训练大规模的预训练模型,如 BERT、GPT 系列等。
优点
-
内存优化:通过将模型分割成多个阶段并在不同的设备上处理,可以显著降低单个设备的内存需求,使得能够训练更大的模型。
-
计算效率:利用多个设备并行处理不同阶段的任务,可以大大提高计算效率。
-
扩展性:理论上可以无限扩展,只要设备足够,就能处理更大的模型。
缺点
-
通信开销:不同阶段之间的数据交换需要额外的通信开销,这可能会成为性能瓶颈。
-
负载均衡:如果各个阶段的计算复杂度不一致,可能会导致某些设备空闲而其他设备忙于计算,造成负载不平衡。
-
同步问题:需要精确控制各个阶段的同步,以确保数据正确传递,这增加了实现难度。
3. 模型并行
模型并行(Model Parallelism)是一种将深度学习模型的不同部分分布到多个计算设备(如GPU)上的技术,以提高训练和推理的效率。模型并行特别适合于大型模型,因为这些模型的参数可能超出单个设备的内存容量。
3.1 张量并行
张量并行(Tensor Parallelism)最初在 Megatron-LM 论文中提出的,它是一种训练大规模 Transformer 模型的有效模型并行技术。张量并行是一种模型并行,其中特定模型权重、梯度和优化器状态在设备之间进行分割。
在张量并行中,每个 GPU 仅处理张量的一部分,并且仅为需要整个张量的操作聚合整个张量。
3.1.1 列划分
将 A 矩阵垂直化为 n 列,则 X 与 A 的矩阵的乘法可以转换为:
3.1.2 行划分
对 A 矩阵水平划分为 n 行,则矩阵 X 则需要垂直划分为 n 列,则 X 与 A 的矩阵的乘法可以转换为:
利用这一原理,我们可以更新任意深度的 MLP,而无需 GPU 之间进行任何同步:
并行化多头注意力层因为它们具有多个独立的头,本质上已经是并行的!
图中表示 Transformer 模型的 MLP 和 Self-Attention 层上 Tensor Parallel 样式的分片,其中 Self-Attention/MLP 中的矩阵乘法通过分片计算进行。
3.2 模型并行总结
应用场景
-
超大规模模型:当模型的参数量非常大(例如,数十亿参数)时,单个设备无法承载,模型并行能够帮助解决这个问题。
-
复杂模型结构:某些模型的结构可能使得模型并行成为一种合理的选择,例如分层的卷积神经网络(CNN)或变压器(Transformer)模型。
优点
-
能够处理超大规模模型。
-
提高计算资源的利用率。
缺点
-
增加了实现的复杂性。
-
可能导致较高的通信延迟,影响性能。
模型并行是一种重要的技术,特别是在处理复杂和大型深度学习模型时。通过合理地划分模型并优化设备之间的通信,可以显著提高训练和推理的效率。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。