DeepSpeed
为什么需要分布式训练?
主要有两点:
- 对小模型而言训练速度更快
- 对大模型而 言,其所需内存太大,单机装不下
分布式训练的加速
这个就很直观了,对于一些单卡可以装载的模型我们可以通过多个卡数据并行的方法训练,然后把一轮数据算出来的梯度求和更新参数进行下一轮的梯度下降
这个范式比较经典的例子就是Parameter Server
大模型的内存开销
比如一个 1.5B参数的GPT-2模型,我们用代表这个参数量的数量,那么在FP16的精度(单个参数大小16bit ,或者2Byte )下模型本身达到了
如果是推理,那么模型的加载确实只需要这些参数,推理过程中再算上输入embedding占用的额外参数便是需要的所有内存
但如果是训练,那么就麻烦了,我们用DeepSpeed论文中Adam Optimizer+混合精度训练作为例子。模型在训练过程中需要储存自身的参数和梯度(注意这里还不是Adam最后算出来的参数更新量,只是根据loss反向传播得到的原始梯度),这便需要 的内存,同时混合精度fp32训练时,Adam需要一份fp32大小的模型拷贝,momentum和variance去储存模型的优化器状态,这需要 ,最终我们需要的内存用于训练,即对于一个3GB的GPT-2模型,我们训练时需要24GB的内存,对比一张V100的显存为32GB
不难看出,一个GPT-2模型的训练就能吃光V100的显存了,对于175B的GPT-3的训练,哪怕是目前的H100(显存188GB)也无法单卡装载。因此对于这类大模型只能通过张量并行等方式训练,比如后面会介绍的Megatron和DeepSpeed。