近年来,随着Transformer、MOE架构的提出,使得深度学习模型轻松突破上万亿规模参数,传统的单机单卡模式已经无法满足超大模型进行训练的要求。因此,我们需要基于单机多卡、甚至是多机多卡进行分布式大模型的训练。
而利用AI集群,使深度学习算法更好地从大量数据中高效地训练出性能优良的大模型是分布式机器学习的首要目标。为了实现该目标,一般需要根据硬件资源与数据/模型规模的匹配情况,考虑对计算任务、训练数据和模型进行划分,从而进行分布式存储和分布式训练。因此,分布式训练相关技术值得我们进行深入分析其背后的机理。
下面主要对大模型进行分布式训练的并行技术进行讲解,本系列大体分九篇文章进行讲解。
- 大模型分布式训练并行技术(一)-概述
- 大模型分布式训练并行技术(二)-数据并行
- 大模型分布式训练并行技术(三)-流水线并行
- 大模型分布式训练并行技术(四)-张量并行
- 大模型分布式训练并行技术(五)-序列并行
- 大模型分布式训练并行技术(六)-多维混合并行
- 大模型分布式训练并行技术(七)-自动并行
- github.com/microsoft/D…
- github.com/microsoft/D…
- github.com/hpcaitech/C…
- github.com/hpcaitech/C…
大模型混合精度训练 FP16 与 BF16 的对比
目前,进行大模型训练的时候,为了节约显存,混合精度训练基本上已经成为了标配。而FP16混合精度已经成为主流大规模模型训练框架的默认选项,用于训练十亿到百亿规模的模型。但是用 FP16 训练巨型 LLM 模型却是一个禁忌,它将面临更多的稳定性挑战。
FP16 会经常溢出,导致数值不稳定、模型不收敛的情况!
为了避免溢出,这意味着你的权重必须保持很小。一种称为损失缩放 (loss scaling) 的技术有助于缓解这个问题,但是当模型变得非常大时,FP16 较小的数值范围仍然是一个问题。因此,你需要采用一些训练策略来稳定巨型模型的训练。
作为补救措施,NVIDIA Ampere GPU 提供了BF16浮点格式来缓解FP16的问题。但目前,但目前,BF16在一些平台上不被支持(因此,它的使用的可能广泛性会被限制)。当使用 BF16 时,BF16 为指数保留了 8 位 (与 FP32 相同),为小数保留了 7 位。这意味着使用 BF16 我们可以保留与 FP32 相同的动态范围。但代价就是它的精度非常差(相对于 FP16,损失了 3 位精度)。但是在训练时,采用的随机梯度下降法及其变体,该方法有点像蹒跚而行,如果你这步没有找到完美的方向其实没关系,你会在接下来的步骤中纠正自己。无论使用 BF16 还是 FP16,都有一个权重副本始终在 FP32 中 —— 这是由优化器更新的内容。 16 位格式仅用于计算,优化器以全精度更新 FP32 权重,然后将它们转换为 16 位格式以用于下一次迭代。因此,不会发生精度损失。
虽然,之前有一些巨型大模型使用了 FP16 进行混合进行训练,但是从OPT-175、Bloom-176B、GLM130B的训练报告来看,BF16 是更佳的一个解决方案,可以规避很多不必要的烦恼。
结语
本文对本系列文中谈到的一些分布式并行技术进行了简要的总结,以加深对其的理解。
本系列文章更新到此为止,完结,撒花~~
码字不易,如果觉得我的文章能够能够给您带来帮助,期待您的点赞收藏加关注~~