一句话定义:分布式训练(Distributed Training)是把一次模型训练拆成很多份,交给多张加速卡(GPU/TPU)同时计算,再靠高速网络不停“对账”,让单卡装不下、单卡训不完的模型变得可行。
为什么非拆不可
一张卡在训练时要装四样东西:模型参数、梯度、优化器状态(optimizer state,比如 Adam 的一阶、二阶动量),以及前向传播留下的中间激活值(activation)。参数量一大,光“参数 + 梯度 + 优化器状态”就是参数本身的好几倍,单卡显存立刻见底。就算勉强装下,按单卡速度可能要训几十年。于是拆分不是为了更快,而是为了“能跑起来”。
四种常见的拆法
打个比方:盖一栋超级大楼。
- 数据并行(Data Parallelism):每个施工队都拿一份完整图纸,各盖一批不同的楼层,收工后开会把经验汇总(梯度 all-reduce 求平均)。省时间不省图纸,每张卡仍要放一份完整模型。
- 张量并行(Tensor Parallelism):一道工序几个人一起做,比如一面墙各砌一半。切的是矩阵乘法内部,做一半就得递手,所以通信最频繁,一般只放在同一台机器内、走最快的互联。
- 流水线并行(Pipeline Parallelism):不同楼层分给不同工位,像流水线依次推进。开头和结尾会有等待空档(业内叫“气泡”,bubble),靠把一批数据再切成更小的微批次(micro-batch)来填。
- 专家并行(AI 词典:Expert Parallelism">Expert Parallelism):面向混合专家模型(MoE),不同“专家”子网络放在不同卡上,数据按需路由过去。
实际的大模型训练通常是几种叠加:机器内张量并行 + 跨机流水线并行 + 最外层数据并行。近年流行的分片式数据并行(如 ZeRO、FSDP 一类做法)更进一步,把优化器状态、梯度甚至参数本身也切开放到各卡上,缓解“每张卡都要存一份完整模型”的浪费。
| 方式 | 切的是什么 | 通信频率 | 典型位置 |
|---|---|---|---|
| 数据并行 | 训练数据 | 每步一次梯度汇总 | 跨机、规模最大 |
| 张量并行 | 单层内的矩阵 | 每层都要通信 | 机内高速互联 |
| 流水线并行 | 按层分段 | 段间传激活值 | 跨机 |
| 专家并行 | 不同专家子网 | 按路由动态 | 跨机 |
和相邻概念的区别
分布式训练不等于“多卡推理”,后者是把已经训好的模型铺开做服务;也不等于联邦学习(Federated Learning),联邦学习是数据留在各方本地、只交换模型更新,而分布式训练是数据集中、算力分散。它和传统高性能计算(HPC)的并行同源,都靠集合通信(collective communication,如 all-reduce、all-gather)协调,只是这里的瓶颈常常是通信而非计算。
对实际工作意味着什么
对从业者来说,选并行方案就是在“显存、算力、通信”三者间做权衡:切得越细,通信越多,扩展效率(scaling efficiency)越会随卡数上升而下降。几个实务要点:全局批大小(global batch size)变大后学习率通常要跟着调,常用的只是经验规则、需要实验验证;上千张卡连跑数周,单卡故障是常态而非意外,所以检查点(checkpoint)与自动容错重启是必备工程;衡量训练效率常看 MFU(Model FLOPs Utilization)。若采用 DeepSpeed、Megatron-LM、PyTorch FSDP 等具体框架,配置细节与支持范围请以官方文档为准。
一句话收尾:分布式训练的本质,是把“一个人的活”变成“一群人的协作”,而协作成本,就是你要付出的通信代价。
