自从 GPT 模型诞生以来,其参数规模就在不停地扩大。但模型并非简单的直接变大,需要在数据、调度、并行计算、算法和机器资源上做相应的改变。
今天就来总结下,什么是大模型,模型变大的难在哪里以及对于 CV/NLP 或者搜推广场景上有什么应对策略。
什么是大模型?
大模型,顾名思义主打的就是'大'。主要包括以下几个方面:
- 数据规模大:通过大量的数据提高模型的泛化能力和性能。高质量的数据集是训练高性能大模型的基础。
- 大规模并行计算能力:随着计算硬件的不断进步,如 GPU 和 TPU 的普及,大规模并行计算能力的提升使得训练和推理大模型成为可能。
- 更'大'模型复杂性:大模型具备更深层次、更复杂的网络结构,可以捕捉更丰富的特征和关系,提高了模型的表达能力。
大模型主要分为两类:一个是稀疏大模型,另一个是稠密大模型。
- 稀疏大模型:稀疏大模型是指模型中存在大量稀疏参数的情况,一般是搜索、推荐、广告类任务。它的特点是海量样本及大规模稀疏参数(sparse embeddings),适合使用 CPU/GPU 参数服务器模式(PS)进行训练。
- 稠密大模型:稠密大模型是指模型中的参数大多数都是非零值,没有明显的稀疏性特征,一般是 CV、NLP 任务。它的特点是常规样本数据及大规模稠密参数,它适合用纯 GPU 集合通信模式(Collective)进行训练。
对于搜推广类的稀疏大模型来说,一般包含稀疏特征的嵌入(embedding)和稠密模型两个部分。
其中,稀疏特征的嵌入计算是稀疏大模型的关键,而稠密模型部分一般往往较小,可以放到一个 GPU 内,因此可以进行 data 并行以及 all reduce 通讯。
在训练中,需要在特征嵌入表(embedding table)上需要进行复杂的查找、排列等操作,然后生成张量再做稠密模型的计算。
而特征嵌入表往往会占用非常大的存储空间,需要很多台 GPU 服务器才能完整存放,这就是典型的 tensor 并行。
在这样的场景下,就会导致典型的 alltoall 的通讯模式,而 alltoall 通讯会带来严重的 incast 通讯(多打一),进而带来网络拥塞,给网络架构、拥塞控制协议、负载均衡算法等都提出了很高的要求。
对于 CV、NLP 任务来说,由于模型参数非常多,远远超过了单个 GPU 显存所能容纳的空间(例如 NVIDIA 最新的 A100 也就是 80GB 显存)。
所以往往既需要对模型某一层的 tensor 并行,也需要不同层之间的 pipeline 并行,才能放得下整个大模型。
在计算过程中,既有单机内通讯,也有不同机器间的通讯,具体的通讯模式取决于模型的切分和放置方法。
为了加速训练过程,往往完整的大模型之间也会采用 data 并行,每一个完整的大模型会被投喂不同的训练数据,这就会导致大家熟悉的 allreduce 通信模式。
总结起来,稠密大模型和稀疏大模型在模型特征上有着明显的差异,对计算/存储/通信资源的需求也存在明显的不同。
要达到 GPU 算力资源的最大化利用和最好的加速效果,需要结合模型特征和实现方式对 GPU 服务器架构、网络架构、训练数据存储和拉取、分布式训练框架进行全局的考量和设计。
模型大了难在哪里?
大模型带来的挑战主要有两点:海量样本、参数(万亿级别)和较长的收敛时间。
别看只有这区区两点,它会衍生出很多要解决的问题。
1. 大模型训练需要更大的算力。
大模型训练所需的总算力,其实很简单,公式为:6 × 模型的参数量 × 训练数据的 token 数 = 所有训练数据过一遍所需的算力。这里的 6 就是每个 token 在模型正向传播和反向传播的时候所需的乘法、加法计算次数。
一堆矩阵相乘,简单来想就是左边若干个神经元,右边若干个神经元,组成一个完全二分图。选出其中任意一个左边的神经元 L 和右边的神经元 R。
- 正向传播的时候:L 把它的输出乘上 L 和 R 之间的权重 w,发给 R;R 不可能只连一个神经元吧,总要把多个 L 的加到一起,这就是 reduce,需要一次加法。
- R 把它收到的梯度乘上 L 和 R 之间的权重 w,发给 L;L 也不可能只连一个 R,需要把梯度 reduce 一下,做个加法;别忘了权重 w 需要更新,那就要计算 w 的梯度,把 R 收到的梯度乘上 L 正向传播的输出(activation);一个 batch 一般有多个 sample,权重 w 的更新需要把这些 sample 的梯度加到一起。
- 一共 3 次乘法,3 次加法,不管 Transformer 多复杂,矩阵计算就是这么简单,其他的向量计算、softmax 之类的都不是占算力的主要因素,估算的时候可以忽略。
有了模型训练所需的总算力,除以每个 GPU 的理论算力,再除以 GPU 的有效算力利用比例,就得到了所需的 GPU-hours。


