大语言模型基础之‘可扩展的训练技术‘(二)
📌上篇介绍了3D并行训练,本篇主要介绍三块内容:零冗余优化器、激活重计算、混合精度训练。那么开始吧!🔅🔅🔅。
📌上篇介绍了3D并行训练,本篇主要介绍三块内容:零冗余优化器、激活重计算、混合精度训练。
那么开始吧! 🔅🔅🔅
✅零冗余优化器(Zero Redundancy Optimizer, ZeRO)
该技术由 DeepSpeed 代码库提出,主要用于解决数据并行中的模型冗余问题,即每张 GPU 均需要复制一份模型参数。
如上图所示,在数据并行中,每张 GPU 都需要复制一份模型参数,包括模型参数和优化器参数。对于每个GPU来讲,在模型传播到某一层时,其他层的模型和优化器参数并不参与计算,这导致了严重的显存占用过高(冗余)的问题,同时也限制了每个GPU可支持的前向传播数据量。
🔍如何解决这个问题呢?
📝ZeRO技术仅在每个 GPU 上保留部分模型参数和优化器参数,当需要时再从其它 GPU 中读取,从而减少了显存占用。
如上图所示,模型被均分在两张 GPU 上,当需要使用“层1”计算时,两张卡分别从对方获取相应模型参数进行计算,使用完之后便可以释放相应显存,从而减少了显存占用。
🔍ZeRO有三种逐步细化模型参数和优化器参数的方案:
- ZeRo-1:仅优化器参数在所有GPU上平摊,模型参数和模型梯度在每张GPU上独立存储。
- ZeRo-2:优化器参数和模型梯度在所有 GPU 上平摊,模型参数在每张GPU上独立存储。
- ZeRo-3:优化器参数、模型梯度和模型参数在所有 GPU 上平摊。
ZeRo三种优化方案,需要先介绍模型参数量计算,故暂时放后边再细讲~敬请期待
✅激活重计算(Activation Recomputation)
激活重计算是一种通过在反向传播过程中重新计算激活值来减少显存占用的技术。
🔍如何具体一点解释呢?
🔒在前向传播过程中会计算每一层的激活值,并将这些激活值存储在显存中。因此,这些激活值会占用大量的显存资源。
🔑为了减少显存占用,激活重计算技术在前向传播过程中仅保留部分的激活值,然后在反向传播时重新计算这些激活值,从而避免了显存占用。但是如此操作也会引入额外的计算量。
🔗技巧:在大模型的训练中,激活重计算技术常见的方式是将Transformer的每一层的输入保存下来,在反向传播时再计算对应层内的激活值。
✅混合精度训练(Mixed Precision Training)
📜‘远古’时期的预训练模型主要使用单精度浮点数-FP32来表示模型参数并计算的,但随着模型规模的增大,显存占用也变得越来越大,因此混合精度训练技术应运而生。
📖该技术同时使用半精度浮点数-FP16(2字节)和单精度浮点数-FP32(4字节)进行,达到了显存减半、效率翻倍的效果。
🔽详细解释一下:
为保证精度,需要保留原始F32精度的模型参数副本。但在训练过程中,会先将F32精度的模型参数转换为FP16精度的模型参数,随后以FP16精度进行前向传播和反向传播等操作,最后再参数更新时再对F32精度的模型参数进行优化。由于最耗时的是前向和反向传播,因此混合精度训练可以显著提高训练速度。
PS:BF16小知识点
半精度浮点数-FP16,其包括1位符号位、5位指数位、10位尾数位,共16位,表示范围为-65504~65504。
而谷歌提出了新的半精度浮点数-BF16,其包括1位符号位、8位指数位、7位尾数位,共16位,表示范围可以达到 10^38 数量级。
相比FP16,BF16的表示范围更大,已被大模型广泛使用。当前硬件支持的也不错,主流的显卡也都基本支持16位计算单元运算,包括NVIDIA的A100。
做个记录分享,也希望给有需要的同学一点点帮助,我也在学习中。
更多推荐



所有评论(0)