一、分布式训练框架基础:三种并行策略与混合并行设计

大家好,我是你们这堂课的主讲人。今天咱们聊聊分布式训练里最基础、也最绕不开的三个概念:数据并行、模型并行、流水线并行。

说实话,我刚入行那会儿,觉得分布式训练不就是多卡跑跑嘛,有啥难的?结果第一次上手就栽了跟头——模型死活跑不起来,显存爆了,通信卡死,各种问题。后来才明白,选对并行策略,比调超参数重要得多。

好,咱们一个一个来看。

1.1 数据并行:最常用的并行方式

原理:把训练数据切成多份,每张卡拿一份,各自跑完整模型,然后同步梯度。

说白了就是:你有一份数据,我有一份数据,咱们各自算梯度,最后汇总一下,更新模型参数。

我习惯把数据并行比作「多个人抄同一本书」——每个人抄不同的章节,最后拼起来。但这里有个坑:每张卡上存的都是完整的模型副本。如果你的模型有 70B 参数,单卡显存放不下,那数据并行就玩不转了。

适用场景:模型能塞进单卡显存,但训练数据量大、需要加速的场景。

避坑指南:我曾经在一个 8 卡 A100 的集群上跑数据并行,结果发现 8 卡比 4 卡只快了 1.5 倍。为什么?通信开销太大了。你想想看,每张卡算完梯度,都要把梯度广播给所有人。卡越多,通信越重。所以数据并行不是无脑加卡就行的。

1.2 模型并行:把模型拆开放

当模型大到单卡放不下时,就得用模型并行。

原理:把模型的不同层或不同参数分到多张卡上。每张卡只存一部分模型,数据在卡间流转。

举个例子:一个 100 层的 Transformer,卡 0 放 1-25 层,卡 1 放 26-50 层,依此类推。数据从卡 0 进去,一层层算,最后从卡 3 出来。

嗯,这里要注意:模型并行有个天然的问题——串行依赖。卡 1 必须等卡 0 算完才能开始,卡 2 得等卡 1。这就导致 GPU 利用率上不去,很多时间花在等待上。

我个人经验:模型并行适合那些层间依赖强、但单层计算量大的模型。比如 GPT 这种 Transformer 架构,每层计算量够大,通信占比就相对小了。

1.3 流水线并行:解决模型并行的等待问题

流水线并行是模型并行的一种优化。它把数据也切成微批次(micro-batch),让不同卡同时处理不同微批次的不同层。

我打个比方:工厂流水线上,工人 A 拧螺丝,工人 B 装外壳,工人 C 质检。如果一次只处理一个产品,那 B 和 C 大部分时间都在等。但如果把产品排成队,A 拧完一个就给 B,B 边装外壳边接下一个,这样大家都能忙起来。

流水线并行就是这个道理。它把训练数据切成更小的 micro-batch,让各张卡尽量同时工作,减少空闲时间。

并行策略 核心思想 适用场景 主要瓶颈
数据并行 数据分片,模型复制 模型能塞进单卡 通信开销
模型并行 模型分片,数据串行 模型太大放不下 串行等待
流水线并行 模型分片 + 数据微批 大模型 + 高吞吐需求 流水线气泡
注意:流水线并行虽然减少了空闲时间,但会引入「流水线气泡」——就是流水线刚开始和快结束时,部分卡还是得等。我记得有篇论文说,4 卡流水线并行,气泡大概占 15% 的时间。这个在调优时得算进去。

1.4 混合并行策略:把三种策略组合起来

实际生产中,很少只用一种并行策略。大模型训练通常用混合并行。

我参与过一个千亿参数模型的训练,当时的设计思路是这样的:

  • 先用流水线并行把模型切成几段,每段放在一组卡上
  • 每组卡内部用模型并行(张量并行)处理超大层
  • 所有组之间用数据并行同步梯度

说白了就是:流水线并行管层间,模型并行管层内,数据并行管副本。

为什么这么设计?你想想看,如果只用数据并行,模型太大放不下。如果只用模型并行,通信太频繁。如果只用流水线并行,气泡太多。三者结合,各取所长。

下面这张图是我自己画的混合并行架构,你看一眼就明白了:

混合并行策略架构图 流水线并行(Pipeline Parallelism) 模型按层切分:卡组0(1-10层)→ 卡组1(11-20层)→ 卡组2(21-30层) 卡组0:张量并行(卡0-卡3) 卡组1:张量并行(卡4-卡7) 卡组2:张量并行(卡8-卡11) 数据并行(Data Parallelism) 3个流水线副本各自处理不同数据批次,梯度同步更新 副本1:数据批次A 副本2:数据批次B 副本3:数据批次C 设计要点 • 流水线并行:解决模型太大放不下的问题,按层切分 • 张量并行:解决单层太大放不下的问题,按参数切分 • 数据并行:解决训练速度慢的问题,多副本同时跑

你看,这张图里,纵向是流水线并行,横向是数据并行,每个卡组内部还有张量并行。三层嵌套,各司其职。

1.5 如何选择并行策略?

我一般按这个思路来选:

  1. 先看模型能不能塞进单卡。能?用数据并行。不能?往下看。
  2. 再看单层能不能塞进单卡。能?用流水线并行。不能?加张量并行。
  3. 最后看通信带宽够不够。带宽高,多用数据并行;带宽低,多用模型并行。

举个例子:你有个 100B 的模型,单卡显存 80GB。单卡肯定放不下,但单层(比如 attention 层)可能也就几 GB。这时候我建议用流水线并行 + 数据并行。流水线把模型切成 10 段,每段 10B,刚好放得下。然后复制 4 个流水线副本做数据并行,总共 40 张卡。

我个人习惯:先画一张「显存-通信」矩阵图,横轴是显存需求,纵轴是通信开销。哪个策略落在左下角(显存小、通信少),就优先用哪个。

好了,这一章的内容就这些。三种并行策略的原理、适用场景、混合设计思路,我都讲清楚了。下一章咱们聊聊实际部署时怎么配置这些策略,包括 NCCL 通信优化、梯度累积这些实战技巧。

想要更多资料,联系可可