6.1 推理并行策略总览:目标、维度与组合
推理并行与训练并行的目标差异(显存/延迟/吞吐 vs 梯度/收敛)、TP/PP/DP/EP 四种策略的本质与适用场景、以及 TP×PP×DP 的组合逻辑
从这一章开始,话题从”单卡怎么优化”切换到”多卡怎么组织”。触发分布式推理的通常是两个现实问题:模型装不下(70B FP16 要 140GB,单卡装不下)或单卡不够快(吞吐上限、延迟不达标)。但”把模型拆到多卡”有完全不同的拆法——按矩阵切、按层切、按请求切、按专家切——每种切法解决不同的问题,也有不同的通信代价。这一节先建立全局坐标系,后面 6.2-6.6 逐一展开。
📑 目录
- 1. 推理并行 vs 训练并行:目标完全不同
- 2. 四种并行策略的本质
- 3. 适用场景速查:装不下还是不够快
- 4. 组合策略:TP×PP×DP 怎么乘
- 5. 通信代价:并行策略的隐形税
- 6. vLLM 的并行抽象:world size 与并行组
- 📝 总结
- 🎯 自我检验清单
- 📚 参考资料
1. 推理并行 vs 训练并行:目标完全不同
模块三(分布式训练)里你已经见过 TP、PP、DP 这些词,但推理场景下它们的目标和评价标准完全不同。先把这个差异钉死,后面才不会用训练的思路去理解推理的并行选择。
| 维度 | 训练并行 | 推理并行 |
|---|---|---|
| 核心目标 | 梯度同步正确、模型收敛 | 模型能装下、延迟达标、吞吐够用 |
| 关键指标 | 收敛速度、FLOPS 利用率、通信占比 | TTFT / TPOT、吞吐(Tokens/s)、显存分布 |
| 每步同步 | 每步都要 AllReduce 梯度(强同步) | 前向内部通信(TP),或几乎无同步(DP) |
| 数据流 | 前向 + 反向 + 梯度同步,通信量翻倍 | 只有前向,通信量减半 |
| 批量特性 | 固定 batch,追求吞吐 | 动态 batch(Continuous Batching),延迟敏感 |
| 失败容忍 | 训练可以断点续跑 | 服务不能中断(高可用) |
📌 关键点:训练里”通信占比高”是吞吐问题;推理里”通信占比高”直接变成延迟问题——TPOT 每增加几毫秒都在消耗用户的耐心。所以推理场景对通信的敏感度更高,也更容易得出”TP 别太大”的结论。
一个更根本的差异:推理的并行策略服务于”单请求延迟”和”系统吞吐”两个指标,而这两个指标有时互相冲突(第 5.4 节投机解码已经见过这种冲突)——并行策略的选择,本质是在这条延迟-吞吐曲线上选点。
2. 四种并行策略的本质
先给一张总览表,后面每节展开细节:
| 策略 | 拆什么 | 通信模式 | 解决什么问题 | 一句话本质 |
|---|---|---|---|---|
| TP(张量并行) | 单个权重矩阵 | 每层前向 2 次 AllReduce(NVLink 内) | 单卡装不下 / 单请求延迟 | 把一个算子的计算拆到多卡 |
| PP(流水线并行) | 模型层(按深度切段) | 层间激活传递(每 micro-batch 1 次,节点间网络) | 跨节点装下超大型号 | 把计算流水线按深度分段 |
| DP(数据并行) | 请求/数据(模型复制) | 几乎无通信(仅负载均衡) | 单卡吞吐不够 | 复制引擎,横向扩吞吐 |
| EP(专家并行) | MoE 的 Expert 参数 | All-to-All(每 token 路由) | MoE 超大模型装不下 | 按”知识”拆,token 找专家 |
💡 提示:记忆锚点——TP 拆算子、PP 拆层、DP 拆请求、EP 拆专家。拆的对象不同,通信发生的频率和位置就不同:TP 每层都通信(最频繁)、PP 每段边界通信(较稀疏)、DP 基本不通信、EP 在路由时通信(按需)。
2.1 为什么推理中 TP 是第一选择
推理场景(尤其 vLLM)里 TP 是最常用的策略,原因有三个:
- 单请求延迟最优:TP 把单个请求的前向拆到多卡并行,TTFT/TPOT 随卡数下降(通信开销抵消一部分),是唯一能”让一个请求变快”的策略
- 显存分摊均匀:权重按矩阵切开,每卡只存 1/TP 的权重,显存压力线性下降
- NVLink 内通信便宜:TP 的 AllReduce 走 NVLink(单节点内 900GB/s 级),通信延迟可控
而 DP 复制模型不降低单请求延迟(一个请求还是只在一张卡上跑),PP 则因为流水线填充(bubble)反而让单请求延迟上升。“哪个策略能让单个请求更快”——只有 TP。
2.2 推理中 DP 的含义与训练不同
训练里 DP 是”每卡一份模型 + 梯度 AllReduce”;推理里没有梯度,DP 退化为”多份独立模型副本,请求按负载均衡分发”——vLLM 里就是多副本引擎(或者 MoE 场景下的 attention 复制)。所以推理 DP 的通信开销几乎为零,代价是每份副本都要一份完整的权重显存。
2.3 EP 是 MoE 时代的特殊策略
MoE 模型(Mixtral、DeepSeek-V3、Qwen3-MoE)里,Attention 层是稠密的(所有 token 都要),Expert 层是稀疏的(每个 token 只路由到 2-3 个专家)。EP 把不同 Expert 放到不同卡上,token 通过 All-to-All 通信”上门”找专家。它和 TP 的关键区别:TP 是”数据不动、权重切”(权重在卡间切分,token 全量广播),EP 是”权重不动、数据上门”(专家完整放单卡,token 被路由过来)。
📌 关键点:EP 的动机和 TP 一样是”装不下”,但方式相反。TP 切矩阵需要层内 AllReduce(通信量与 hidden size 成正比),EP 路由 token 需要 All-to-All(通信量与 token 数成正比)。模型越大、hidden size 越大,EP 相对 TP 越有优势——这就是为什么 DeepSeek-V3 这类超大 MoE 都用 EP。
3. 适用场景速查:装不下还是不够快
选型先回答两个问题:
Q1:模型单卡装得下吗?
- 装得下 → 不需要任何并行(除非吞吐不够)
- 装不下,但单节点多卡能装下 → TP
- 单节点也装不下 → TP(节点内)+ PP(节点间)
Q2:单卡吞吐够吗?
- 不够 → DP(多副本横向扩展)或 EP(MoE 场景)
官方文档给出的决策流程(vLLM parallelism scaling):
模型能放单卡吗?
├─ 能 → 不分布式(分布式大概率是浪费)
└─ 不能 → 单节点多卡能放下吗?
├─ 能 → 张量并行(tensor_parallel_size = 节点内 GPU 数)
└─ 不能 → TP + PP 组合(TP = 每节点 GPU 数,PP = 节点数)
边缘情况(官方文档专门指出):
- GPU 数不能整除模型:用 PP 支持不均匀切分(如 TP=1, PP=GPU 数)
- 节点内没有 NVLink(如 L40S 等 PCIe 互联的卡):优先 PP 而非 TP——TP 的 AllReduce 在 PCIe 上太贵,PP 的层间通信量小得多
💡 提示:最后一条经常被忽视——TP 好不好用,取决于节点内互联带宽。A100/H100 节点(NVLink)TP=8 很常见;L40S(PCIe Gen5 仅 64GB/s 级)TP>2 就得不偿失。买卡的时候就要想好并行策略。
4. 组合策略:TP×PP×DP 怎么乘
并行维度可以同时叠加,vLLM 中三者相乘得到总 GPU 数:
以 16 卡为例,几种典型配置:
| 配置 | 含义 | 典型用途 |
|---|---|---|
| TP=8, PP=2, DP=1 | 8 卡张量并行一组,两组流水线串起来 | 2 节点 × 8 卡跑超大模型(TP 吃满 NVLink,PP 跨节点) |
| TP=4, PP=1, DP=4 | 4 卡一组张量并行,4 组互为数据并行 | 4 节点 × 4 卡,横向扩吞吐 |
| TP=2, DP=8 | 2 卡 TP,8 组 DP(MoE 场景) | EP 自动 = TP×DP = 16,见 6.4 |
组合的原则(也是官方推荐的默认思路):
- TP 优先给单节点内的卡:TP 通信最频繁,必须待在 NVLink 内
- PP 用于跨节点:PP 通信稀疏(每段边界一次),可以忍受节点间网络(IB/RoCE)
- DP 放最外层:DP 之间几乎无通信,跨节点完全没问题
📌 关键点:官方文档给的黄金组合是 TP = 每节点 GPU 数、PP = 节点数(例如 2 节点 × 8 GPU → TP=8, PP=2)。它把”通信最热的维度”锁在节点内、把”通信最冷的维度”放在节点间——这是分布式推理最实用的配置直觉,比死记任何公式都管用。
4.1 MoE 场景的特殊组合
MoE 模型(见 6.4)的组合逻辑不同:EP 取代 TP 处理 Expert 层,EP_SIZE = TP × DP。比如 TP=2, DP=4(8 卡):
- Attention 层:按 TP=2 切分(4 个 DP 组内各自张量并行)
- Expert 层:按 EP=8 切分(全部 8 卡组成一个专家并行组)
这就是 vLLM --enable-expert-parallel 的自动行为——EP 开启后,Expert 层和 Attention 层走不同的并行策略。
5. 通信代价:并行策略的隐形税
每种并行都有通信税,选型时先算通信账:
| 策略 | 通信原语 | 频率 | 通信量量级 | 对互联的要求 |
|---|---|---|---|---|
| TP | AllReduce | 每层 2 次 | NVLink(节点内) | |
| PP | P2P 激活传输 | 每 micro-batch 1 次 | 节点间网络可接受 | |
| DP | 几乎为零 | 仅路由/负载均衡 | 无要求 | |
| EP | All-to-All | 每层 1 次 | 节点间网络可接受(DeepEP 优化) |
💡 提示:一个直观的通信量对比——TP 的 AllReduce 每层都要做,PP 的 P2P 每段边界才做一次。Transformer 层数动辄几十上百,所以 TP 对带宽的渴求远大于 PP。这也是”TP 不跨节点、PP 才跨节点”的根本原因:跨节点带宽(25-400Gb/s)只有 NVLink 的几十分之一,只配得上稀疏的通信。
6. vLLM 的并行抽象:world size 与并行组
落到 vLLM,需要理解两个基础概念,后面 6.5/6.6 会反复用到:
6.1 World Size:一个模型副本占用多少进程
vLLM 中每个**模型副本(replica)**的进程数:
- TP=1, PP=1 → world size 1(单进程)
- TP=8, PP=2 → world size 16(16 个进程组成一个副本)
- DP 不增加 world size——DP 是”多份副本”,每份副本的 world size 仍是 TP×PP,副本之间通过负载均衡分发请求
6.2 并行组(Parallel Group)的层级
vLLM(沿袭 Megatron-LM 的约定)按维度组织通信组:
TP 组:同一层的卡之间(AllReduce 频繁,必须 NVLink)
PP 组:不同层段的卡之间(P2P 稀疏,可跨节点)
DP 组:副本之间(基本无通信)
进程的 rank 按”TP 最内层、PP 中间、DP 最外层”排列(对应 4.1 的组合原则)。这也是 vLLM 启动日志里 rank 0 / rank 1 划分的依据——排查通信问题时,先分清一个报错发生在哪个组内。
📌 关键点:vLLM 中
--tensor-parallel-size、--pipeline-parallel-size、--data-parallel-size三个参数直接对应三种并行组。改变任何一维,进程的 rank 编号和通信拓扑都变——所以”加一张卡”不是简单改一个数字,而是重新规划整个拓扑(6.6 实战会验证)。
📝 总结
- 推理并行的目标与训练不同:显存装载、延迟、吞吐,而非梯度同步与收敛
- 四种策略的本质:TP 拆算子(每层 AllReduce)、PP 拆层(段间 P2P)、DP 拆请求(多副本)、EP 拆专家(All-to-All)
- TP 是唯一降低单请求延迟的策略,也是推理的第一选择
- 选型两步:装不下 → TP(节点内)/ TP+PP(跨节点);不够快 → DP / EP
- 黄金组合:TP = 每节点 GPU 数,PP = 节点数;DP 放最外层
- MoE 特殊:EP_SIZE = TP × DP,Expert 层与 Attention 层走不同并行
- 通信税:TP 最热(每层)、PP 次之(每段)、DP 为零、EP 按需——互联带宽决定策略选择
🎯 自我检验清单
- 训练和推理场景下,DP 的含义有什么不同?
- 为什么 TP 是唯一能让单请求变快的策略?PP 和 DP 为什么不能?
- 你的模型单卡装不下,第一反应应该试哪种并行?为什么?
- 为什么说”TP 不跨节点”?用通信频率和互联带宽解释
- GPU 总数与 TP×PP×DP 的关系?world size 又是什么?
- 无 NVLink 的节点(如 L40S)为什么优先 PP?
📚 参考资料
- vLLM 官方文档:Parallelism and Scaling(https://docs.vllm.ai/en/latest/serving/parallelism_scaling/)
- vLLM 官方文档:Data Parallel Deployment(https://docs.vllm.ai/en/latest/serving/data_parallel_deployment/)
- vLLM 官方文档:Expert Parallel Deployment(https://docs.vllm.ai/en/latest/serving/expert_parallel_deployment/)
- Shoeybi et al., Megatron-LM: Training Multi-Billion Parameter Language Models Using Model Parallelism(https://arxiv.org/abs/1909.08053)