【大模型训练】CP并行
在这个上下文里,可以理解为在引入上下文并行(CP)之前,能够构成一个完整、可独立运行的模型的GPU集合。它是一个逻辑上的“模型副本”或“计算单元当时,你就有了多个这样的“模型副本”,每个副本负责处理长序列的一部分。而CP组,就是连接这些不同“模型副本”中角色相同的GPU,以便它们在序列维度上交换信息。这种将CP视为对TP-DP-PP结构的复制和扩展的视角,极大地简化了对复杂四维并行配置的理解。
https://zhuanlan.zhihu.com/p/5502876106
好的,我们来详细解释一下这段关于分布式配置的描述,并回答“什么是 tp-dp-pp group”。
核心思想:CP是在TP/DP/PP基础上的“复制”和“扩展”
您引述的文字描述了一个非常深刻且直观的理解方式,即如何从一个标准的 TP+DP+PP 分布式配置,演变到一个加入了CP(上下文并行)的TP+CP+DP+PP四维并行配置。
让我们一步步拆解:
-
“我们先假设不对输入X做任何序列维度的切分,这时我们就得到了原始的megatron tp-dp-pp组。”
- 含义: 想象一下最经典的大模型分布式训练场景。我们有三种并行策略:
- TP (Tensor Parallelism, 张量并行): 将模型的一个大矩阵(如
nn.Linear的权重)切分到多个GPU上,每个GPU只存一部分权重,计算时需要通信(All-Reduce)。在图里,[0, 1]组成一个TP组,[2, 3]也是,以此类推。 - DP (Data Parallelism, 数据并行): 每个GPU上都有一个完整的模型副本(或者说,是TP切分后的模型副本),各自处理一部分数据(mini-batch),计算完梯度后进行全局同步(All-Reduce)。在图里,
[0, 4]组成一个DP组,[1, 5]也是。 - PP (Pipeline Parallelism, 流水线并行): 将模型的不同层(Layers)放到不同的GPU上。GPU
0计算完第1层后,把结果传给GPU8,GPU8再计算第2层。在图里,[0, 8]组成一个PP组。
- TP (Tensor Parallelism, 张量并行): 将模型的一个大矩阵(如
- tp-dp-pp group: 这就是一个逻辑概念,指的是能够构成一个完整模型、并处理一个完整数据批次的一组GPU。在您的图中,
[0, 1, 4, 5, 8, 9, 12, 13]共同构成了一个tp-dp-pp组。tp=2,dp=2,pp=2,所以一个完整的模型需要2 * 2 * 2 = 8个GPU。- 这8个GPU协同工作,可以完成一个模型的完整前向和后向传播。
- 这可以看作是一个“基本计算单元”。
- 含义: 想象一下最经典的大模型分布式训练场景。我们有三种并行策略:
-
“现在引入cp,意味着我们要把输入X切分成cp_size份,所以我们只需要把原始的tp-dp-pp组拷贝cp_size份,就得到了最终的分布式配置。”
- 含义: 现在,我们想让模型处理更长的序列,单个
tp-dp-pp组处理不了了。于是引入了CP(上下文并行),它的作用就是在序列长度这个维度上进行并行。 - 如果我们设置
cp_size = 2,就意味着我们要把输入序列X切成2份(X_part1,X_part2)。 - 那么,我们自然需要两套计算资源来分别处理这两部分。
- 这“两套计算资源”就是两个独立的
tp-dp-pp组。 - 在您的图中:
- 第一个
tp-dp-pp组:[0, 1, 4, 5, 8, 9, 12, 13] - 第二个
tp-dp-pp组 (拷贝):[2, 3, 6, 7, 10, 11, 14, 15]
- 第一个
- 现在,第一个组负责处理序列的第一部分,第二个组负责处理序列的第二部分。
- 含义: 现在,我们想让模型处理更长的序列,单个
-
“所以我们在前文中才说,相同的tp-dp-pp rank位置就是新的cp组。”
- 含义: 这是最关键的一点,它定义了CP组是如何构成的。
- “相同的
tp-dp-pprank 位置” 指的是在各自的“基本计算单元”中扮演相同角色的GPU。 - 让我们来看例子:
- 在第一个
tp-dp-pp组中,GPU0是tp_rank=0,dp_rank=0,pp_rank=0。 - 在第二个
tp-dp-pp组中,GPU2是tp_rank=0,dp_rank=0,pp_rank=0。 - GPU
0和 GPU2扮演的角色完全一样,只是它们处理的是序列的不同部分。因此,它们需要就序列的边界进行通信。所以[0, 2]组成了一个CP组。
- 在第一个
- 再看一个例子:
- 在第一个
tp-dp-pp组中,GPU1是tp_rank=1,dp_rank=0,pp_rank=0。 - 在第二个
tp-dp-pp组中,GPU3是tp_rank=1,dp_rank=0,pp_rank=0。 - 它们角色相同,所以
[1, 3]组成了一个CP组。
- 在第一个
- 以此类推,就得到了图中所列的
cp_group:[[0, 2], [1, 3], [4, 6], [5, 7], ...]。
总结:什么是 tp-dp-pp group?
tp-dp-pp group 在这个上下文里,可以理解为在引入上下文并行(CP)之前,能够构成一个完整、可独立运行的模型的GPU集合。
它是一个逻辑上的“模型副本”或“计算单元”。当 cp_size > 1 时,你就有了多个这样的“模型副本”,每个副本负责处理长序列的一部分。而CP组,就是连接这些不同“模型副本”中角色相同的GPU,以便它们在序列维度上交换信息。
这种将CP视为对TP-DP-PP结构的复制和扩展的视角,极大地简化了对复杂四维并行配置的理解。
更多推荐


所有评论(0)