Skip to content

分布式推理(TP/PP)

本页速览 当 LLM 跑不进单卡显存,需要把模型切分到多卡——张量并行按 head 切、流水线并行按层切、专家并行按 MoE 路由切。本文拆解三大切分策略、通信代价、主流实现与跨节点部署。

分布式推理(TP/PP)

一、概念定义:单卡放不下时的"切分艺术"

分布式推理指把一个完整模型切分到多张 GPU 上协同推理,原因是单卡显存放不下。Llama-3-70B FP16 需 ~140 GB 显存,单张 A100 80GB 装不下;GPT-4 级别模型推断需上千张 GPU。这种"超出单卡"的场景必须切分。

理解切分的本质:把模型在某个维度上"切开",每张卡只持有部分权重 / KV cache,但对外要表现得像一个模型。三种切法:

模型(按层堆叠 + 每层有 attention / FFN)

   ├── 切法 1:按层切  → 流水线并行 (Pipeline Parallel, PP)
   │     Layer 0-15 在 GPU 0
   │     Layer 16-31 在 GPU 1
   │     ...

   ├── 切法 2:按权重矩阵切  → 张量并行 (Tensor Parallel, TP)
   │     每个 attention head 切到不同 GPU
   │     每个 GEMM 按行 / 列切

   └── 切法 3:按 MoE 专家切  → 专家并行 (Expert Parallel, EP)
         Expert 0-3 在 GPU 0
         Expert 4-7 在 GPU 1
切分切的对象通信时机通信原语难度
TP权重矩阵每层 attention / FFN 后AllReduce
PPmicro-batch 之间P2P Send/Recv
EP专家token 路由时All-to-All极高
SP序列attention 时AllGather / AllReduce

下面逐一拆解,详见 GPU 优化原理模型服务化批处理与调度

二、张量并行(TP)

核心思想:把权重矩阵按维度切

TP 是 Megatron-LM(NVIDIA 2019)提出的,思想是把权重矩阵切成 N 份,N 张卡各持一份

Attention 的切法(按 head 切)

Llama-3-8B 有 32 个 attention head,4 卡 TP 时每卡 8 head:

原始:    Q,K,V  [seq_len, 32 * d_head]


              注意力计算(一次 forward)


              输出 [seq_len, d_model]

TP=4 切: GPU 0 持 head 0-7
         GPU 1 持 head 8-15
         GPU 2 持 head 16-23
         GPU 3 持 head 24-31

         每卡独立做注意力(互不通信!)


         输出 [seq_len, d_model/N]   ← 每卡只有 1/N 输出

         AllReduce ← 把 4 份加起来 → 完整 [seq_len, d_model]

关键:attention head 之间独立,TP 切 head 完全不增加计算,只在每层结束 AllReduce。

FFN 的切法(按矩阵切)

FFN 是两层 GEMM:y = W2 * activation(W1 * x)。TP 切法:

W1 按行切:W1 = [W1_0; W1_1; W1_2; W1_3]      ← 输出维度切
W2 按列切:W2 = [W2_0 | W2_1 | W2_2 | W2_3]   ← 输入维度切

每卡 i 持有 W1_i, W2_i:
   h_i = activation(W1_i @ x)        ← 输入 x 各卡相同,输出 h_i 维度是 1/N
   y_i = W2_i @ h_i                  ← 输出 y_i 维度是 d_model

   y = sum_i(y_i)                     ← AllReduce

TP 在 attention + FFN 上每层做一次 AllReduce,因此 TP 度数越大 → 通信开销线性增长。经验:TP ≤ 单机 GPU 数(用 NVLink 互联),跨机走 PP 或 EP。

TP 在 vLLM / TRT-LLM 中

bash
# vLLM 启动 Llama-3-70B TP=2
python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Meta-Llama-3-70B-Instruct \
    --tensor-parallel-size 2

# TRT-LLM build 时切
trtllm-build ... --tp_size 2

TP 上限通常 8

单机 8 卡(如 DGX A100/H100)用 NVLink + NVSwitch 互联,AllReduce 延迟极低(~1 μs)。超过 8 卡就要跨机走 InfiniBand,AllReduce 延迟升到几十 μs,TP 收益骤减。跨机场景应该用 PP 或 EP

三、流水线并行(PP)

核心思想:按层切,micro-batch 流水

PP 把模型按层切成 N 段,每段在一张卡:

GPU 0: Layer 0-15  →  GPU 1: Layer 16-31  →  GPU 2: Layer 32-47  →  GPU 3: Layer 48-63

