大模型并行策略如今已经成为了大模型优化的主要技术手段,如今随着大模型规模的越来越大,模型参数也变得越来越多,单台设备或者单机已经无法容纳下模型的全部参数,目前大模型的内存占用主要分为以下几个部分:
1 模型的权重参数
2 反向传播时的梯度
3 优化器所使用的显存
4 正向传播的中间状态
其中1,2,3被称为模型的静态内存,而中间状态被称为模型的动态内存。大模型训练的权重参数以及使用Adam等优化器产生的梯度信息,以及在正向传播的中间状态时会产生大量的内存占用。GPT-3 有1750亿个参数,而类似的超大模型会进一步增长到上万亿参数,每次前向和反向传播的计算量随模型规模成倍增加。由于需要处理更多的参数和更大的数据集,训练时间线性甚至指数增长。如果不并行化,可能需要几个月甚至几年完成一次完整的训练。并且如今大模型训练需要海量的训练数据作为支撑,如 GPT-3 使用了 570GB 的文本数据,扩展到更大的模型时,数据量进一步增加。处理如此大规模的数据需要更快的处理能力和更高的吞吐量。
因此采用并行策略主要有以下几个优点:
1 通过并行策略将计算任务分散到多个设备上并行处理,可以显著缩短时间。
2 将数据划分到多个设备,并行加载和处理,提升数据处理效率。
3 优化设备间的负载分配,提升集群资源利用率。
数据并行(DP)
每个设备或者worker上有一个完整的模型副本。将输入的数据集进行分片,每个worker或者设备处理分片的数据。worker定期汇总它们的梯度,以确保所有worker看到一个一致的权重版本。 由于每个worker或者设备只处理一部分数据,因此显存的需求也随之降低。 数据并行中,每个worker或者设备经过部分数据集训练出新的权重参数,此时需要将所有worker或设备上的权重参数进行一次All-reduce,然后进行下一轮的迭代。
数据并行的优缺点主要有以下几个方面:
优点:
- 实现简单,通常只需同步梯度。
- 常用于中小型模型的训练。
缺点:
- 模型参数需要完整地复制到每个设备,限制了处理超大模型的能力。
张量并行(TP)
张量并行,就是将模型参数的某一层进行拆分,并把不同部分分配到不同的GPU上,以降低显存消耗,一般在主机内部。 可以把张量并行理解成矩阵分块运算:
分别将A1,A2放置在两张卡上。两张卡分别计算Y1=X*A1和Y2=X*A2。计算完成后,通过AllGather操作,获取其它卡上的计算结果,拼接在一起得到最终的结果矩阵Y。 通过将单卡显存无法容纳的矩阵A拆分,放置在两张卡上,并通过多卡间通信,即可得到的最终结果。
张量并行的优缺点主要有以下几个方面:
优点:
- 适合训练单个设备无法容纳的超大模型。
缺点:
- 设备间通信较频繁,容易成为瓶颈。
- 实现复杂,尤其是在前向与反向传播时的依赖管理。
流水线并行(PP)
流水线并行就是将模型不同层的参数进行分割,将模型的不同层放置到不同的GPU中,降低单个GPU的 内存消耗,从而实现大模型的训练。 流水线并行和张量并行的区别在于,流水线并行是将模型的不同层拆分到不同设备上,所以流水线并行是层间并行。张量并行属于层内并行,采用张量并行的训练过程中频繁地同步梯度信息,因此可能会涉及比较多的all-reduce操作
优点:
- 提高了设备利用率,特别是在深度模型中。
缺点:
- 增加了数据传输延迟。
- 难以优化流水线的效率,容易产生空泡现象(Bubble)
DP,TP,PP三者之间的关系
DP数 * TP数 * PP数 = 总的GPU卡数
以8机8卡的分布式集群环境(每台机器8张卡,即总共有64张卡)为例: 设置TP=4,PP=1,由于是8机8卡,即总卡数是64张卡。
那么DP = 64 / 4 = 16。TP = 4意味着每台机器上的4张GPU构成一个张量组,一台机器上有8张GPU,所以一台机器上构成两个张量组。也就是说一台机器的4张GPU拥有整个模型的全部参数,而一台机器有8张GPU,因此一台机器就有同样的两份模型参数。 而总共有有8台机器,因此集群就有16份同样的模型参数,也就是DP=16。整个集群有16组数据并行。即所有的训练数据会被拆成16份,每一份数据输入给这16个DP组,同时对模型进行训练。