深色模式
张量 / 流水线 / 专家并行
摘要:当模型放不进单卡或要提吞吐时,需要并行切分。本文讲清四种并行——张量并行(TP)、流水线并行(PP)、数据并行(DP)、专家并行(EP)——的切分对象、通信开销与适用边界,并给出 vLLM 的
--tensor-parallel-size/--pipeline-parallel-size/--data-parallel-size/--enable-expert-parallel实战命令。适用版本:vLLM 0.8.x–0.9.x,参数以官方文档为准。
适用版本与前提
- 引擎:vLLM(示例);TGI/SGLang 概念相通
- 硬件:多卡/多机,NVLink(节点内)优于以太网/IB(跨节点)
- 读者已了解 KV Cache、显存瓶颈(见
vllm.md、kv-cache.md)
核心概念:四种并行切的是什么
| 并行 | 切分对象 | 通信 | 降延迟? | 提吞吐? | 典型用途 |
|---|---|---|---|---|---|
| TP 张量并行 | 每层权重按列/行切到多卡 | AllReduce(频繁) | 是(单请求并行) | 中 | 模型>单卡、节点内 |
| PP 流水线并行 | 模型按层分成段,段放不同卡 | 点对点(p2p) | 否(要过所有段) | 高(填满时) | 跨节点/超大模型 |
| DP 数据并行 | 整模型复制多份,各处理不同请求 | 无(副本独立) | 否 | 是(并发) | 提并发、隔离租户 |
| EP 专家并行 | MoE 的专家分到不同卡 | AllToAll | 视组合 | MoE 专用 | Mixtral/DeepSeek/Qwen-MoE |
一句话记忆
TP 把"一层"拆开(通信最密,放节点内 NVLink);PP 把"层"串成流水线(通信少,可跨节点);DP 是"多份完整模型"各干各的(加并发);EP 是 MoE 专属(把专家摊开)。
架构与原理
TP 的通信代价(关键)
TP 每层后要 AllReduce 汇总各卡的部分结果。节点内 NVLink(~900 GB/s)代价小;跨节点走 IB/以太网(25–100 GB/s)时 AllReduce 占 decode 步时间的比例急剧上升。经验法则:TP 放在节点内,PP 跨节点。
PP 的气泡问题
朴素 PP 一次只处理一个请求,3/4 的卡在空转(流水线气泡)。现代引擎让多个请求并发流过流水线各段,把气泡压满,提升吞吐,但单请求延迟仍高于 TP。
EP 仅用于 MoE
MoE 每层只有部分"专家"被激活。EP 把专家分布到不同卡,配合 AllToAll 路由 token。错误使用(非 MoE 模型开 EP)是无意义的开销。
MoE 的 KV 重复陷阱
不正确的并行组合会让每个卡都保存完整 KV Cache,显存膨胀到 8×。vLLM 的"DP Attention + EP/TP MoE"等组合专为避免此问题。MoE 部署务必读懂引擎文档的并行矩阵,不要随意叠加 TP/PP/EP。
生产部署命令(vLLM)
bash
# 单节点 4 卡:TP=4(模型放不进单卡但在节点内)
docker run --gpus all --ipc=host -p 8000:8000 \
-v /mnt/models:/models \
vllm/vllm-openai:latest \
--model /models/Llama-3.1-70B-Instruct \
--tensor-parallel-size 41
2
3
4
5
6
2
3
4
5
6
bash
# 跨节点:2 节点 × 8 卡 = 16 卡,TP 在节点内、PP 跨节点
# 节点内 NVLink 做 TP=8,两节点做 PP=2
vllm serve /models/Llama-3.1-405B \
--tensor-parallel-size 8 \
--pipeline-parallel-size 2
# 多节点依赖 Ray 或容器集群;需各节点环境/模型路径一致,推荐用镜像保证一致
# [版本相关] 分布式后端(--distributed-executor-backend mp/ray)以官方文档为准1
2
3
4
5
6
7
2
3
4
5
6
7
bash
# 提并发:DP=2,每副本 TP=4(8 卡),无卡间通信、吞吐随并发线性增
vllm serve /models/Llama-3.1-70B-Instruct \
--tensor-parallel-size 4 \
--data-parallel-size 21
2
3
4
2
3
4
bash
# MoE(如 Mixtral / DeepSeek / Qwen-MoE):启用专家并行
vllm serve /models/Qwen3-235B-A22B \
--tensor-parallel-size 8 \
--enable-expert-parallel
# [版本相关] EP 开关名(--enable-expert-parallel)及与 TP/DP 的组合约束随版本演进1
2
3
4
5
2
3
4
5
验证
bash
# 启动日志确认并行生效,关注 KV 池与并发估算
# INFO GPU KV cache size: ...
# INFO Maximum concurrency for ...: ...x
# 用 nvidia-smi 看各卡显存/利用率是否均衡(TP 应较均衡;PP 段间可能不均)1
2
3
4
2
3
4
- 跨节点部署:用
nvidia-smi dmon/ DCGM 看各卡利用率与 NVLink/网络带宽占用,确认没有通信瓶颈。 - 压测对比不同并行组合下的 P99 与吞吐,选契合场景的。
回滚与清理
并行配置错误会启动失败或显存爆炸
TP 必须能整除注意力头数(否则报 "Total number of attention heads must be divisible by tensor parallel size");非 MoE 开 EP 浪费;PP 跨节点需 Ray/网络就绪。变更前记录旧配置,异常回退。
故障排查
| 现象 | 原因 | 处理 |
|---|---|---|
| TP 启动报"heads 不可整除" | TP 值与头数不匹配 | 改 TP 为可整除值(如 1/2/4/8) |
| 跨节点吞吐差 | AllReduce 走慢网络 | TP 收进节点内,PP 跨节点 |
| PP 单请求延迟高 | 必经所有段 | 低延迟场景用 TP 而非 PP |
| MoE 显存爆炸 | KV 被复制 | 用引擎推荐的 DP+EP/TP+EP 组合 |
| 各卡利用率不均 | 并行策略错配 | 重读引擎并行矩阵,调整组合 |
安全与合规
- 成本失控:多卡多机并行 = 每小时成本是单卡倍数。先确认单卡放不下再并行;用利用率监控防止"8 卡只跑满 1 卡"。
- 越权:API 鉴权前置。
- 多租户隔离:DP 副本可用于租户级隔离,避免请求混批泄露上下文。
成本与性能(示意)
| 配置 | GPU | 估算单价[未实测] | 用途 |
|---|---|---|---|
| TP=4(70B) | A100 80GB ×4 | ~¥32–60/h | 单请求低延迟 |
| TP=8+PP=2(405B) | A100 80GB ×16 | ~¥128–240/h | 超大模型 |
| DP=2×TP=4(70B) | A100 80GB ×8 | ~¥64–120/h | 高并发 |
选型决策树
模型放得下单卡?→ 不并行。放不下但在节点内?→ TP。跨节点才放得下?→ TP(节点内)+PP(跨节点)。要提并发而非放大模型?→ DP。MoE 且专家多?→ EP(+TP/DP)。记住:TP 走 NVLink,PP 走以太网。