数据流:  micro-batch_1 → GPU 0 → GPU 1 → GPU 2 → GPU 3 → 输出_1
          micro-batch_2 → GPU 0 → GPU 1 → GPU 2 → GPU 3 → 输出_2

通信少(只在段间 P2P Send/Recv),但有 bubble——某时刻只有一段在干活:

时间:    0  1  2  3  4  5  6  7  8  9
GPU 0:   B1 .  .  B2 .  .  B3 .  .  .
GPU 1:   .  B1 .  .  B2 .  .  B3 .  .
GPU 2:   .  .  B1 .  .  B2 .  .  B3 .
GPU 3:   .  .  .  B1 .  .  B2 .  .  B3
                  ↑              ↑
                  bubble          bubble

1F1B 调度:减少 bubble

1F1B (One Forward One Backward) 调度把 forward 与 backward 交错(推理用类似思想做 micro-batch 流水),让 bubble 占比从 ~50% 降到 ~1/N。

1F1B 调度(4 stage, 4 micro-batch):
时间:    0  1  2  3  4  5  6  7
GPU 0:   F1 F2 F3 F4 .. .. .. ..
GPU 1:   .. F1 F2 F3 F4 .. .. ..
GPU 2:   .. .. F1 F2 F3 F4 .. ..
GPU 3:   .. .. .. F1 F2 F3 F4 ..
bubble   占比 ~1/N(N=micro-batch 数)

PP 在推理场景不如训练流行——推理只有 forward,bubble 更难消除。LLM 推理 PP 通常用于"超 70B 的超大模型 + 跨机部署",配合 TP 形成混合并行:

2D 并行:TP × PP
   TP=4(机内)+ PP=2(跨机)= 8 卡

GPU 0 (TP rank 0, PP stage 0)  ── GPU 4 (TP rank 0, PP stage 1)
GPU 1 (TP rank 1, PP stage 0)  ── GPU 5 (TP rank 1, PP stage 1)
GPU 2 (TP rank 2, PP stage 0)  ── GPU 6 (TP rank 2, PP stage 1)
GPU 3 (TP rank 3, PP stage 0)  ── GPU 7 (TP rank 3, PP stage 1)
       机 A 内 NVLink                   机 B 内 NVLink
                ↕ InfiniBand 互联

四、专家并行(EP):MoE 模型专用

MoE(Mixture of Experts)模型如 Mixtral-8x22B、DeepSeek-V3 有 N 个专家,每个 token 路由到 2–8 个专家。EP 把专家分布到多卡

Mixtral-8x7B(8 专家)+ 4 卡 EP:
   GPU 0: Expert 0, 1
   GPU 1: Expert 2, 3
   GPU 2: Expert 4, 5
   GPU 3: Expert 6, 7

每个 token 路由 → All-to-All 通信 → token 发往对应 GPU 的专家 → 计算后回收

EP 的通信是 All-to-All(每张卡都要给其他卡发 token),通信量大于 TP 的 AllReduce。详见 核心论文前沿进展

DeepSeek-V3 的 MTP + EP + TP 混合并行是当前 MoE 推理的最佳实践:

DeepSeek-V3 推理架构(671B 总参,37B 激活):
   TP=8(机内,attention 部分)
   EP=64(跨机,专家部分)
   总 GPU 数 = 8 × 64 = 512 卡

五、序列并行(SP)

SP 用于长上下文场景(128K+ token),把一个序列在序列维度上切到多卡,每卡只算一段。

  • DeepSpeed Ulysses:把 head 维度切,attention 时 All-to-All 重组
  • Ring Attention:环形通信,KV 块轮转

SP 主要用于长上下文 LLM 训练,推理场景应用较少——长上下文推理更常用 chunked prefill(vLLM)或 RingAttention 的推理变种。

六、通信代价:硬件互联决定一切

分布式推理的"瓶颈"几乎总是通信:

互联单向延迟单向带宽适用
NVLink 4(H100)~1 μs900 GB/s单机 TP,最优
NVLink 3(A100)~1.5 μs600 GB/s单机 TP
NVLink NVSwitch~1 μs900 GB/s单机全连接 TP
PCIe Gen5~5 μs64 GB/s单机 TP 受限,跨 GPU 通信差
InfiniBand HDR~0.5 μs200 Gb/s (25 GB/s)跨机 PP / EP
InfiniBand NDR~0.5 μs400 Gb/s (50 GB/s)跨机 PP / EP,新集群
RoCE v2~1 μs100-400 Gb/s跨机替代方案

永远不要跨机做 TP

