首页优化地图方法索引基础概念
返回技术汇总表 ↗

M024 · 独立详解

并行策略与设备映射:同一个模型,怎样让多卡分工

先区分“各算不同数据”和“合作算同一数据”,再用两卡 MLP 的完整算例理解 TP、PP、CP、SP 与专家并行。

调度与并行通信与互联内存与数据搬运详解已编写
视频讲解待制作

这篇文章的小视频尚未制作;可以先阅读下方文字详解。

本页目录

01 · 卡更多,为什么仍可能装不下或跑不快

多卡有两种很不同的分工:每组设备处理不同请求/训练样本,或多台设备协作处理同一个样本。前者通常扩大吞吐,后者可分担一个模型的容量与计算,却要在步骤之间交换数据。

设计并行策略,先问三个问题:一张卡装不下的是权重、优化器状态还是激活?目标是单请求延迟、服务吞吐还是训练时间?设备之间的通信成本多大?问题不同,适合切分的对象也不同。

02 · 一张表看清每种策略切什么

策略分工对象主要交换什么典型目标
DP:数据并行不同样本/请求由不同模型副本处理训练时同步同一参数的梯度;独立推理副本通常各自服务扩大吞吐;普通复制式 DP 不解决单副本装不下。
TP:张量并行同一层的矩阵/头等分片局部结果求和、汇集或再分片分担大层容量与计算。
PP:流水线并行不同设备负责不同层段相邻阶段的隐藏激活,训练反向还传激活梯度分担模型深度,利用多个 microbatch 流水。
CP:上下文并行同一样本的长序列分片Attention 所需远端 K/V 或对应中间量分担长上下文工作与激活。
Megatron 式 SPTP组中部分激活沿序列维度分片按算子布局做 AllGather / ReduceScatter 等减少部分激活复制,不等于把 Attention 全部变成局部序列计算。
EP:专家并行不同 MoE 专家放到不同设备路由 token 到专家,再把结果送回分担专家权重与负载。
ZeRO / FSDP训练状态在数据并行组内分片使用前汇集参数、归约/分片梯度等减少常驻训练状态;另有独立详解。

依据:Megatron Core · Parallelism Guide ↗ · PyTorch · Transformer Tensor Parallel 教程 ↗

03 · TP 第一步:不同卡算不同输出通道

约定 X 是行向量,W 按 [输入维度,输出维度] 排列。把 W 的输出列切成 W0 和 W1,每张卡拿到同一 X,分别计算 XW0 与 XW1。两份输出是完整结果的不同坐标,恢复完整向量时应拼接,而不是逐元素相加。

教学伪代码 / 示意 · 不代表真实通信接口
X=[1,2]
W1=[[1,2,0,1],
    [0,1,3,2]]
完整 XW1=[1,4,6,5]

卡0:前两列 → [1,4]
卡1:后两列 → [6,5]
拼接 → [1,4,6,5]

这常称为列并行 Linear,但名称依赖数学记号和库的权重存储约定。PyTorch Linear 的存储轴与这里 W 的表示不同,选择切分轴时应先对齐“切输入还是输出”,不能仅照抄行列名称。

04 · TP 第二步:局部输出为什么要相加

接着做逐元素 ReLU,再乘第二个权重 W2。ReLU 可以分别处理各卡已有的不同通道,不必先汇集。第二层按输入坐标对应的行切分,让每张卡继续使用自己的隐藏向量。此时各卡算的是同一输出坐标的不同贡献,必须求和。

教学伪代码 / 示意 · 不代表真实通信接口
隐藏向量 H=ReLU([1,4,6,5])=[1,4,6,5]
W2=[[1,0],
    [0,1],
    [1,1],
    [2,0]]

卡0:[1,4] × 前两行 = [1,4]
卡1:[6,5] × 后两行 = [16,6]
求和:[1,4]+[16,6]=[17,10]
这与完整 HW2 一致。

如果后续要求每卡得到完整 [17,10],可用 AllReduce;如果后续允许每卡只保留指定结果片,可用 ReduceScatter,并与后续布局衔接。二者结果的放置不同,不是无条件可互换。偏置也不能给每份局部贡献都加一遍后再求和,否则被重复计入。

这就是“列并行 → 本地非线性 → 行并行”的一个价值:中间大隐藏层保持分片,减少立即汇集的需要。训练反向也有自己的依赖和归约,不能因为前向最后只有一次通信,就推断整步只有一次通信。

依据:Megatron-LM · Tensor Model Parallelism 原始论文 ↗ · PyTorch · Transformer Tensor Parallel 教程 ↗

05 · 反向也用同一个分片逻辑

给上例最终输出梯度 dY=[2,−1]。完整 dH=dY×W2ᵀ=[2,−1,1,4],可按通道分别算。第一层输入梯度由两卡贡献相加:卡0贡献 [0,−1],卡1贡献 [4,11],合为 dX=[4,10]。权重梯度则归属对应权重分片。

这与 DP 的梯度同步不同:TP 卡协作计算同一样本的不同参数片与局部贡献;DP 副本对同一参数片处理不同数据,再归约这些样本贡献。两种通信组和归约对象必须分清。

通信安排还能与就绪块计算重叠,或采用通算融合。前者见通信重叠篇,后者见 MC² 篇;TP 的数学切分本身并没有让通信成本消失。

06 · PP:把层分开,并不会缩短同一个样本的依赖链

