06. 张量并行、流水线并行和数据并行有什么区别?
整理张量并行、流水线并行和数据并行的区别与使用场景。
简单回答
三种并行是分布式训练和推理中把模型分布到多 GPU 上的不同策略。数据并行(DP)是每张 GPU 上放一份完整模型,不同 GPU 处理不同的数据;张量并行(TP)是把模型的单层内部拆分到多张 GPU 上(比如一个矩阵乘法拆成两半分别在两张 GPU 上算);流水线并行(PP)是把模型的不同层分配到不同 GPU 上(前 16 层放 GPU 0,后 16 层放 GPU 1)。三者对通信需求不同,通常组合使用。
详细解释
数据并行(Data Parallelism, DP)
数据并行是最简单也最常用的并行方式。每张 GPU 上放一份完整的模型副本,一个 batch 的数据被拆成 N 份分配给 N 张 GPU,每张 GPU 独立做前向和反向传播,然后同步梯度(All-Reduce),更新参数。
DP 的前提是单张 GPU 能装下完整模型。对于 7B 模型(FP16 约 14GB),单张 A100 80GB 完全够。但对于 70B 或更大的模型,单卡装不下,就需要模型并行(TP 或 PP)。
DP 的通信发生在梯度同步阶段——每次反向传播后需要 All-Reduce 所有参数的梯度。通信量等于模型参数量。可以用梯度压缩、通信计算重叠(overlap)等技巧减少通信开销。
推理场景中,DP 意味着多张 GPU 各自独立服务不同的请求,没有通信开销。这是最简单的推理扩容方式。
张量并行(Tensor Parallelism, TP)
张量并行是把模型的单个层(具体说是矩阵运算)拆分到多张 GPU 上。以一个线性层 为例,如果把 沿列方向切成两半 ,GPU 0 计算 ,GPU 1 计算 ,然后拼接结果。
TP 的通信发生在每一层的计算内部——每层的 Attention 和 FFN 计算完后都需要做一次 All-Reduce 或 All-Gather 来合并结果。这意味着通信非常频繁(每层两次),对 GPU 之间的通信带宽要求极高——通常需要 NVLink(带宽 600GB/s 以上),走 PCIe(64GB/s)性能会大幅下降。
所以 TP 通常用在同一个节点内的 GPU 之间(通过 NVLink 互连),不适合跨节点。TP 的度数(TP degree)通常是 2、4 或 8,对应同一台机器内的 GPU 数量。
Megatron-LM 是 TP 的经典实现,vLLM 也支持 TP 做推理。
流水线并行(Pipeline Parallelism, PP)
流水线并行是把模型的不同层分配到不同 GPU。一个 32 层的模型分到 4 张 GPU,每张负责 8 层。数据像流水线一样依次经过各 GPU。
PP 的通信只发生在相邻 GPU 之间(一个 GPU 的输出是下一个 GPU 的输入),通信量是中间激活值(远小于模型参数量),而且是点对点通信(不是 All-Reduce)。所以 PP 对通信带宽的要求远低于 TP,适合跨节点部署。
PP 的主要问题是"流水线气泡"(Pipeline Bubble)。当第一个 GPU 在处理第一个 micro-batch 时,后面的 GPU 全在等着没事干;当最后一个 GPU 在处理最后一个 micro-batch 时,前面的 GPU 也在等。这些等待时间就是气泡,降低了 GPU 利用率。可以通过增加 micro-batch 数量来减少气泡的比例,但不能完全消除。
推理场景中 PP 的气泡问题更突出(因为没有反向传播来"填充"流水线)。一个请求必须依次经过所有 GPU,每个 GPU 处理完后等下一个 GPU 处理,延迟是所有 GPU 延迟之和。所以推理场景中 PP 主要用于"单张 GPU 放不下模型"的场景,如果能用 TP 就优先用 TP。
三者的组合使用
在训练大模型时,三种并行通常组合使用——Megatron-LM 的 3D 并行。比如在一个 64 GPU 的集群中:TP=8(每台机器 8 卡做张量并行),PP=2(两台机器之间做流水线并行),DP=4(4 组流水线做数据并行)。
推理场景中最常见的组合是 TP(解决单卡放不下的问题)+ DP(扩容吞吐量)。比如 70B 模型用 TP=4 部署在 4 张 A100 上,然后用多组 4 卡来做 DP 扩容。
Expert Parallelism(补充)
MoE 模型还有一种特殊的并行方式——Expert Parallelism(EP)。不同的专家放在不同的 GPU 上,token 根据 Router 的决策被路由到对应的 GPU。EP 需要 All-to-All 通信(每个 GPU 发送 token 到其他 GPU、从其他 GPU 接收 token),通信模式比 TP 和 PP 都复杂。
面试时可以这样答
三种并行的拆分维度不同。数据并行是每张 GPU 放完整模型、处理不同数据。张量并行是把单层内部的矩阵运算拆分到多 GPU。流水线并行是把不同层分配到不同 GPU。
对通信的要求差异很大。TP 每层都要 All-Reduce,通信非常频繁,必须用 NVLink 高带宽互连,通常只在同一台机器内做。PP 只在相邻 GPU 间传中间激活值,通信量小,可以跨节点。DP 训练时同步梯度有通信,推理时完全无通信。
推理场景中最常用的是 TP 加 DP 的组合——用 TP 解决单卡放不下的问题,TP 度数取决于模型大小和 GPU 显存。然后用 DP 做水平扩容增加吞吐。PP 在推理中一般不优先考虑,因为流水线气泡会增加延迟。训练场景才经常用 3D 并行。
常见追问
- TP=2 和 TP=4 的推理性能差异大吗?
- 流水线并行的气泡率怎么计算?怎么减少?
- MoE 模型的 Expert Parallelism 和 TP 怎么配合?