这张图描述的是分布式计算中经典的 3D 并行策略。为了让你更直观地理解,我将逻辑重新梳理为基础架构、水平扩展(拆数据) 和垂直扩展(拆模型) 三个层级:
1. 基础单卡模式 (Base Case)
- 配置:
- 状态:模型和数据都完整地承载于单张 GPU(gpu0)。
- 痛点:当模型参数量达到千亿级时,单张显卡的显存(VRAM)无法容纳完整的模型权重。
2. 水平扩展:数据并行 (Data Parallelism, DP)
核心逻辑:模型不动,拆分数据。
-
配置:
-
工作方式:
- 冗余存储:每张显卡都拥有一个完整的模型副本。
- 分工:将一批数据(Batch)平分成 4 份,每张卡处理一份。
-
应用场景:模型权重可容纳于单卡显存,但面对海量训练数据,需通过多卡并行以提升计算吞吐量,缩短迭代周期。
-
同步机制:各计算节点在反向传播阶段产生本地梯度后,通过 All-Reduce 算法(如 Ring All-Reduce)与邻居节点进行通信。该过程将全网梯度进行求和并重新分发,确保所有 GPU 在更新权重前获得完全一致的平均梯度,从而维持各副本模型参数的同步。
3. 垂直扩展:模型并行 (Model Parallelism)
当模型太大,单卡装不下时,就需要将模型“拆散”到不同显卡上。图中展示了两种切分维度:
A. 流水线并行 (Pipeline Parallelism, PP)
核心逻辑:纵向切分,按“层”拆分。
-
配置:
-
工作方式:
- 将模型的不同层(Layers)分布在不同 GPU 上。
- 串行执行:数据先在 gpu0 执行前几层,结果传给 gpu1 执行中间层,以此类推。
-
前向传播:GPU 0 计算完它的层(如 Layer 1-8),将输出的激活值通过
send发送给 GPU 1 的recv。此时 GPU 1 必须等待 GPU 0 的数据到达才能开始计算。 -
反向传播:GPU 1 计算完梯度,再反向
send给 GPU 0。 -
核心挑战(Bubble) : 为了保证同步,下游节点必须等待上游。这会产生“流水线气泡(Bubble)”。现代框架(如 GPipe 或 Megatron-LM)通过将数据切成更小的 Micro-batches(微批次)来让多张卡同时工作,减少等待时间。
B. 张量并行 (Tensor Parallelism, TP)
核心逻辑:横向切分,按“矩阵算子”拆分。 张量并行是在“算子内部”动刀,因此同步极其频繁,通常发生在每一个 Transformer 层内部。
-
配置:
-
工作方式:
- 在同一个网络层内部进行切分。例如一个 的矩阵乘法,被拆成四个 的小块。
- 并行计算:4 张显卡同时计算这一层的不同部分,然后通过高速互联(如 NVLink)进行同步。
- 在进入下一层之前,两张卡必须立即交换彼此的结果并相加(All-Reduce),合成最终的 。
-
核心挑战硬件要求:
由于每一层都要进行两次全网同步,通信频率极高。如果卡间带宽(如 NVLink 或 HCCS)不够快,TP 会导致计算单元大幅度空转。
总结:如何选择并行方案?
| 维度 | 策略名称 | 拆的是什么? | 解决什么问题? |
|---|---|---|---|
| 数据维度 | DP (Data Parallelism) | 训练样本 | 嫌计算太慢(增加吞吐量) |
| 模型深度 | PP (Pipeline Parallelism) | 模型的层 (Layers) | 显存放不下(模型太长) |
| 模型宽度 | TP (Tensor Parallelism) | 矩阵内部 (Tensors) | 显存放不下(单层太宽) |
在实际的大模型训练中(如 GPT-4 或 Llama 3),通常会将这三种模式结合使用,称为 3D 并行。