NVLink 的带宽是 InfiniBand 的 10–35 倍,TP 的 AllReduce 在 InfiniBand 上会被通信完全卡死。TP 严格机内、PP/EP 跨机是分布式推理的铁律。

七、主流实现

框架TPPPEP备注
vLLM✅ (v0.6+)✅ (v0.7+)生产首选,最广支持
TensorRT-LLMNVIDIA H100 上极致
DeepSpeed-MII微软系,ZeRO-Inference 支持超显存
SGLang复杂应用强
TGIHF 官方,TP only
Megatron-LM训练为主,可推理
RayLLM / vLLM on Ray---多节点调度层

vLLM 多卡部署示例

bash
# 单机 4 卡 TP
python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Meta-Llama-3-70B-Instruct \
    --tensor-parallel-size 4

# 跨机 PP(vLLM 0.6+)
# 节点 0:
python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Meta-Llama-3-70B-Instruct \
    --pipeline-parallel-size 2 \
    --tensor-parallel-size 4 \
    --node-rank 0 \
    --nnodes 2

# 节点 1:
python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Meta-Llama-3-70B-Instruct \
    --pipeline-parallel-size 2 \
    --tensor-parallel-size 4 \
    --node-rank 1 \
    --nnodes 2

DeepSpeed-MII:超显存推理

DeepSpeed-MII 的 ZeRO-Inference 能把超出单机显存的模型跑起来——把权重切到 CPU + NVMe,按需加载到 GPU。代价是延迟高,但能跑:

python
import mii
mii.serve(
    "meta-llama/Meta-Llama-3-70B",
    deployment_name="llama3-70b",
    tensor_parallel=4,
    enable_zero=True,                # 启用 ZeRO-Inference
    max_concurrent_tokens=64,
)

八、性能数据:基线参考

下面给一组 A100 80GB 上 Llama-3-70B 的分布式推理基线(详见 基准测试):

部署精度并发吞吐(tokens/s)首 token 延迟
单卡 80GB FP16--OOM-
单卡 80GB INT4 AWQ16050 ms
单卡 80GB INT4 AWQ32120075 ms
2 卡 TP=2 FP16110030 ms
2 卡 TP=2 FP1632220035 ms
4 卡 TP=4 FP1632400030 ms
4 卡 TP=4 FP16128700040 ms
8 卡 TP=8 FP16128850030 ms
2 机 8 卡 TP=8 PP=2 FP16128650060 ms← 跨机 PP 损失

可以看到:

  • TP=4 时吞吐 4000 tokens/s,加并发到 128 → 7000,接近 NVLink 通信上限;
  • 跨机 PP=2 时吞吐降到 6500,比单机 8 卡 TP=8 少 ~25%——这是 PP bubble 与跨机通信的代价。

九、局限与边界

  1. TP 上限 8(单机):跨机 TP 通信卡死,必须 PP 或 EP。
  2. PP bubble 难消除:推理场景 bubble 比训练更难消除(推理只有 forward),需要大并发才能填满流水线。
  3. EP 复杂度高:All-to-All 通信 + 负载均衡难,专家分布不均会导致部分 GPU 空闲。
  4. 调度复杂:跨机协调、failure recovery、scale-up/down 比 单机推理 复杂数倍。
  5. 成本:8 卡 H100 节点价格 ~30 万美元,128 卡集群 ~500 万美元——只有少数业务能 justify。
  6. 小请求收益小:batch=1 的单用户场景,分布式推理几乎不快——通信开销抵消切分收益。分布式推理的甜区在大并发生产 serving
  7. 超显存兜底:当显存真的不够时,可以用 ZeRO-Inference 把权重放到 CPU/NVMe,但延迟会到秒级——只适合"偶尔跑长上下文"的场景,不适合实时交互。

十、决策树:什么时候用什么

模型大小 ≤ 单卡显存?
   ├─ 是 → 单卡([vLLM](/case-studies/vllm) / [TensorRT-LLM](/case-studies/tensorrt-llm) / [llama.cpp](/case-studies/llama-cpp))
   └─ 否 → 需要切分

            ├─ 模型 ≤ 单机 8 卡显存?
            │   ├─ 是 → TP 单机(vLLM --tensor-parallel-size 2/4/8)
            │   └─ 否 → 跨机

            ├─ 是 MoE 模型?
            │   ├─ 是 → EP + TP 混合
            │   └─ 否 → TP=8 机内 + PP 跨机

            ├─ 是长上下文(128K+)?
            │   └─ 考虑 SP(Ring Attention / DeepSpeed Ulysses)

            └─ 实在显存不够 → ZeRO-Inference(CPU offload,延迟换显存)

十一、可继续追踪

参考资料