承接 9.1 节的结论:单张 GPU 的算力和显存都是硬天花板。要把训练速度提起来,工程师最先想到的方案往往非常直觉——“一张卡算不完所有数据,那就多张卡一起算,每张卡算一部分。” 这就是数据并行(Data Parallelism, DP)。
它是分布式训练的起点,也是理解后续张量并行、流水线并行和 ZeRO 优化的基准线。本节把它彻底讲透:它到底怎么工作的?什么时候够用?什么时候必须放弃?
一、核心原理:复制模型,切分数据,同步梯度
数据并行的逻辑可以用一句话概括:每张 GPU 都保存一份完整的模型副本,但各自消费不同的数据子集;反向传播后,把所有卡的梯度进行一次全局同步(AllReduce),确保每张卡更新后的权重完全一致。
具体训练步骤如下:
- 数据切分:将全局批次(Global Batch)拆成 N 份,分给 N 张 GPU。每张卡的本地批次叫 Local Batch。
Global Batch Size = Local Batch Size × N
- 独立前向/反向:每张卡用自己的数据前向传播,计算损失;再反向传播,得到本地梯度(Gradient)。此时各卡的梯度是不同的,因为它们见了不同的数据。
- 梯度同步(AllReduce):通过集合通信(Collective Communication,详见 9.7 节),将所有卡的相同参数梯度做全局平均。这是最关键的一步,它保证了“虽然数据不同,但所有卡获得的梯度更新方向一致”。
- 权重更新:每张卡用自己同步后的平均梯度,独立执行优化器(AdamW 等)更新。由于初始权重相同、梯度相同、优化器状态相同,更新后的权重仍然保持完全一致。
工程要点:现代深度学习框架(PyTorch DDP、Megatron-LM 的 DP 模式)普遍采用 Ring-AllReduce 算法实现梯度同步。它把梯度张量拆成多个 Bucket,让 N 张 GPU 组成一个逻辑环,逐块传递并累加梯度,最终每张卡都得到完整平均梯度。整个过程通过 NCCL(NVIDIA Collective Communications Library)在后台执行,且与反向传播计算做 重叠(overlap):算完某一层的梯度就立刻通信,而不是等所有层都算完再一次性同步,从而最大限度隐藏通信延迟。
二、为什么强调 DDP,而不是 DP?
在 PyTorch 等框架中,有两个容易混淆的概念:
- DP(DataParallel):单进程多线程,主卡收拢所有梯度再广播。实现简单,但存在严重的 GIL 锁竞争 和 主卡显存爆掉 的问题,已基本被弃用。
- DDP(DistributedDataParallel):多进程,每卡一个进程,配合 Ring-AllReduce。通信高效、扩展性好,是目前工业界和学术界的唯一事实标准。
后续文中提到的“数据并行”,若无特别说明,均指 DDP。
三、适用场景:数据并行还能打的时候
数据并行最大的优势是工程简单、侵入性低。你不需要改模型结构,不需要切分层,只需要把 DataLoader 的 batch_size 改成 global_batch / N,再套一层 DDP 包装器,代码就能跑起来。
它最适合以下场景:
1. 模型能完整塞进单卡显存
这是硬前提。如果 7B 参数的模型用 FP16/BF16 训练,参数量约 14 GB,加上梯度、Adam 状态(一阶/二阶动量)、激活值,单卡 40 GB 或 80 GB 显存足以容纳。此时多卡数据并行可以直接线性扩展训练吞吐。
2. 需要放大 Global Batch Size 以提升训练效率
大模型预训练普遍采用较大的全局批次(如 4M tokens 甚至更高)。单卡算力喂不满 GPU,或者本地 batch 太小导致矩阵乘法效率低时,通过数据并行把 batch 拆到多张卡上,既能吃满算力,又能通过 LARS/LAMB 或调整学习率策略适应大 batch 训练。
3. 数据量大、需要缩短训练周期
当训练语料达到万亿 Token 级别,即使是 7B 模型也需要数周甚至数月。数据并行是最直接的“人海战术”——加卡就能缩短时间。
4. 与模型并行、ZeRO 混合使用时的基础层
在 3D 并行(9.6 节)中,数据并行通常作为最外层的并行维度。例如,先用张量并行(TP)把模型切成 8 份塞进单机 8 卡,再把这样的 8 卡组复制 4 份组成 32 卡集群做数据并行。此时 DP 负责“复制机组”,TP 负责“拆解模型”。
四、局限性:为什么纯数据并行训练不了 GPT-4?
数据并行虽然直觉优美,但在大模型时代有三个致命瓶颈,直接催生了 9.3–9.5 节的技术:
1. 显存墙:模型副本无法缩小
每张卡都要保存完整的模型参数、梯度和优化器状态。以 FP32 优化器状态 + FP16 参数的混合精度训练为例,一个 70B 模型单卡需要:
- 参数:~140 GB(FP16/BF16)
- 梯度:~140 GB(FP16)
- 优化器状态:~560 GB(FP32 参数副本 + 一阶动量 + 二阶动量)
总计近 840 GB,远超单卡 80 GB 的 H100 显存上限。即使把 70B 模型拆到 8 卡做数据并行,每张卡仍需 840 GB——数据并行不减少单卡显存占用,只是复制更多份。这正是 9.5 节 ZeRO 优化器和 9.3 节张量并行要解决的问题。
2. 通信墙:梯度同步成为瓶颈
数据并行每轮迭代都要同步所有参数的梯度。假设模型 70B 参数,梯度用 FP16 表示,单卡一次迭代需要通信的数据量就是 140 GB。在 PCIe 4.0(32 GB/s 量级)环境下,这一步可能要数秒,完全吃掉计算收益;即使在 NVLink + InfiniBand 的高速互联下,当卡数扩展到千卡级别,AllReduce 的延迟和带宽竞争也会让加速比偏离线性。
3. 扩展效率递减
根据 Amdahl 定律,当并行度(GPU 数量)不断提高,通信占比和参数同步的固定开销占比会越来越大。纯数据并行通常在小规模(单机 8 卡或少数几机)下效率很高(加速比 0.8–0.9),但扩展到百卡、千卡时,若不配合梯度累积、通信压缩或流水线排布,效率会迅速下滑。
4. 大 Batch 训练的副作用(非 DP 独有,但常被触发)
为了填满更多的卡,global batch size 被迫增大。虽然大模型预训练对大 batch 有较好耐受性,但如果调整不当(学习率没按 batch 开方或线性缩放),可能导致收敛不稳定或泛化性能下降。这需要配合 4.4 节的学习率策略谨慎调参。
五、小结与承启
数据并行是分布式训练的“第一性原理”实现:模型不动,数据分片,梯度归一。它在模型尺寸小于单卡显存时,依然是最简单、最稳定、最推荐的加速手段。
但一旦模型参数迈过百亿、千亿门槛,纯数据并行就会撞上显存和通信两堵高墙。此时必须进入下一层更激进的并行策略:
- 如果单卡装不下模型,但模型还能按层或按矩阵维度切开,那就是 9.3 节张量并行(TP) 和 9.4 节流水线并行(PP) 的战场;
- 如果显存浪费在了重复的优化器状态上,那就是 9.5 节 ZeRO 优化器 要解决的显存冗余问题。
理解数据并行的边界,是你选择“加卡”还是“切模型”的第一决策点。