教学伪代码 / 示意 · 不代表真实通信接口
单个样本:
卡0:层1–4 → 传隐藏向量 → 卡1:层5–8 → 输出
训练反向:
卡1:后半模型反向 → 传边界梯度 → 卡0:前半模型反向

卡1必须等卡0输出。同一个请求的一步仍经过全部层段,所以 PP 不意味着单请求延迟直接减半。让多个 microbatch 或请求错开推进,才可能让各阶段同时忙起来。流水线如何填充、排空和释放激活,见独立的流水线调度篇。

推理时,各阶段保留自己负责层的 KV。自回归下一步仍依赖最终阶段产生的新 token,不能把未知未来 token 当作独立 microbatch 并行推进;服务可利用多个独立请求或引擎支持的其他执行单元。

依据:GPipe · 原始论文 ↗

07 · 为什么 SP 与 CP 不能只因都切序列就混为一谈

在 Megatron 的常见用法里,SP 避免某些 LayerNorm、Dropout 等激活在 TP 卡上重复保留,并在进入相应矩阵操作时转换布局。CP 则把一个长序列的工作分给不同设备;处理本地查询时,仍需拿到数学上可见的远端 K/V 或执行等价分布式 Attention。

例如序列1到8切为两半,卡1处理查询位置7,因果 Attention 仍允许它看位置1到7。只读取自己这半段,会把原模型改成不同的 Attention。CP 的通信和归约就是为了在分布式存放下保持规定的可见性。

“sequence parallel”在不同框架中可能指不同范围,读文档要核对具体算子、布局与数据交换。EP 则切专家,路由不均时部分设备仍会拥堵;它需要专家布局和负载均衡,而不只是增加专家并行度。

依据:Megatron Core · Parallelism Guide ↗ · vLLM · Expert Parallel Deployment ↗

08 · 八卡如何组织:先画通信组,再放到物理设备

一个仅含 DP、TP、PP 的教学配置:DP=2、TP=2、PP=2,总共8卡。每个数据副本使用4卡,其中两个流水线阶段,每阶段两卡张量并行。假定设备0–3和4–7分别位于两个节点,可把每个副本的频繁 TP 通信留在节点内;DP 同步跨节点。实际最优映射需要测量。

数据副本流水阶段0的TP组流水阶段1的TP组对应的DP组
副本A设备0、1设备2、3设备0和4持同一参数片;1和5、2和6、3和7同理。
副本B设备4、5设备6、7同一阶段、同一TP分片位置的设备归约样本梯度。

分组时要看通信频率、消息量、链路带宽和延迟,而非只看设备编号连续。频繁 TP 集合通信、PP 点对点、EP AllToAll 对网络提出不同要求;这些也影响超节点内部与跨节点的设备映射。

09 · 用两卡教学模型先验证结果

下方 CPU 例子验证列分片、行分片、组合 MLP 前向和输入梯度,并比较完整权重梯度与各卡梯度片。它没有启动真实通信组,不测试多卡速度。

教学伪代码 / 示意 · 不代表真实通信接口
choose_parallel_groups_and_rank_mapping()
shard_parameters_and_define_activation_layouts()
for layer in model:
    local_output = compute_with_local_shards(local_input)
    next_input = communicate_if_required(local_output, next_layer_layout)
# 训练反向再执行对应的梯度通信;优化器更新各自负责的参数

NVIDIA 可检查 Megatron Core 或 PyTorch TP 的布局与通信接口;昇腾可从 MindSpeed 特性清单查所需并行组合和实现入口。概念能够对应,不代表同一 API、网络或每种组合都能直接移植。

依据:PyTorch · Transformer Tensor Parallel 教程 ↗ · MindSpeed Core · 特性清单 ↗

10 · 怎样判断并行真的带来收益

  • 先验证前向、梯度、Loss和参数更新语义,再比较性能。
  • 记录每卡权重/状态/激活/KV峰值,确认真正解决了哪个容量瓶颈。
  • 相同任务比较端到端步骤时间、请求延迟与吞吐,不只看单个矩阵乘法。
  • 查看通信时间线、流水气泡、负载差异和跨节点映射。
  • 明确固定全局工作量还是固定每卡工作量;扩容同时增大全局批量属于不同的比较。

更多分片通常减少单卡工作,却可能让矩阵变小、增加通信或流水等待。设备在一起不保证数据交换免费;GPU/NPU 的比较应以相同任务、实际并行实现和互联为依据。

11 · 四个问题串起并行与通信

  • 列分片的两份输出为什么拼接,行分片的两份贡献为什么求和?
  • DP=2、TP=2、PP=2时,为什么全局批量只乘DP副本数?
  • PP对单个请求的一步,为什么仍需走完所有层?
  • CP把序列切开后,位置7为什么还需要位置1到4的信息?

流程位置与关联方法

这个方法可能出现在多个位置;计算线包含模型计算与算子实现,执行线包含运行时、内存和通信。

资料与核查范围

原理依据以原始论文和官方文档为主;算例与时间线是教学推导。文档核查日期:2026-10-10。引用 main / latest 文档时,实际接口以安装版本为准。

代码为接入片段或教学伪代码;本页没有声称完成 NVIDIA / 昇腾硬件实测。

← 返回总表中的 M024继续阅读:通信算法、协议与拓扑优化 →
AI Infra 知识库 · 总览 → 独立讲解网站更新 2026-10-08
搜索知识库

搜索方法与基础概念 · Esc 关闭