趋近智
当大型语言模型的参数 (parameter)和中间激活量变得太大,以至于单个加速器(如GPU或TPU)的内存无法容纳时,仅靠数据并行是不够的。虽然数据并行在多个设备上复制模型,并在每个设备上处理不同的数据批次,但整个模型仍然必须存在于每个设备上。我们需要将模型本身拆分到不同设备上的策略。这就是模型并行要解决的问题。
模型并行将模型的层或张量划分到多个加速器上。与复制模型不同,模型的不同部分驻留在不同的设备上,这使得集群的整体内存能够容纳比单个设备所能处理的模型大数倍的模型。实现模型并行有两种主要策略:流水线并行和张量并行。
流水线并行涉及将模型的层按顺序划分到多个设备上。可以将其想象成一条装配线:每个设备(或设备组)形成一个“阶段”,负责执行模型层的特定子集。
假设一个具有12层的模型分布在3个GPU上:
输入数据按顺序流经这些阶段。GPU 0处理第一个批次,将其输出(激活)发送到GPU 1,GPU 1处理后再将其输出发送到GPU 2,依此类推。对于反向传播 (backpropagation),梯度则沿相反方向流动。
流水线并行的一个简化视图,显示了跨GPU的顺序处理。
朴素流水线并行的一个重大挑战是“流水线气泡”。当GPU 1等待GPU 0的第一个批次的输出时,以及GPU 2等待GPU 1时,GPU 1和GPU 2最初是空闲的。类似地,当GPU 0处理完其批次的最后部分后,它也会变得空闲,而后续阶段则在完成计算。这种空闲时间表示计算资源的浪费。
为了缓解这个问题,会采用微批处理等技术(由GPipe推广并由PipeDream等系统改进)。主要数据批次被分成更小的微批次。一旦GPU 0完成处理第一个微批次,它就会将激活值发送到GPU 1,并立即开始处理第二个微批次。这使得多个微批次可以在流水线阶段同时“运行”,从而显著减少空闲时间并提升硬件利用率。
时间线显示微批次(MB)流经一个3阶段流水线。请注意,当GPU 1处理微批次1时,GPU 0如何开始处理微批次2,与一次处理整个批次相比,这减少了空闲时间。反向传播(Bwd)紧随前向传播(Fwd)之后。
流水线并行可以有效减少每个GPU的内存占用,因为每个GPU只容纳模型层的一部分。但是,它会在阶段之间引入通信延迟,并且需要仔细的负载均衡以确保各个阶段的计算成本大致相等。
流水线并行是在设备之间拆分层,而张量并行则是在一个层内部(特别是其大型权重 (weight)矩阵)将计算拆分到多个设备上。这对于Transformer模型尤其相关,因为多头注意力 (multi-head attention)层和前馈网络(FFN)层包含大型矩阵乘法。
考虑Transformer层中的大型矩阵乘法 。如果矩阵 (代表模型权重)对单个GPU的内存来说太大了,我们可以将其按列拆分到两个GPU上: 。计算变为:
GPU 0计算 ,使用其部分的权重 ,GPU 1计算 ,使用 。输入 通常会被广播或提供给两个GPU。然后,如果后续操作需要,可以收集结果 和 。
或者,矩阵 可以按行拆分。考虑 。将A按行拆分 。那么:
这在操作可能是 的前馈层中很常见。这里, 可以按列拆分为 ,而 可以按行拆分为 。 GPU 0计算 ,GPU 1计算 。然后,在应用GeLU之前可能需要一次all-gather操作,或者计算可以这样进行: GPU 0计算 GPU 1计算 最后,一次all-reduce操作对结果求和: 。
张量并行将矩阵乘法 拆分到两个GPU上的流程。需要通信(收集/归约)来组合部分结果。
张量并行要求层内计算内部进行大量通信,通常使用集体通信操作,例如all-gather或reduce-scatter。这要求参与的GPU之间具有高带宽互连(例如NVLink)。像NVIDIA的Megatron-LM这样的框架专门设计用于高效地实现Transformer模型的张量并行。
与张量并行有时一同讨论的另一个方面是序列并行。使用张量并行时,激活值通常需要在设备之间进行收集,这对于长序列来说可能是内存密集型的。序列并行提供了沿序列长度维度拆分激活值的策略,将此内存负担分配给张量并行设备。这进一步有助于扩展到更长的上下文 (context)长度。
在实践中,训练大型模型很少只依赖单一并行技术。通常通过组合多种策略来达到最佳性能:
一种混合并行策略,结合了跨节点的数据并行、节点内跨阶段的流水线并行,以及阶段内的张量并行(TP)。
手动实现这些模型并行策略既复杂又容易出错。它需要仔细处理分布式设备之间的数据移动、通信同步和梯度计算。
掌握模型并行涉及理解这些权衡并利用合适的框架来有效分配计算和内存。这是在LLM训练中扩展模型规模的基本操作要求。
这部分内容有帮助吗?
© 2026 ApX Machine LearningAI伦理与透明度•