# 7.1 数据并行：为什么简单复制就能加速

数据并行（Data Parallelism）是分布式训练中最基本也最常用的策略。它的思路直观且有效：**在多张 GPU 上各放一份完整的模型副本，每张卡处理不同的数据子集，然后同步梯度。**

## 7.1.1 基本原理

数据并行的工作流程如下：

1. 将训练数据划分为 $$K$$ 份（$$K$$ 为 GPU 数量）
2. 每张 GPU 持有一份完整的模型副本
3. 每张 GPU 用分到的数据子集独立计算前向传播和反向传播
4. 所有 GPU 同步梯度（通常取平均）
5. 每张 GPU 用同步后的梯度更新自己的模型参数

如果每张 GPU 保持相同的本地批次大小，那么同步后的平均梯度等价于**在更大全局批次上计算的梯度**。但数据并行的本质不是“必须增大批次”，而是沿 batch 维度并行计算并同步梯度：也可以通过减小每卡 batch 或调整梯度累积，在保持全局批次不变的前提下做 strong scaling，加快单个训练步。

## 7.1.2 为什么简单复制就能工作

数据并行能够正确地加速训练，根本原因在于**随机梯度下降的数学性质**：

梯度的期望不依赖于它是在一个大批次上计算的，还是在多个小批次上分别计算后取平均。数学上：

$$\frac{1}{K}\sum\_{k=1}^{K} \nabla\_\theta \mathcal{L}(B\_k) \approx \nabla\_\theta \mathcal{L}(B\_1 \cup B\_2 \cup \dots \cup B\_K)$$

这保证了多 GPU 梯度同步与单个大批次训练在数学上可以对齐，但工程等价还依赖 loss 的求和/平均口径、梯度平均或求和语义、学习率规则、梯度裁剪、随机数和 dropout 等细节。

## 7.1.3 通信开销与优化

数据并行的主要瓶颈是**梯度同步的通信开销**。每个训练步都需要在 $$K$$ 张 GPU 之间交换所有参数的梯度。

**AllReduce** 是最常用的梯度同步算法。高效的 AllReduce 实现（如 Ring AllReduce）将**每张 GPU 的通信量**从朴素实现的 $$O(K \cdot M)$$ 降低到 $$O(M)$$（$$M$$ 为模型参数量，与 GPU 数量 $$K$$ 无关），使数据并行能够扩展到数百甚至数千张 GPU。

PyTorch 的 **DistributedDataParallel**（DDP）是工程实践中最常用的数据并行实现，它还通过**梯度桶化**（将多个参数的梯度打包通信）和**计算-通信重叠**（在计算后续层梯度的同时通信前面层的梯度）进一步优化了效率。

## 7.1.4 数据并行的局限

数据并行要求每张 GPU 能容纳一份完整的模型——**包括参数、梯度和优化器状态**。对于 70B 参数的模型（如 Llama 2-70B），仅模型参数就需要约 140 GB（FP16）。若按常见混合精度 Adam 训练状态估算，需要 FP16 参数、FP16 梯度、FP32 master weights，以及 FP32 Adam 一阶/二阶矩，约 16 bytes/param；70B 参数约为 1.12 TB——远超单卡显存。

这个显存限制正是 ZeRO 优化和模型并行技术诞生的直接动因。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://yeasy.gitbook.io/llm_internals/di-er-bu-fen-xun-lian-pian/07_distributed_training/7.1_data_parallel.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
