LLM三大并行方式

为什么要进行并行训练:

模型越来越大,单张显卡张不下

三种并行方式

数据并行,流水线并行,张量并行

数据并行(DP)

原理:

假设我们有 4 张显卡。我们把完整的模型复制 4 份,分别放在 4 张卡上。 然后,如果我们的一批数据(Batch Size)是 32,我们就把它切成 4 份,每张卡领 8 条数据。

总结:其实就是将数据进行了切分,多个模型共同处理大批数据

流程:

1、 每张卡独立进行前向传播(Forward)和反向传播(Backward)。

2、 计算出各自的梯度。

3、关键步骤 所有显卡之间进行通信,把大家的梯度加起来取平均,所有卡使用相同的平均梯度更新参数,保证模型权重始终一致,保证大家的模型更新方向是一致的。

总结:每张卡独立前向反向传播,但是在更新梯度时,需要把所有模型的梯度进行相加求和取平均,每张卡的模型使用平均梯度进行更新,保持一致。

局限性与进阶

  • 局限:它假设单张显卡的显存能装下整个模型。对于 70B+ 的大模型,单卡直接 OOM (Out Of Memory)。
  • 进阶技术 (ZeRO):DeepSpeed 的 ZeRO 系列(零冗余优化器)是对 DP 的改进。它不仅切分数据,还将优化器状态 (Optimizer States)、梯度 (Gradients) 甚至参数 (Parameters) 切分到不同卡上,从而大幅降低单卡显存占用。

流水线并行(PP,我感觉我更想叫管道并行,也就是模型切分)

原理:

LLM 本质是 Transformer Layer 的深层堆叠(例如 GPT-3 有 96 层)。

  • 纵向切分:将模型的层切开。例如,GPU 0 负责第 1-8 层,GPU 1 负责第 9-16 层,以此类推。

流程

数据像流水线上的产品一样流动:

  1. GPU 0 接收 Input,计算前几层,得到中间结果 (Activations)。
  2. GPU 0 将结果发送给 GPU 1。
  3. GPU 1 继续计算... 直到最后一个 GPU 输出 Loss。
  4. 反向传播时,梯度按相反方向回传

这就像工厂流水线:

  • GPU 0 是做“初级特征提取”的工人。
  • GPU 1 是做“中级语义理解”的工人。
  • GPU 2 是做“分类头/生成”的工人、

痛点

最朴素的 PP 效率很低。当 GPU 0 在工作时,下游的 GPU 都在空闲等待。

解决方案:1F1B (One Forward One Backward) 策略。将一个大 Batch 切成很多微批次,让前后向计算交错进行,尽量填满空闲时间。

1F1B具体解决原理及流程请见

张量并行

原理:

这是最“硬核”的切分方式。LLM 的计算核心是矩阵乘法 Y=X·W

  • 横向/纵向切分:不切分层数,而是把每一层内部巨大的权重矩阵 W撕开。
  • Transformer 特性:例如 Multi-Head Attention 有 32 个头,可以让 GPU 0 算前 16 个头,GPU 1 算后 16 个头。

工作流程:

  1. 输入 X 复制到两张卡上。
  2. GPU 0 计算 X·Wpart1,GPU 1 计算 X·Wpart2。
  3. All-Reduce (高频通信):每一层计算结束,必须立刻通信,将两部分结果拼起来(或相加),才能进入下一层的计算。

局限性:

通信量巨大! 因为每一层 Layer 都要通信,所以 TP 通常仅限于同一台机器内部(通过 NVLink 连接)使用,跨机器使用 TP 会导致通信瓶颈,严重拖慢速度。

总结:张量并行意味着把模型权重分别放在不同的GPU上,这也就是意味着把模型撕开了,不是按层分开放,而是把层给撕了,也就是两张卡拼起来才是模型的一个层,这更加友好于矩阵,因为可以拆开嘛

具体详情请看

https://blog.youkuaiyun.com/L1uminous/article/details/155913237?fromshare=blogdetail&sharetype=blogdetail&sharerId=155913237&sharerefer=PC&sharesource=L1uminous&sharefrom=from_link

3D并行

在实际的千亿参数模型 (如 Llama-3-70B, GPT-4) 训练中,我们通常混合使用这三种策略:

  1. 单机内部:使用 TP (利用 NVLink 高带宽)。
  2. 机器之间:使用 PP (利用网线/Infiniband,减少通信量)。
  3. 整体扩展:在上述基础上复制多组,使用 DP (增加吞吐量)。

