1. 大模型推理并行策略概述
在大模型推理部署中,由于模型参数量常超出单GPU显存容量,或单GPU算力无法满足推理性能要求,通常需要借助并行策略来解决这类问题。与训练阶段不同,推理任务的计算流程有其特殊性,因此需要针对性地设计和优化并行策略。
1.1 为什么需要并行推理
现代大语言模型(如GPT-3、LLaMA等)参数量动辄数十亿甚至上千亿,单个GPU的显存容量往往无法容纳整个模型。以1750亿参数的GPT-3为例,仅模型参数就需要约350GB显存(假设使用FP16精度),远超当前主流GPU(如A100 80GB)的容量。此外,推理任务对延迟要求严格,单GPU的计算能力可能无法满足实时响应的需求。
1.2 并行策略分类维度
根据输入激活值的切分维度,常见的并行策略可分为:
- 数据并行(DP):切分batch维度
- 序列并行(SP/CP):切分序列长度维度
- 张量并行(TP):切分隐藏层维度
- 流水线并行(PP):切分层维度
- 专家并行(EP):切分专家网络维度
每种策略都有其适用场景和优缺点,实际部署中常采用多种策略的组合。
2. 数据并行(DP)深度解析
2.1 DP核心原理
数据并行是最基础的并行策略,其核心思想是在不同GPU上运行相同的模型副本,每个副本独立处理一部分输入数据。在推理场景下,DP可以理解为同时运行多个相同的推理实例,每个实例处理不同的用户请求。
与训练阶段的DP不同,推理DP不需要进行梯度同步,因此实现更为简单。现代推理框架通常采用"参数服务器+工作者"架构,其中参数服务器维护模型权重,工作者节点负责实际推理计算。
2.2 DP实现细节
典型的DP实现需要考虑以下关键点:
- 请求调度:需要一个中央调度器将用户请求均匀分配到各个工作者节点
- 负载均衡:确保各节点的计算负载均衡,避免某些节点过载而其他节点空闲
- 状态管理:对于有状态的推理(如对话场景),需要确保同一会话的请求路由到同一节点
python复制# 简化的DP实现伪代码
class DPScheduler:
def __init__(self, model, num_workers):
self.workers = [ModelWorker(copy.deepcopy(model)) for _ in range(num_workers)]
self.lock = threading.Lock()
self.counter = 0
def dispatch(self, request):
with self.lock:
worker_idx = self.counter % len(self.workers)
self.counter += 1
return self.workers[worker_idx].process(request)
2.3 DP性能考量
DP的优势在于实现简单且几乎线性扩展,但其主要限制是:
- 内存冗余:每个GPU需要存储完整的模型副本,显存利用率低
- 通信开销:在某些架构中仍需要同步中间结果
- 长尾延迟:单个慢请求会影响整体吞吐量
在实际部署中,DP常与其他并行策略结合使用,形成混合并行方案。
3. 张量并行(TP)技术详解
3.1 TP数学基础
张量并行的理论基础是矩阵的分块运算。考虑一个简单的矩阵乘法Y = XW,其中X∈R^(b×h),W∈R^(h×o)。我们可以将W按列切分为W=[W₁,W₂],那么:
Y = XW = X[W₁,W₂] = [XW₁, XW₂]
这意味着我们可以将W的不同列切分到不同设备上计算,最后合并结果。类似地,也可以按行切分矩阵,但需要额外的通信操作。
3.2 Transformer中的TP实现
在Transformer模型中,TP主要应用于以下层:
- 注意力层:将Q/K/V投影矩阵切分到不同设备
- 前馈网络(FFN):将第一个全连接层按列切分,第二个按行切分
- 嵌入层:将词表切分到不同设备
以Megatron-LM的TP实现为例,其核心思想是将矩阵乘法沿特定维度切分,使得每个设备只需计算部分结果,然后通过集合通信(如all-reduce)合并结果。
3.3 TP通信模式分析
TP的主要通信发生在:
- 前向传播:需要聚合部分计算结果
- 后向传播:需要同步梯度
在推理场景下,由于只需要前向传播,通信量相对训练有所减少。但TP仍然对设备间互联带宽有较高要求,通常建议在NVLink或InfiniBand连接的高性能集群上使用。
python复制# TP实现的简化示例
def column_parallel_linear(x, weight, bias):
"""列并行线性层"""
local_output = torch.matmul(x, weight)
global_output = all_reduce(local_output)
return global_output + bias
def row_parallel_linear(x, weight, bias):
"""行并行线性层"""
local_output = torch.matmul(x, weight)
return local_output + bias
4. 序列并行(SP)与上下文并行(CP)
4.1 SP基本原理
序列并行是针对长序列推理的优化策略,将输入序列切分成多个片段分配到不同设备上处理。这在处理长文档或对话历史时特别有用,因为序列长度可能达到数万token。
SP的关键挑战在于处理序列各片段间的依赖关系,特别是注意力机制需要看到完整序列。解决方案包括:
- 重叠切分:各片段保留部分重叠区域
- 通信聚合:通过all-gather等操作获取全局信息
4.2 CP与SP的区别
上下文并行(CP)是SP的变种,专注于优化注意力计算中的KV缓存管理。在长序列推理中,KV缓存可能消耗大量显存,CP通过分布式存储和计算KV缓存来解决这个问题。
CP的核心创新是:
- 分布式KV缓存:将KV对切分到不同设备
- 高效注意力计算:通过通信优化减少数据传输量
4.3 SP/CP实现示例
以DeepSpeed-Ulysses的实现为例,其工作流程为:
- 序列切分:将输入序列切分到多个设备
- 注意力计算前:通过all-to-all通信使每个设备获得完整的序列子集
- 计算局部注意力
- 通过反向all-to-all还原结果
python复制# 简化的SP注意力实现
def sparse_attention(q, k, v, seq_group):
"""序列并行下的稀疏注意力"""
# 步骤1:本地计算query
local_q = q[seq_group.local_slice]
# 步骤2:all-gather完整的key和value
global_k = all_gather(k)
global_v = all_gather(v)
# 步骤3:计算注意力分数
scores = torch.matmul(local_q, global_k.transpose(-1, -2))
attn = torch.softmax(scores, dim=-1)
# 步骤4:加权求和
output = torch.matmul(attn, global_v)
return output
5. 流水线并行(PP)在推理中的应用
5.1 PP基本概念
流水线并行将模型按层切分到不同设备,数据以流水线方式在不同阶段间流动。虽然PP在训练中广泛使用,但在推理场景下应用相对有限,主要原因包括:
- 推理气泡:由于层间依赖,设备利用率难以达到100%
- 延迟增加:请求需要经过多个设备才能完成
5.2 推理PP优化技术
为了减轻PP在推理中的效率问题,可采用以下优化:
- 微批次(Micro-batching):将单个请求拆分为多个微批次填充流水线
- 提前返回:对于生成式任务,可以边生成边返回部分结果
- 动态调度:根据各阶段计算时间动态调整微批次大小
5.3 PP实现考量
实现高效推理PP需要注意:
- 设备拓扑:相邻阶段应放置在通信延迟低的设备上
- 缓存管理:合理管理KV缓存以避免重复传输
- 容错设计:单个设备故障不应导致整个流水线崩溃
python复制# PP推理调度器简化实现
class PipelineScheduler:
def __init__(self, stages):
self.stages = stages # 各阶段模型
self.pipes = [deque() for _ in stages] # 各阶段流水线队列
def schedule(self, requests):
# 将请求拆分为微批次并注入流水线
micro_batches = self.split_into_micro_batches(requests)
# 推进流水线执行
for stage_idx in range(len(self.stages)):
if self.pipes[stage_idx]:
batch = self.pipes[stage_idx].popleft()
output = self.stages[stage_idx](batch)
if stage_idx < len(self.stages) - 1:
self.pipes[stage_idx + 1].append(output)
6. 专家并行(EP)与MoE推理
6.1 MoE模型特点
混合专家(Mixture of Experts)模型由以下组件构成:
- 门控网络:决定输入路由到哪些专家
- 专家网络:多个独立的子网络,每个都是完整模型的一部分
- 聚合机制:组合各专家的输出
典型的MoE模型如Google的Switch Transformer或Meta的FairSeq-MoE。
6.2 EP核心思想
专家并行的核心是将不同专家分配到不同设备上,每个设备只存储和计算部分专家。输入数据根据门控网络的路由决策被发送到相应的专家设备,计算结果再聚合返回。
EP的关键优势是:
- 显存效率:每个设备只需存储部分专家参数
- 计算效率:每个输入只激活少量专家
- 可扩展性:可以通过增加专家数量而非深度来扩展模型
6.3 EP实现挑战
实现高效EP需要解决:
- 负载均衡:确保专家间的计算负载均衡
- 通信优化:减少专家间的数据传输
- 路由效率:门控网络的计算开销
python复制# 简化的EP实现
class ExpertParallelLayer(nn.Module):
def __init__(self, experts, gate):
super().__init__()
self.experts = experts # 分布在多个设备上的专家
self.gate = gate # 门控网络
def forward(self, x):
# 计算路由权重
gate_logits = self.gate(x)
routing_weights = torch.softmax(gate_logits, dim=-1)
# 选择top-k专家
topk_weights, topk_experts = torch.topk(routing_weights, k=2)
# 分布式计算专家输出
expert_outputs = []
for expert_idx in topk_experts.unique():
mask = topk_experts == expert_idx
selected_inputs = x[mask]
expert_output = self.experts[expert_idx](selected_inputs)
expert_outputs.append((expert_output, mask))
# 聚合结果
output = torch.zeros_like(x)
for expert_out, mask in expert_outputs:
output[mask] = expert_out * topk_weights[mask].unsqueeze(-1)
return output
7. 并行策略组合与优化
7.1 混合并行策略
实际部署中常组合多种并行策略,例如:
- DP+TP:常见于中等规模模型,TP解决单层显存问题,DP提高并发
- TP+PP:用于超大规模模型,PP切分层维度,TP切分单层
- EP+DP:MoE模型的典型配置,EP切分专家,DP处理批量
7.2 通信优化技术
减少并行策略的通信开销是关键优化方向:
- 通信重叠:在计算同时进行数据传输
- 梯度压缩:对通信数据使用压缩算法
- 拓扑感知:根据网络拓扑优化通信路径
7.3 资源分配策略
高效的资源分配应考虑:
- 计算密集型层:分配更多资源给注意力等计算密集操作
- 内存瓶颈层:对内存消耗大的层使用TP或PP
- 通信热点:避免在带宽受限的链路上集中通信
8. 并行策略选择指南
8.1 策略选择决策树
选择并行策略时可参考以下决策流程:
- 模型是否适合MoE?是→考虑EP
- 单层参数是否超过单卡显存?是→需要TP
- 完整模型是否超过单卡显存?是→考虑PP
- 序列长度是否特别长?是→考虑SP/CP
- 需要处理高并发请求?是→需要DP
8.2 各策略适用场景对比
| 策略 | 最佳适用场景 | 主要优势 | 主要限制 |
|---|---|---|---|
| DP | 高并发推理 | 实现简单,扩展性好 | 显存冗余 |
| TP | 大参数单层 | 显存效率高 | 通信密集 |
| PP | 超深模型 | 支持极大模型 | 有推理气泡 |
| SP/CP | 长序列处理 | 优化长序列内存 | 实现复杂 |
| EP | MoE模型 | 计算效率高 | 负载均衡难 |
8.3 实际部署建议
- 从小规模开始:先在小集群上验证正确性
- 性能剖析:使用nsight等工具分析瓶颈
- 渐进优化:从DP开始,逐步引入TP/PP等
- 监控调整:持续监控并根据实际负载调整配置
