淘天集团和爱橙科技于9月12日正式发布了开源的大模型训练框架——megatron-llama。该框架的目标是使技术开发者能够更方便地提升大语言模型的训练性能,降低训练成本,并与llama社区保持兼容性。测试结果显示,在32卡训练上,与在huggingface上直接获取的代码版本相比,megatron-llama能够实现176%的加速;在大规模训练上,megatron-llama几乎线性扩展,且对网络不稳定表现出较高的容忍度。目前,megatron-llama已在开源社区上线
开源地址:https://github.com/alibaba/megatron-llama
大语言模型的卓越表现一次又一次地超出了人们的想象。在过去几个月里,llama和llama2向开源社区全面开放,为那些想要训练自己的大语言模型的人们提供了一个很好的选择。在开源社区中,已经有很多基于llama开发的模型,包括续训/sft(如alpaca、vicuna、wizardlm、platypus、stablebegula、orca、openbuddy、linly、ziya等)和从零开始训练(如baichuan、qwen、internlm、openllama)的工作。这些工作不仅在各种大模型能力客观评测榜单上表现出色,同时也展示了在长文本理解、长文本生成、代码编写、数学求解等实际应用场景中的出色性能。此外,业界还出现了许多有趣的产品,例如llama结合whisper的语音聊天机器人、llama结合stable diffusion的绘画软件,以及医学/法律领域的辅助咨询机器人等
尽管从 huggingface 上可以拿到 llama 的模型代码,但用自己的数据训一个 llama 模型对个人用户或中小型组织并不是一件低成本且简单的工作。大模型的体积和数据的规模,使得在普通的计算资源上无法完成有效的训练,算力和成本成为严重的瓶颈。megatron-lm 社区的用户在这方面的诉求非常急迫。
淘天集团和爱橙科技在大模型应用上有着非常广阔应用场景,在大模型的高效训练上进行了非常多的投入。llama 的问世,在数据处理、模型设计、微调及强化学习反馈调整等方面都给予了包括淘天集团和爱橙科技在内的许多公司非常多的启示,也助力业务应用场景取得了新的突破。因此,为了回馈整个 llama 开源社区、促进中文预训练大模型开源社区的发展,让开发者们能够更方便地提升大语言模型的训练性能,降低训练成本,淘天集团联合爱橙科技将部分内部优化技术开源,发布 megatron-llama,期望与每一位合作伙伴共建 megatron 及 llama 生态。
megatron-llama 提供了一套标准的 megatron-lm 实现的 llama,并提供了与 huggingface 格式自由切换的工具,方便与社区生态工具兼容。megatron-llama 重新设计了 megatron-lm 的反向流程,使得无论在节点数较少需要开较大梯度聚合(gradient accumulation, ga)、或是节点数较多必须使用小 ga 的场景,都能够取得卓越的训练性能。
在 32 卡训练上,相比 huggingface 上直接获得的代码版本,megatron-llama 能够取得 176% 的加速;即便是采用 deepspeed 及 flashattention 优化过的版本,megatron-llama 仍然能减少至少 19% 的训练时间。在大规模的训练上,megatron-llama 相比较 32 卡拥有着几乎线性的扩展性。例如使用 512 张 a100 复现 llama-13b 的训练,megatron-llama 的反向机制相对于原生 megatron-lm 的 distributedoptimizer 能够节约至少两天的时间,且没有任何精度损失。megatron-llama 对网络不稳定表现出高容忍度。即便是在现在性价比较高的 4x200gbps 通信带宽的 8xa100-80gb 训练集群(这种环境通常是混部环境,网络只能使用一半的带宽,网络带宽是严重的瓶颈,但租用价格相对低廉)上,megatron-llama 仍然能取得 0.85 的线性扩展能力,然而在这个指标上 megatron-lm 仅能达到不足 0.7。megatron-lm 技术带来的高性能 llama 训练机会llama是目前大语言模型开源社区中一项重要的工作。llama在llm的结构中引入了bpe字符编码、rope位置编码、swiglu激活函数、rmsnorm正则化以及untied embedding等优化技术,在许多客观和主观评测中取得了卓越的效果。llama提供了7b、13b、30b、65b/70b的版本,适用于各类大模型需求的场景,也受到广大开发者的青睐。和许多其他开源大模型一样,由于官方只提供了推理版的代码,如何以最低成本开展高效训练,并没有一个标准的范式
megatron-lm 是一种优雅的高性能训练解决方案。megatron-lm 中提供了张量并行(tensor parallel,tp,把大乘法分配到多张卡并行计算)、流水线并行(pipeline parallel,pp,把模型不同层分配到不同卡处理)、序列并行(sequence parallel, sp,序列的不同部分由不同卡处理,节约显存)、distributedoptimizer 优化(类似 deepspeed zero stage-2,切分梯度和优化器参数至所有计算节点)等技术,能够显著减少显存占用并提升 gpu 利用率。megatron-lm 运营着一个活跃的开源社区,持续有新的优化技术、功能设计合并进框架中。
然而,开发基于megatron-lm并不简单,特别是在昂贵的多卡机器上进行调试和功能验证更是十分昂贵的。megatron-llama首先提供了一套基于megatron-lm框架实现的llama训练代码,支持各种规模的模型版本,并且可以简单地适配支持llama的各种变种,包括直接支持huggingface格式的tokenizer。因此,megatron-llama可以轻松应用于现有的离线训练链路中,无需进行过多的适配。在中小规模训练/微调llama-7b和llama-13b的场景中,megatron-llama能够轻松达到业界领先的54%以上的硬件利用率(mfu)
megatron-llama 的反向流程优化
需要重新书写的内容是:图示:deepspeed zero 阶段-2
deepspeed zero 是微软推出的一套分布式训练框架,其中提出的技术对很多后来的框架都有非常深远的影响。deepspeed zero stage-2(后文简称 zero-2)是该框架中一项节约显存占用且不增加额外计算量和通信量的技术。如上图所示,由于计算需要,每个 rank 都需要拥有全部的参数。但对于优化器状态而言,每个 rank 只负责其中的一部分即可,不必所有 rank 同时执行完全重复的操作。于是 zero-2 提出将优化器状态均匀地切分在每个 rank 上(注意,这里并不需要保证每个变量被均分或完整保留在某个 rank 上),每个 rank 在训练进程中只负责对应部分的优化器状态和模型参数的更新。在这种设定下,梯度也可以按此方式进行切分。默认情况下,zero-2 在反向时在所有 rank 间使用 reduce 方式聚合梯度,而后每个 rank 只需要保留自身所负责的参数的部分,既消除了冗余的重复计算,又降低了显存占用。
megatron-lm distributedoptimizer
原生 megatron-lm 通过 distributedoptimizer 实现了类似 zero-2 的梯度和优化器状态切分,以减少训练中的显存占用。如上图所示,distributedoptimizer 在每次获得预设的梯度聚合过的所有梯度后,通过 reducescatter 算子,将之前累积的全部梯度分发到不同的 rank。每个 rank 只获得自己需要处理的部分梯度,而后进行优化器状态的更新和对应参数的更新。最后各个 rank 通过 allgather 的方式从其他节点上获取更新过的参数,最终取得全部的参数。实际训练的结果显示,megatron-lm 的梯度和参数通信与其他计算串行进行,对于大规模预训练任务,为了保证总批数据大小不变,通常无法开启较大的 ga。于是通信占比会伴随机器增加上升,这时候串行通信的特点导致扩展性很弱。在社区内,这方面的需求也很迫切
megatron-llama overlappeddistributedoptimizer为了解决这一问题,megatron-llama 改进了原生 megatron-lm 的 distributedoptimizer,使其梯度通信的算子能够可以和计算相并行。特别的,相比于 zero 的实现,megatron-llama 在并行的前提下,通过巧妙的优化优化器分区策略,使用了更具有具有扩展性的集合通信方式来提升扩展性。overlappeddistributedoptimizer 的主要设计保证了如下几点:a) 单一集合通信算子数据量足够大,充分利用通信带宽;b) 新切分方式所需通信数据量应等于数据并行所需的最小通信数据量;c) 完整参数或梯度与切分后的参数或梯度的转化过程中,不能引入过多显存拷贝。
具体而言,megatron-llama对distributedoptimizer进行了改进,提出了overlappeddistributedoptimizer,用于在训练的反向流程中结合新的切分方式进行优化。如图所示,在初始化overlappeddistributedoptimizer时,会预先为所有参数分配它们所属的bucket。每个bucket中的参数是完整的,一个参数只属于一个bucket,一个bucket中可能有多个参数。在逻辑上,每个bucket将被连续地等分为p份(p为数据并行组的数量),数据并行组中的每个rank将负责其中的一份
bucket被放置在本地梯度桶队列中,以确保通信顺序。在进行训练计算的同时,数据并行组之间以桶为单位,通过集合通信交换各自所需的梯度。在megatron-llama中,bucket的实现尽可能地采用了地址索引,只有在需要更改值时才会分配新的空间,以避免显存浪费
通过结合大量的工程优化,上述设计使得在大规模训练时,megatron-llama能够充分利用硬件,实现比原生的megatron-lm更好的加速效果。在常用的网络环境中,将训练规模从32张a100卡扩展到512张a100卡,megatron-llama仍能够达到0.85的扩展比
megatron-llama 的未来计划megatron-llama是一个由淘天集团和爱橙科技共同开源并提供后续维护支持的训练框架,在内部已经得到广泛应用。随着越来越多的开发者加入llama的开源社区并贡献可供互相借鉴的经验,相信未来在训练框架层面会面临更多挑战和机会。megatron-llama将密切关注社区的发展,并与广大开发者共同推动以下方向的发展:
自适应最优配置选择更多模型结构或局部设计改动的支持在更多不同类硬件环境下的极致性能训练解决方案项目地址:https://github.com/alibaba/megatron-llama
以上就是32卡176%训练加速,开源大模型训练框架megatron-llama来了的详细内容。
