

AI 计算中涉及到的很多具体算法(例如矩阵相乘、卷积、循环层、梯度运算等),都需要基于成千上万的 GPU,以并行任务的方式去完成。这样才能有效缩短计算时间。
AI 训练使用的并行,总的来说,分为数据并行和模型并行两类。刚才说的 PP(流水线并行)、TP(张量并行)和 EP(专家并行),都属于模型并行,待会再介绍。
这里,我们需要先大概了解一下神经网络的训练过程。简单来说,包括以下主要步骤:
2、计算损失:通过损失函数比较预测结果与线、反向传播:将损失值反向传播,计算网络中每个参数的梯度。
数据并行是大模型训练中最为常见的一种并行方式(当然,也适用于推理过程)。
它的核心思想很简单,就是每个 GPU 都拥有完整的模型副本,然后,将训练数据划分成多个小批次(mini-batch),每个批次分配给不同的 GPU 进行处理。
2、各 GPU 都拥有一样的模型以及模型参数,它们各自独立进行前向传播、反向传播,计算得到各自的梯度;
3、各 GPU 通过卡间通信,以 All-Reduce 的通信方式,将梯度推给一个类似管理者的 GPU(Server);
5、Server GPU 将全局梯度回传(broadcast 广播)到每个 Worker GPU,进行参数更新(更新本地模型权重)。更新后,所有 worker GPU 模型参数保持一致。
数据并行的优点,在于实现过程比较简单,能够显著加速大规模数据的训练过程,尤其适用于数据量远大于模型参数的场景。
数据并行的缺点,在于显存的限制。因为每个 GPU 上都有完整的模型副本,而当模型的规模和参数越大,所需要的显存就越大,很可能超过单个 GPU 的显存大小。
数据并行的通信开销也比较大。不同 GPU 之间需要频繁通信,以同步模型参数或梯度。而且,模型参数规模越大,GPU 数量越多,这个通信开销就越大。例如,对于千亿参数模型,单次梯度同步需传输约 2TB 数据(FP16 精度下)。
在数据并行策略中,每个 GPU 的内存都保存一个完整的模型副本,很占内存空间。那么,能否每个 GPU 只存放模型副本的一部分呢?
没错,这就是 ZeRo—— 通过对模型副本中的优化器状态、梯度和参数进行切分,来实现减少对内存的占用。
值得一提的是,DP 还有一个 DDP(分布式数据并行)。传统 DP 一般用于单机多卡场景。而 DDP 能多机也能单机。这依赖于 Ring-AllReduce,它由百度最先提出,可以有效解决数据并行中通信负载不均(Server 存在瓶颈)的问题。
刚才数据并行,是把数据分为好几个部分。模型并行,很显然,就是把模型分为好几个部分。不同的 GPU,运行不同的部分。(注意:业界对模型并行的定义有点混乱。也有的资料会将张量并行等同于模型并行。)
流水线并行,是将模型的不同层(单层,或连续的多层)分配到不同的 GPU 上,按顺序处理数据,实现流水线式的并行计算。
乍一看,流水并行有点像串行。每个 GPU 需要等待前一个 GPU 的计算结果,可能会导致大量的 GPU 资源浪费。
为了解决上述问题,可以将 mini-batch 的数据进一步切分成 micro-batch 数据。当 GPU 0 处理完一个 micro-batch 数据后,紧接着开始处理下一个 micro-batch 数据,以此来减少 GPU 的空闲时间。如下图(b)所示:
对于流水线并行,需要对任务调度和数据传输进行精确管理,否则可能导致流水线阻塞,以及产生更多的 Bubble 时间。
如果说流水线并行是将一个模型按层「垂直」分割,那么,张量并行则是在一个层内「横向」分割某些操作。
张量切分方式分为按行进行切分和按列进行切分,分别对应行并行(Row Parallelism)(权重矩阵按行分割)与列并行(Column Parallelism)(权重矩阵按列分割)。
张量并行的缺点,是当切分维度较多的时候,通信开销比较大。而且,张量并行的实现过程较为复杂,需要仔细设计切分方式和通信策略。
专家并行(Expert Parallelism),是 MoE(混合专家模型)中的一种并行计算策略。它通过将专家(子模型)分配到不同的 GPU 上,实现计算负载的分布式处理,提高计算效率。
专家并行与之前所有的并行相比,最大的不同在于,输入数据需要通过一个动态的路由选择机制分发给相应专家,此处会涉及到一个所有节点上的数据重分配的动作。
然后,在所有专家处理完成后,又需要将分散在不同节点上的数据按原来的次序整合起来。
专家并行可能存在负载不均衡的问题。某个专家所接收到的输入数据大于了其所能接收的范围,就可能导致 Tokens 不被处理或不能被按时处理,成为瓶颈。
在实际应用中,尤其是训练万亿参数级别的超大模型时,几乎不会只使用单一的并行策略,而是采用多维度的混合并行(结合使用多种并行策略)。
数据并行 + 张量并行:数据并行处理批量样本,张量并行处理单样本的大矩阵计算。
流水线并行 + 专家并行:流水线并行划分模型层,专家并行划分层内专家模块。
更高级的,是 3D 并行,通过“数据并行 + 张量并行 + 流水线并行”,实现三重拆分,是超大模型训练的主流方案。
好啦,以上就是关于 DP、PP、TP、EP 等并行训练方式的介绍。大家都看懂了没?
并行计算方式其实非常复杂,刚才我们只是做了最简单的介绍。但在真实工作中,开发者无需了解具体的实现细节,因为业界提供了例如 DeepSpeed(微软开源,支持 3D 并行 +ZeRO 内存优化)、Megatron-LM(NVIDIA开源,3D 并行的标杆)、FSDP 等开源软件,能够让开发者直接进行大语言模型训练。
小枣君之所以要专门介绍并行训练方式,其实更多是为了帮助大家深入地理解算力集群架构和网络的设计。
比如说,数据并行,由于需要频繁同步梯度信息,对网络带宽要求较高,需要确保网络带宽能够满足大量梯度数据快速传输的需求,避免因带宽不足导致通信延迟,影响训练效率。
流水线并行,大模型的每一段,在不同的服务器上以流水线的方式逐步计算,涉及到多个服务器“串起来”,就建议部署在比较靠近的服务器上(尽量部署在叶脊网络的同一个 leaf 叶下)。
张量并行,通信数据量大,就建议部署在一台服务器的多个 GPU 上进行计算。
专家并行中,不同专家分配在不同 GPU 上,GPU 间需要交换中间计算结果等信息,其通信流量特点取决于专家的数量以及数据交互的频率等,也需要合理规划 GPU 间的连接方式和通信路径。
随着 AI 浪潮的继续发展,以后是否还会出现其它的并行训练方式呢?让我们拭目以待吧!