我自己画了一张图方便理解,如果又画的不对的地方,请大家批评指正。

具体详情看

https://blog.youkuaiyun.com/L1uminous/article/details/155913261?fromshare=blogdetail&sharetype=blogdetail&sharerId=155913261&sharerefer=PC&sharesource=L1uminous&sharefrom=from_link

### 实现LLM多GPU并行计算的关键技术 在规模语言模型(LLM)的训练过程中,为了充分利用硬件资源并加速训练过程,通常会采用多GPU并行计算的方式。以下是实现这一目标的核心技术和方法: #### 1. **PyTorch Lightning框架的基础** PyTorch Lightning 是一种简化深度学习开发的高级封装工具,它提供了强的功能来支持分布式训练。通过其模块化的结构设计,开发者可以轻松构建复杂的分布式训练环境[^1]。 - `LightningModule` 提供了一个统一接口用于定义模型及其优化器逻辑,并内置了对多种分布式策略的支持。 - `Trainer` 类负责协调整个训练流程,包括自动检测可用设备以及设置相应的分布模式。 #### 2. **单机多GPU的数据并行机制** 对于单节点上的多个 GPU 来说,“数据并行”是最常见的做法之一。在这种方式下,每张显卡都会保留一份完整的网络权重副本;输入样本会被分割成若干份分别送入不同的设备上独立完成前向传播与反向梯度更新操作后再汇总结果得到最终损失函数值的变化情况从而同步全局参数状态达到共同进步的目的。 ```python from pytorch_lightning import Trainer, seed_everything import torch.nn as nn import torch.optim as optim class MyModel(pl.LightningModule): def __init__(self): super().__init__() self.model = nn.Sequential( nn.Linear(100, 50), nn.ReLU(), nn.Linear(50, 1) ) def forward(self, x): return self.model(x) def training_step(self, batch, batch_idx): x, y = batch pred = self(x) loss = nn.MSELoss()(pred, y) return {'loss': loss} trainer = Trainer(gpus=4, strategy="dp") # 使用DP(DataParallel)方式进行四卡训练 model = MyModel() trainer.fit(model) ``` 上述代码展示了如何利用 PyTorch Lightning 的 DataParallel (简称 DP) 方法来进行简单的多 GPU 训练配置。 #### 3. **跨机器扩展——多机多GPU并行** 当单一服务器内的所有 GPU 资源仍不足以满足需求时,则需考虑跨越物理边界至其他计算机继续增加算力规模。此时可借助诸如 NCCL 或 MPI 这样的高效消息传递库促进节点间通讯效率最化的同时保持较低延迟水平以便于快速交换中间产物信息进而维持整体收敛速度不受影响太多。 另外,在实际部署之前还需要仔细规划好集群拓扑关系图以确保最佳互联路径选取正确无误并且能够有效减少不必要的带宽消耗现象发生几率最小化可能存在的瓶颈效应问题出现概率降至最低限度范围内合理范围之内即可接受程度之上才可行得通顺流畅运行下去直至结束为止才行哦! #### 4. **模型并行化策略** 除了传统的数据层面划分之外,针对超型神经网络还可以采取更加精细粒度级别的切分手段即所谓的“模型并行”。这主要包括但不限于以下几种形式: - 层级并行(Layer Parallelism): 将不同层分配到各自专属处理器上去单独执行相应运算任务而不与其他部分共享任何东西; - 管道并行(Pipeline Parallelism): 把整个序列分解成为数个小阶段然后依次串接起来形成流水线作业形态最后再组合回原样输出预期成果出来展示给用户观看欣赏就好啦😊; - 参数并行(Parameter Partitioning): 对特别庞的权重组件实施分区存储管理措施使得每个子集仅占用有限空间位置而不会造成溢出风险事件的发生频率过高以至于难以控制局面发展态势走向失控边缘区域附近徘徊不定的状态持续较长时间段落期间无法恢复正常秩序恢复平稳运作状况良好表现优异成绩突出显著效果明显可见一斑也值得肯定赞扬一番呢👏🎉! 这些先进的算法设计理念极地推动了现代人工智能领域向前迈进了一步距离拉近了许多许多倍不止于此而已哟😎💪! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值