并行策略
本页整理 LLM 系统中最常见的并行维度,并重点从推理场景解释它们各自改变了什么。最核心的区分在于:外层维度通常复制工作负载,内层维度通常切分模型执行。
写这一页的动机在于,部署决策经常被表述成 DP2TP2、TP4 这种配置标签,但这些标签背后其实对应着不同的系统问题。有些并行方式主要解决吞吐不足,有些主要解决单副本显存不够,还有一些虽然理论上能扩展,却会引入足够大的通信开销以至于收益被抵消。不把这些问题先讲清楚,并行配置就很难真正分析。
数据并行(Data Parallelism, DP)
Data Parallelism(DP)是机器学习系统中最传统、也最直观的分布式执行形式。它的核心思想很简单:在多个设备上实例化同一个模型,同时将输入工作负载分片到这些实例上。每个 worker 在不同的数据子集上执行相同的计算图。从这个意义上讲,它只改变了计算到硬件的映射方式。
DP 在推理中的动机很直接:当单个副本已经放得下模型,但吞吐仍然不足以吸收请求流量时,最自然的扩容方式就是增加更多副本来并行服务请求。
由于参数是复制而不是切分,DP 不会降低单个设备上的内存占用。这一特性界定了它的实际适用范围:当模型本身已经可以放入单卡显存时,DP 很有效;但如果模型本身超过单设备容量,DP 就不够用。因此,它的主要价值在于通过副本扩展吞吐和服务并发。
在训练中,DP 常用于增大有效 batch size 并提升硬件利用率。每个 worker 处理 mini-batch 的一个分片,计算本地梯度,然后参与同步,使所有模型副本在优化步之后保持数值一致。在推理中,同样适用这种副本机制,但不再有梯度交换。取而代之的是,每个 worker 处理独立的请求子集或 token batch。因此在推理负载下,DP 应主要被理解为一种流量分发机制,而不是模型切分机制。
在混合部署中,DP 往往与 Tensor Parallelism(TP)和 Expert Parallelism(EP)并存。在这种配置下,DP replica 不应被字面地理解为单张 GPU。一个 DP 单元本身可能是一个多 GPU 组,其内部执行由 TP 或 EP 组织。从这个视角看,DP 定义的是工作负载复制的外层结构,而 TP 与 EP 决定每个副本内部如何执行计算。
与 DP 相关的集合通信
与 DP 相关的通信行为,本质上取决于系统是在训练还是推理。
在分布式训练中,每个 DP worker 基于本地 mini-batch 分片计算梯度。由于每个 worker 都维护同一套参数,这些梯度必须在每个 step 后同步,以保证副本间一致性。用于这一目的的标准集合通信原语是对梯度执行 all-reduce。在一些实现中,也会用 reduce-scatter 后接 all-gather 来实现同样效果,但目标不变:聚合所有 DP rank 的梯度贡献,并在每个 worker 上得到一致的参数更新。
相比之下,推理不涉及反向传播或优化器 step。每个 DP rank 服务于独立的一部分请求流,因此 DP 本身不会引入强制性的逐层集合通信。在推理场景下,它主要充当调度与流量切分机制,而不是同步密集型执行策略。
即便如此,基于 DP 的推理系统也并非完全无通信。运行时仍需要系统级协调,例如请求分发、负载均衡、准入控制与结果收集。实践中,这类协调常依赖 all-gather 等通信模式,在各 rank 间交换元数据、状态或调度信息。这些操作属于服务框架层,而非模型数值执行本身。
在混合 MoE 部署中,DP 在推理阶段通常只引入有限通信开销,而每个 DP 单元内部的并行机制往往更重通信。Tensor Parallelism 通常依赖 TP 组内的 all-reduce 或 all-gather 等集合通信,而 Expert Parallelism 会引入跨设备的 token 路由以访问不同专家。因此,分析混合系统中的通信时,应区分外层 DP 维度与内层模型并行维度:DP 负责工作负载分发,而主导通信成本的通常是 TP 或 EP。
张量并行(Tensor Parallelism, TP)
张量并行(TP)通过对单层计算中的权重张量进行切分,将计算分布到多个设备上,而不是在每个 rank 上复制完整的层参数。在大规模 Transformer 模型中,这种方式通常应用于注意力层和 MLP 层中的投影矩阵。其核心目标是降低单设备的参数与激活内存占用,从而能够运行那些在单个加速器上无法容纳的超大规模模型层。
TP 的动机与 DP 不同。它通常在单个加速器无法舒适容纳模型,或者减少单卡权重占用能够为激活和 KV cache 腾出更多空间时才真正变得有价值。
考虑一个线性变换:
其中 \(X \in \mathbb{R}^{B \times H}\),\(W \in \mathbb{R}^{H \times O}\),\(Y \in \mathbb{R}^{B \times O}\)。在 TP 中,权重矩阵 \(W\) 会在 \(p\) 个 rank 构成的进程组上进行切分。常见的两种切分方式是按列切分(column-wise sharding)和按行切分(row-wise sharding)。
在列切分的 TP 中,输出维度 \(O\) 被划分,因此每个 rank 存储
每个 rank 计算一个局部输出
这对应于最终输出张量的一个切片。这种模式在 Transformer 的前馈网络第一层投影中非常常见,因为这些部分输出通常可以保持分布式状态,直到后续某个需要同步的阶段才进行合并。
在行切分的 TP 中,输入维度 \(H\) 被划分,因此每个 rank 存储
输入 \(X\) 也必须按照相同方式进行切分,每个 rank 计算对最终输出的一个部分贡献:
由于这些结果都是对同一个输出张量的加性贡献,因此所有 rank 的结果需要进行求和才能恢复完整的 \(Y\)。因此,行切分的 TP 天然需要一个归约步骤。
在 Transformer 的实现中,TP 通常会通过在相邻投影层之间交替使用通信较轻和通信较重的布局来设计。例如,在两层 MLP 结构中,第一层线性变换通常采用列切分以扩展隐藏维度,而第二层则使用行切分将其投影回原始隐藏维度。这种组合可以避免在每个 rank 上物化完整的中间激活,同时尽量延迟通信,使大部分计算保持在本地完成。
TP 的主要优势在于能够扩展模型的宽度,而无需在每个设备上复制全部参数。然而,其效率在很大程度上取决于本地矩阵乘计算与跨 rank 通信之间的平衡。随着 TP 并行度的增加,每个 rank 的 GEMM 规模会变小,而通信在整体执行时间中的占比则会上升。因此,TP 通常只在紧密连接的设备组中使用,例如同一节点内通过高带宽互联连接的 GPU。
与 TP 相关的集合通信
TP 中的通信模式由张量的切分方式以及本地计算产生的是独立输出切片还是部分求和结果所决定。在实际系统中,TP 主要依赖三种集合通信操作:all-gather、reduce-scatter 和 all-reduce。这些通信操作不仅用于数据交换,同时也定义了张量并行执行过程中的同步边界。
在列切分的线性层中,每个 rank 生成的是输出特征的一部分。如果下一个算子能够直接消费这种分布式形式的激活,则不需要立即进行通信。然而,如果后续操作需要完整的激活张量,那么所有 rank 必须执行一次 all-gather 来重建完整输出:
因此,all-gather 通常用于恢复在特征维度上被拆分的张量。
在行切分的线性层中,每个 rank 只计算最终输出的一部分贡献。全局输出为:
这需要在 TP 组内进行求和操作。如果每个 rank 都需要完整的输出,则该操作可以表示为 all-reduce。在一些优化实现中,这个通信步骤会与后续的张量切分需求融合,并通过 reduce-scatter 实现,从而在完成求和的同时将输出重新分布为分片形式,以供下一阶段计算使用。
从系统角度来看,TP 通信的成本受到消息大小、集合通信算法、进程组拓扑结构以及通信与计算的重叠程度等因素的影响。由于 TP 的集合通信是在每一层内部以较高频率触发的,其性能对通信延迟非常敏感。因此,TP 通常只在少量且拓扑接近的设备之间使用。若 TP 组跨越较慢的网络链路,集合通信延迟很容易成为性能瓶颈,从而抵消参数切分带来的收益。
推理视角下的解释
在 serving 场景中,DP 和 TP 往往承担不同职责。
- DP 的主要作用是通过增加副本数来扩展吞吐。
- TP 的主要作用是通过切分参数来改善单副本的模型适配性和显存预算,但代价是引入层内集合通信。
- 增大 DP 会复制更多权重副本,也可能打散 prefix cache 的局部性。
- 增大 TP 会降低单卡权重占用并扩大单副本的 KV 预算,但 TP 过大时通信可能成为瓶颈。
因此,推理部署中的并行决策通常是在“副本级并发能力”和“单副本内存余量”之间做权衡。