大模型推理中的 Tensor Parallel、Pipeline Parallel 和 Data Parallel 如何选择?
简化版
三种并行切分不同的东西:Tensor Parallel(TP) 把单层的矩阵切到多卡,降低每卡权重和计算,但每层都要高频通信,适合节点内 NVLink;Pipeline Parallel(PP) 按层切分模型,通信量小,但有流水线气泡;Data Parallel(DP) 每卡放完整模型、分担不同请求,模型单卡放得下时扩吞吐最简单。选择顺序:先满足容量(模型放得下吗)→ 再满足延迟(TP 降单请求延迟)→ 最后优化吞吐/成本(DP 加副本)。通常优先节点内 TP,再按需组合 PP、DP。
详细版
- TP:对 Attention 和 MLP 的线性层做列并行/行并行,用 All-Reduce 合并结果。让单个 token 同时用多卡,能降单请求延迟,但通信几乎贯穿每层,依赖 NVLink/NVSwitch,跨慢网络做大 TP 往往得不偿失。
- PP:把连续的层分给不同设备,激活在阶段间传递。通信少,但单请求逐 token Decode 时流水线利用率低(气泡多),需要 microbatch 或多请求填充。
- DP:每卡一个完整模型副本,请求路由到不同副本,副本间不在每个 token 上同步。扩容、路由、故障隔离都简单。
选择时先判断模型权重 + KV Cache 能否单卡容纳,再比较互联带宽、延迟目标、并发和故障域。加 GPU 不保证线性加速——通信、气泡、负载倾斜、切分后单卡算子变小都会降低扩展效率。
完整版教学
一、Tensor Parallel:切一层,通信频繁
TP 在层内部切矩阵。以 Transformer 的两大块为例(Megatron 经典切法):
- MLP:第一个线性层按**输出维(列)切,各卡算一部分中间特征;激活后第二个线性层按输入维(行)**切,最后用 All-Reduce 把各卡结果加起来。
- 注意力:按注意力头分配到各卡,每卡算一部分头,最后拼接。
每层前向/反向都要 All-Reduce 同步 → 通信次数 ∝ 层数
→ 必须靠 NVLink/NVSwitch 这种超高带宽低延迟互联
→ 跨机器(走以太网/IB)做大 TP 会被通信拖死
TP 让单个 token 的计算分摊到多卡,能降低单请求延迟(对延迟敏感场景有用),但代价是通信贯穿每一层。所以 TP 度数一般限制在单节点内(如 8 卡)。
二、Pipeline Parallel:切多层,承担气泡
PP 把不同的 Transformer 层放在不同设备上,前一阶段算完把激活传给下一阶段:
卡1: 层 1~20 → 卡2: 层 21~40 → 卡3: 层 41~60 → 卡4: 层 61~80
它通信少(只在阶段边界传激活,不像 TP 每层 All-Reduce),每卡权重也少。但有个致命问题——流水线气泡(bubble):一个请求在阶段间串行流动,当卡1在算时,卡2/3/4 在空等;排空时反过来。
训练可以用大量 microbatch 填满流水线摊薄气泡;但在线 Decode 每步只生成一个 token、延迟敏感,很难攒够 microbatch,PP 的利用率和调度都更困难。所以推理里 PP 主要用于「模型大到必须跨节点」时的容量手段,而非提速手段。
三、Data Parallel:复制模型,分摊请求
DP 最简单:每卡(或每组卡)放一个完整模型副本,不同请求路由到不同副本独立处理。它不减少单副本的显存、也不降单请求延迟,但:
- 扩容简单:吞吐不够就加副本;
- 路由/故障隔离简单:一个副本挂了不影响其他;
- 是模型单卡/单节点放得下时提高总吞吐的首选。
一个易错点:各副本的 Prefix Cache 和 KV Cache 默认不共享,负载均衡要考虑 token 长度而非只看请求数(把几个长请求都路由到同一副本会打爆它)。
四、组合并行:3D 并行 + Expert Parallel
模型大到单节点放不下时,就组合:
节点内:TP(8 卡,靠 NVLink 扛每层通信)
节点间:PP(把模型分成几段,跨节点接力)
最外层:DP(复制多组上述"模型并行组",扩吞吐)
MoE 模型还有 Expert Parallel:把不同专家分散到不同设备,token 按路由发给对应专家——这带来 All-to-All 通信和专家负载不均的新问题。核心原则:并行拓扑要匹配物理网络拓扑——通信最频繁的 TP 放带宽最高的机内,通信少的 DP 放最外层跨机。
五、如何评估扩展效率
加卡不等于加速,要对比加 GPU 前后:
- TTFT、TPOT、总吞吐(真的变好了吗);
- 每卡显存、通信占比(通信是否吃掉了计算节省);
- 单位 token 成本(更多 GPU 是否只是更贵)。
一个常见陷阱:TP 度数开太大,模型切得太碎,每卡的矩阵变得很小、算子效率低下,加上通信时间超过计算节省,结果更多 GPU 只提高了成本、没提高速度。所以 TP 要适度、优先机内。
六、选型决策树
1. 模型权重 + KV Cache 单卡放得下?
→ 放得下:用 DP 复制副本扩吞吐(最简单)
→ 放不下:先上节点内 TP(降每卡权重、还能降延迟)
2. 单节点 TP 还放不下?
→ 加 PP 跨节点(容量手段,注意气泡)
3. 吞吐不够?
→ 在模型并行组之外再加 DP 副本
顺序:先容量 → 再延迟 → 后吞吐/成本
七、加强记忆
三种并行记「切什么 + 什么代价」:TP 切层内矩阵(每层 All-Reduce、通信频繁、限机内 NVLink、能降单请求延迟)、PP 切层/深度(通信少但有气泡、推理利用率低、主要解决容量)、DP 复制整模型(分摊请求、扩吞吐最简单、不降单请求延迟)。选型顺序钉死:先满足容量(放得下吗)→ 再满足延迟(TP)→ 最后优化吞吐成本(DP)。超大模型用 3D 并行(TP 机内 + PP 跨节点 + DP 最外层),MoE 加 Expert Parallel;核心原则是并行拓扑匹配网络拓扑,且加卡不保证线性加速。