外观
分布式推理(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 | 中 |
| PP | 层 | micro-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) ← AllReduceTP 在 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 2TP 上限通常 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 bubble1F1B 调度:减少 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 μs | 900 GB/s | 单机 TP,最优 |
| NVLink 3(A100) | ~1.5 μs | 600 GB/s | 单机 TP |
| NVLink NVSwitch | ~1 μs | 900 GB/s | 单机全连接 TP |
| PCIe Gen5 | ~5 μs | 64 GB/s | 单机 TP 受限,跨 GPU 通信差 |
| InfiniBand HDR | ~0.5 μs | 200 Gb/s (25 GB/s) | 跨机 PP / EP |
| InfiniBand NDR | ~0.5 μs | 400 Gb/s (50 GB/s) | 跨机 PP / EP,新集群 |
| RoCE v2 | ~1 μs | 100-400 Gb/s | 跨机替代方案 |
永远不要跨机做 TP
NVLink 的带宽是 InfiniBand 的 10–35 倍,TP 的 AllReduce 在 InfiniBand 上会被通信完全卡死。TP 严格机内、PP/EP 跨机是分布式推理的铁律。
七、主流实现
| 框架 | TP | PP | EP | 备注 |
|---|---|---|---|---|
| vLLM | ✅ | ✅ (v0.6+) | ✅ (v0.7+) | 生产首选,最广支持 |
| TensorRT-LLM | ✅ | ✅ | ✅ | NVIDIA H100 上极致 |
| DeepSpeed-MII | ✅ | ✅ | ✅ | 微软系,ZeRO-Inference 支持超显存 |
| SGLang | ✅ | ✅ | ✅ | 复杂应用强 |
| TGI | ✅ | ❌ | ❌ | HF 官方,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 2DeepSpeed-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 AWQ | 1 | 60 | 50 ms | |
| 单卡 80GB INT4 AWQ | 32 | 1200 | 75 ms | |
| 2 卡 TP=2 FP16 | 1 | 100 | 30 ms | |
| 2 卡 TP=2 FP16 | 32 | 2200 | 35 ms | |
| 4 卡 TP=4 FP16 | 32 | 4000 | 30 ms | |
| 4 卡 TP=4 FP16 | 128 | 7000 | 40 ms | |
| 8 卡 TP=8 FP16 | 128 | 8500 | 30 ms | |
| 2 机 8 卡 TP=8 PP=2 FP16 | 128 | 6500 | 60 ms | ← 跨机 PP 损失 |
可以看到:
- TP=4 时吞吐 4000 tokens/s,加并发到 128 → 7000,接近 NVLink 通信上限;
- 跨机 PP=2 时吞吐降到 6500,比单机 8 卡 TP=8 少 ~25%——这是 PP bubble 与跨机通信的代价。
九、局限与边界
- TP 上限 8(单机):跨机 TP 通信卡死,必须 PP 或 EP。
- PP bubble 难消除:推理场景 bubble 比训练更难消除(推理只有 forward),需要大并发才能填满流水线。
- EP 复杂度高:All-to-All 通信 + 负载均衡难,专家分布不均会导致部分 GPU 空闲。
- 调度复杂:跨机协调、failure recovery、scale-up/down 比 单机推理 复杂数倍。
- 成本:8 卡 H100 节点价格 ~30 万美元,128 卡集群 ~500 万美元——只有少数业务能 justify。
- 小请求收益小:batch=1 的单用户场景,分布式推理几乎不快——通信开销抵消切分收益。分布式推理的甜区在大并发生产 serving。
- 超显存兜底:当显存真的不够时,可以用 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,延迟换显存)十一、可继续追踪
- 概念页:GPU 优化原理、显存带宽、延迟与吞吐、模型服务化、批处理与调度
- 案例页:vLLM、TensorRT-LLM、Triton 推理服务、投机解码
- 论文:核心论文(Megatron-LM / DeepSpeed / GPipe 论文精读)、论文路线图、前沿进展
- 实践页:引擎对比、调优实践、基准测试、项目集、设计原则、避坑指南
- 资源页:硬件入门、基准集合、Awesome 集合
参考资料
- Shoeybi et al. Megatron-LM: Training Multi-Billion Parameter Language Models Using Model Parallelism(2019) — TP 经典
- Huang et al. GPipe: Efficient Training of Giant Neural Networks using Pipeline Parallelism(NeurIPS 2019) — PP 经典
- Narayanan et al. Efficient Large-Scale Language Model Training on GPU Clusters using Megatron-LM(SC 2021) — 1F1B 调度
- Fedus et al. Switch Transformers: Scaling to Trillion Parameter Models with Simple and Efficient Sparsity(2021) — MoE + EP
- DeepSeek-AI. DeepSeek-V3 Technical Report(2024.12) — MTP + EP 工程实践
- Microsoft. DeepSpeed — ZeRO-Inference 实现
- NVIDIA. Megatron-Core — TP/PP/EP 训练与推理栈
- vLLM Distributed Serving 文档 — vLLM 多卡部署