并行
并行既用于容纳单个设备放不下的模型、激活和 KV Cache,也用于扩展吞吐与并发。前者沿张量、网络深度、序列或专家维度切分一次前向计算;后者沿批次或请求维度分配彼此独立的前向计算。至于权重是整模型复制还是以 TP/PP 分片组成副本,属于另一个维度的问题。
本文只讨论推理场景中的 Data Parallelism(DP)、Tensor Parallelism(TP)、Pipeline Parallelism(PP)、Sequence Parallelism(SP)、Context Parallelism(CP)和 Expert Parallelism(EP)。
并行分类
设 Transformer 的输入激活为
推理并行按主要切分对象分成三类:Workload Parallelism 切分请求,Model Parallelism 切分模型结构,Sequence Parallelism 切分 token 激活或上下文状态。
| 分类 | 方式 | 主要切分维度 | 每个设备持有 | 主要通信 | 主要用途 |
|---|---|---|---|---|---|
| Workload | DP | 批次或请求维度 | 一套完整执行能力;可以是整模型,也可以是 TP×PP 分片组 | 请求分发,经典 Dense DP 无逐层集合通信 | 推理吞吐、并发与水平扩展 |
| Model | PP | 层数 | 一段连续或交错的网络层 | 相邻阶段 P2P Send/Recv | 模型跨节点、降低每卡权重显存 |
| Model | TP | 隐藏维度、注意力头 | 每层的部分权重与激活 | All-Reduce、All-Gather、Reduce-Scatter | 单层过大、单机多卡推理 |
| Model | EP | 专家维度 | 部分 MoE 专家 | All-to-All Dispatch/Combine | 分布式 MoE 推理 |
| Sequence | SP | token/序列维度 | 非 TP 区域的部分激活 | All-Gather、Reduce-Scatter | 配合 TP 减少临时激活 |
| Sequence | CP | 上下文维度 | 全网络的部分序列与 KV | KV 交换或注意力结果归并 | 长上下文 Prefill 与 KV Cache 扩展 |
三个分类描述主要作用域,而不是互斥的部署方案。一个执行副本可以同时使用 PP、TP、EP 和 CP,并在外层通过 DP 扩展请求吞吐。
Workload:工作负载
Workload Parallelism 不拆分单次前向计算,而是把不同 Batch 分片或请求分配给多个执行副本。
DP:切分请求,复制执行能力
Data Parallelism 的定义是沿数据维度切分工作:离线推理切 Batch,在线服务切独立请求。这里的“直接切 Batch”完全正确,但切分后必须有多个计算资源同时执行这些分片;因此每个 DP Replica 都需要一套能够完成前向计算的权重布局。
对于单卡可容纳的 Dense 模型,这通常表现为每张 GPU 都加载完整权重;若模型需要 TP 或 PP 才能运行,则每个 Replica 是一组 TP×PP 设备,复制的是相同的分片拓扑,而不是让每张 GPU 都保存完整模型。
离线推理可以沿批次维度切分输入。设模型为
各副本使用相同的参数语义
对于 Dense 模型的经典副本式 DP,每个请求由一个副本独立完成 Prefill 和 Decode,副本之间通常不需要在每层执行集合通信。因此,DP 主要提升系统总吞吐、并发容量和可用性,不会直接缩短单个请求的计算路径,也不会降低每个副本保存权重与 KV Cache 所需的显存。
推理 DP 的核心开销从张量通信转移到了请求调度与资源复制。路由器应结合等待队列、运行中的 token 数量和 KV Cache 状态做负载均衡;需要复用 Prefix Cache 或会话 KV Cache 的请求还应尽量保持副本亲和性,否则切换副本会丢失本地缓存收益。
Hugging Face Accelerate 的多 GPU 推理会把输入切给多个进程,并在每个进程保留模型;DeepSpeed-MII 可配置多个 Replica,并让每个 Replica 内部继续使用 TP;vLLM 也把每个 DP Rank 作为独立 Core Engine,分别维护调度与 KV Cache。[4][5][6]
并非所有名为 DP 的推理实现都完全独立。vLLM、SGLang 和 TensorRT-LLM 的 MoE 部署常组合 Attention DP 与 Expert EP:Attention 按请求分片,但 MoE token 会跨多个 DP Rank 进入 EP 通信组。这种情况下只复制 Dense/Attention 的执行能力,专家权重仍是分布式的。[7][8][9]
Model:模型结构
Model Parallelism 让多个设备共同完成同一次前向计算。PP 沿网络深度切分层,TP 沿层内张量切分矩阵,EP 沿 MoE 结构切分专家。
PP:按网络深度切分
Pipeline Parallelism 将
PP 的通信只发生在阶段边界,通常是 P2P Send/Recv,不需要像 TP 一样在每层执行集合通信。因此常见的拓扑映射是:节点内使用 TP,节点间使用 PP。
流水线必须同时处理多个 Microbatch 或请求才能让各阶段持续工作。以只有前向计算、
在推理阶段,引擎可以将批次切成多个 Microbatch,使不同 Microbatch 同时占据不同流水线阶段;Continuous Batching 则持续为这些批次补充请求。但单个请求仍需依次经过全部阶段。PP 的主要价值是容纳更大的模型和跨节点扩展,而不是降低单请求端到端延迟。
TP:切分单层张量
Tensor Parallelism 在每一层内部切分矩阵乘法。以两层 MLP 为例,省略偏置后有:
其中
每个设备独立计算
最后的求和需要 All-Reduce;与 SP 结合时,也可以使用 Reduce-Scatter,让每个设备只保留一段输出。Attention 的处理方式类似:不同设备计算不同的 Q/K/V 头,输出投影后再归并结果。
TP 能同时切分 Attention、MLP 权重以及相应的 KV Cache,但几乎每个 Transformer 层都包含集合通信。因此:
- 优势:单层权重和计算被分摊,设备共同完成同一个 token 的前向计算。
- 代价:TP 度越大,本地矩阵乘法越小,集合通信占比越高。
- 部署:通常优先把一个 TP Group 放在具备 NVLink、NVSwitch 等高速互联的单个节点内。
- 约束:注意力头数、中间维度和量化分组等通常需要满足框架的可切分条件;GQA 的 KV Head 是切分还是复制取决于具体实现。
如果模型能够放入单卡,增加 TP 不一定降低延迟。它只有在并行计算收益大于通信与同步开销时才会加速。
主流推理框架通常优先把 TP Group 放在一台具有高速 GPU 互联的节点内。vLLM 使用 Megatron-LM 风格 TP,并建议在单节点多 GPU 上优先使用;跨节点时更常见的是“节点内 TP、节点间 PP”。[3]
EP:按 MoE 专家切分
Expert Parallelism 将 MoE 层的专家分布到不同设备。对 token
EP 只切分专家参数;Attention、共享专家和其他 Dense 层仍需复制,或再通过 TP、PP 等方式切分。它使每个设备只保存部分专家,但性能高度依赖 token 分布与通信:
- 负载均衡:热门专家收到的 token 过多时,最慢设备决定整层延迟。
- 计算粒度:每个专家收到的 token 太少时,GEMM 难以充分利用 GPU。
- 通信拓扑:Dispatch 和 Combine 产生 All-to-All 流量,跨节点带宽与延迟直接影响性能。
- Prefill/Decode:Prefill 的 token 数量较多,容易形成大批量专家计算;低批量 Decode 更容易受小消息通信和负载波动影响。
EP 与 TP 不互相替代。EP 切分专家数量,TP 切分单个专家内部的矩阵;是否组合二者应根据单个专家大小、并发量和网络拓扑决定。
在 vLLM 中,EP Group 的大小等于
Sequence:序列状态
Sequence 类沿 token 或上下文维度切分运行时状态。SP 只处理 TP 区域外的临时激活,CP 则让序列分片贯穿 Attention 和 KV Cache。
SP:切分 TP 之外的激活
在经典 TP 中,LayerNorm 和残差连接等逐 token 算子不适合沿隐藏维度切分,其输入往往在 TP Group 内重复保存。Sequence Parallelism 改为沿序列或展平后的 token 维度切分这些激活:
LayerNorm 等不依赖其他 token 的算子可以直接在各自的
这里的 SP 特指与 TP 配套的 Sequence Parallelism。它让 LayerNorm、残差连接等区域保持 token 分片,但不切分模型参数,也不让单个设备独立完成完整的长序列 Attention。推理中的这些激活生命周期很短,因此 SP 通常只是 TP Kernel 的配套优化,不是扩展推理容量的首选。[1]
CP:切分完整上下文
Context Parallelism 同样沿序列维度切分,但分片会贯穿整个网络,包括 Attention。每个设备只保存一部分 Query 和对应的 KV Cache:
本地 Query
因此 CP 不能只做本地 Attention。实现可以 All-Gather 完整 K/V,也可以让 K/V 分块在设备间环形传递,并使用在线 Softmax 逐块合并注意力结果。后者无需在每个设备上同时物化完整 K/V,但仍然需要跨设备通信。
Prefill 与 Decode 需要分开理解:
- Prefill:将
个新 token 切成多个 Q/K/V Chunk。中等长度可聚合完整 K/V,让每卡计算本地 Q;更长上下文则保持 Partial Q + Partial KV,通过 Ring Attention 等方式逐块交换 K/V。 - Decode:每步只有少量新 Query,核心是将不断增长的历史 KV Cache 沿时间
切分,各卡计算局部注意力统计量后再归并。
vLLM 的 Context Parallel Deployment 也按这两条路径设计。其 Decode CP 会在 TP 的 KV Head 切分之后,继续沿时间维度消除由于 KV Head 数不足产生的 KV Cache 重复;CP 度增大可以降低 KV 占用,但会增加通信。[10]
SP 与 CP 的区别
| 对比项 | SP | CP |
|---|---|---|
| 分片范围 | LayerNorm、残差等 TP 外部区域 | 输入和所有层的激活,包括 Attention |
| Attention 是否看到本地序列分片 | 否,通常进入 TP 区域前聚合 | 是,本地 Query 配合全局 K/V 计算 |
| 是否切分 KV Cache | 通常否 | 是 |
| 主要收益 | 减少 TP 区域外的临时激活 | 扩展上下文长度、分摊 Prefill 和 KV Cache |
| 典型通信 | All-Gather + Reduce-Scatter | KV 环形交换、All-Gather 或注意力归并 |
不同论文和框架对 Sequence Parallelism 的命名并不统一:部分长序列系统也把贯穿 Attention 的序列切分称为 SP。阅读配置或论文时,应以其是否切分 Attention 和 KV Cache 为判断依据,而不是只看名称。
组合与选择
实际系统通常同时建立多组通信域。例如 TP=4、PP=2 表示一个执行副本包含两个流水线阶段,每个阶段由 4 张卡共同执行层内计算,共使用 8 张卡。若再设置 DP=2,则复制两套这样的执行副本,总共使用 16 张卡;不同请求被分配到两个 DP Replica,每个副本内部仍按 TP×PP 协同完成前向计算。
全局请求队列
└─ DP:分配到多个执行副本
└─ 每个副本可使用 CP 切分上下文
└─ 每个上下文分片进入 PP 流水线
└─ 每个阶段内部使用 TP
└─ MoE 层可额外执行 EP Dispatch / Combine常见选择顺序如下:
- 模型能放入单卡:优先使用单卡执行副本;吞吐或并发不足时增加 DP 副本。
- 单层或 KV Cache 放不下:先在高速节点内增加 TP。
- 整体模型仍放不下或必须跨节点:增加 PP,并通过批处理减少流水线气泡。
- 长上下文激活或 KV Cache 成为瓶颈:增加 CP。
- 使用 MoE 且专家权重过大:增加 EP,并重点检查路由负载和 All-to-All 性能。
并行度不是越大越好。增加设备会降低每卡显存与计算量,也会缩小本地算子并增加通信。最终配置应同时测量 Time to First Token(TTFT)、Time per Output Token(TPOT)、吞吐量、峰值显存和跨节点流量,而不能只以模型是否成功加载为标准。
参考
- NVIDIA Megatron Core:Parallelism Strategies Guide
- DeepEP:Expert Parallel Communication Library
- vLLM:Parallelism and Scaling
- vLLM:Data Parallel Deployment
- Hugging Face Accelerate:Distributed Inference
- DeepSpeed-MII:Multiple Replicas and Tensor Parallelism
- vLLM:Expert Parallel Deployment
- SGLang:Prefill-Decode Disaggregation
- TensorRT-LLM:Optimizing MoE Communication with One-Sided All-to-All
- vLLM:Context Parallel Deployment