淘天集团联合爱橙科技开源大模型训练框架Megatron-LLaMA

9月12日,淘天集团联合爱橙科技正式对外开源大模型训练框架——Megatron-LLaMA,旨在让技术开发者们能够更方便地提升大语言模型训练性能,降低训练成本,并保持和LLaMA社区的兼容性。测试显示,在32卡训练上,相比HuggingFace上直接获得的代码版本,Megatron-LLaMA能够取得176%的加速;在大规模的训练上,Megatron-LLaMA相比较32卡拥有几乎线性的扩展性,且对网络不稳定表现出高容忍度。

目前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的反向流程优化

3.1 DeepSpeed ZeRO Stage-2

图片

DeepSpeed ZeRO是微软推出的一套分布式训练框架,有着非常深远的技术影响。DeepSpeed ZeRO Stage-2(后文简称ZeRO-2)是其中一项重要技术,能够节约显存占用,且不增加额外计算量和通信量。

如上图所示,由于计算需要,每个Rank都需要拥有全部的参数。但对于优化器状态而言,每个Rank只需负责其中一部分即可,不必所有Rank同时执行完全重复的操作。于是ZeRO-2提出将优化器状态均匀地切分在每个Rank上(注意,这里并不需要保证每个变量被均分或完整保留在某个Rank上),每个Rank在训练进程中只负责对应部分的优化器状态和模型参数的更新。在这种设定下,梯度也可以按此方式进行切分。

默认情况下,ZeRO-2在反向时在所有Rank间使用Reduce方式聚合梯度,而后每个Rank只需要保留自身所负责参数的部分,既消除了冗余的重复计算,又降低了显存占用。

3.2 Megatron-LM DistributedOptimizer

图片

原生Megatron-LM通过DistributedOptimizer实现了类似ZeRO-2的梯度和优化器状态切分,以减少训练中的显存占用。

如上图所示,DistributedOptimizer在每次获得预设的梯度聚合过的所有梯度后,通过ReduceScatter算子,将之前累积的全部梯度分发到不同的Rank。每个Rank只获得自己需要处理的部分梯度,而后进行优化器状态的更新和对应参数的更新。最后各个Rank通过AllGather的方式从其他节点上获取更新过的参数,最终取得全部的参数。

实际训练的结果显示,Megatron-LM的梯度和参数通信与其他计算串行进行,对于大规模预训练任务,为了保证总批数据大小不变,通常无法开启较大的GA。于是通信占比会伴随机器增加上升,这时候串行通信的特点导致扩展性很弱。在社区内,这方面的需求也很迫切。

图片

3.3 Megatron-LLaMA OverlappedDistributedOptimizer

为了解决上述问题,Megatron-LLaMA改进了原生Megatron-LM的DistributedOptimizer,使其梯度通信的算子能够可以和计算相并行。特别的,相比于ZeRO的实现,Megatron-LLaMA在并行的前提下,通过巧妙的优化优化器分区策略,使用了更具有具有扩展性的集合通信方式来提升扩展性。

OverlappedDistributedOptimizer的主要设计保证了如下几点:

  • 单一集合通信算子数据量足够大,充分利用通信带宽;

  • 新切分方式所需通信数据量应等于数据并行所需的最小通信数据量;

  • 完整参数或梯度与切分后的参数或梯度的转化过程中,不能引入过多显存拷贝。

图片

具体而言,Megatron-LLaMA改进了DistributedOptimizer的机制,提出了OverlappedDistributedOptimizer,用于结合新的切分方式优化训练中的反向流程。如上图所示,在OverlappedDistributedOptimizer初始化时,会预先给所有参数分配其所属的Bucket。Bucket中的参数是完整的,一个参数仅属于一个Bucket,一个Bucket中可能有多个参数。

逻辑上,每个Bucket将会被连续等分成P(P为数据并行组的数量)等份,数据并行组中的每个Rank负责其中的一份。Bucket被放置在一个本地队列(Local grad bucket queue)中,从而保证通信顺序。在训练计算的同时,数据并行组间以Bucket为单位,通过集合通讯交换各自需要的梯度。Megatron-LLaMA中Bucket的实现尽可能采用了地址索引,只在有需要值更改时才新分配空间,避免了显存浪费。

上述的设计,再结合大量的工程优化,使得在大规模训练时,Megatron-LLaMA可以充分使用硬件,实现了比原生Megatron-LM更好的加速。从32张A100卡扩展到512张A100卡的训练,Megatron-LLaMA在常用混部的网络环境中仍然能够取得0.85的扩展比。

四、Megatron-LLaMA的未来计划

目前Megatron-LLaMA在淘天集团和爱橙科技内部已有广泛的应用,开源后团队也将持续维护推进。随着越来越多开发者涌入开源社区交流贡献,相信未来在训练框架层面会有更多的挑战和机会。Megatron-LLaMA将会紧密关注社区的发展,与广大开发者共同探索以下方向:

  • 自适应最优配置选择

  • 更多模型结构或局部设计改动的支持

  • 在更多不同类硬件环境下的极致性能训练解决方案

欢迎试用Megatron-LLaMA,一起开启高效驯养LLaMA的精彩旅程!

项目地址:

https://github.com/alibaba/Megatron-LLaMA

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/139075.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

pytorch环境搭建到pycharm项目映射配置(成功后回顾性记录/自用)

利用Anaconda创建pytorch虚拟环境 前提:成功安装Anaconda,确保可以打开NVIDIA控制面板 开始-》搜索“Anaconda Prompt” 打开后输入:conda create -n 你的虚拟环境名 python3.9。输入y,继续安装,完成。 输入&#…

【STM32学习】I2C通信协议 | OLED屏

🐱作者:一只大喵咪1201 🐱专栏:《STM32学习》 🔥格言:你只管努力,剩下的交给时间! 今天需要将代码烧录到开发板中,本喵默认大家都会创建工程,以及进行基本的…

A股风格因子看板 (2023.09 第07期)

该因子看板跟踪A股风格因子,该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子,用以分析市场风格切换、组合风格景露等。 今日为该因子跟踪第7期,指数组合数据截止日2023-08-31,要点如下 近1年A股风格因子收益走…

【ELFK】之消息队列kafka

一、kafka的定义 Kafka 是一个分布式的基于发布/订阅模式的消息队列(MQ,Message Queue),主要应用于大数据实时处理领域。Kafka 是最初由 Linkedin 公司开发,是一个分布式、支持分区的(partition&#xff0…

ImageJ查看图像灰度值矩阵及像素编号从0开始

ImageJ查看图像灰度值矩阵 imagej打开一幅图像 然后image —— transform——image to results,等一下就会出现灰度值矩阵 我读取的如下,可以看出,imagej对像素的编号是从0开始的,切记!!!跟C/…

编译原理.龙书学习1

第一章: 编译器:将程序翻译成一种能够被计算机执行的形式 解释器:解释器直接利用用户提供的输入执行源程序中指定的操作 一个编译器的结构 编译器将源程序映射为语义上等价的目标程序,这个映射过程由两部分组成:分析…

MyBatis友人帐之ResultMap及分页

一、ResultMap 1.1查询为null问题 要解决的问题&#xff1a;属性名和字段名不一致 解决方案 方案一&#xff1a;为列名指定别名 , 别名和java实体类的属性名一致 . <select id"selectUserById" resultType"User">select id , name , pwd as passwor…

【PyTorch 攻略 (4/7)】张量和梯度函数

一、说明 W在训练神经网络时&#xff0c;最常用的算法是反向传播。在该算法中&#xff0c;参数&#xff08;模型权重&#xff09;根据损失函数相对于给定参数的梯度进行调整。损失函数计算神经网络产生的预期输出和实际输出之间的差异。 目标是获得尽可能接近零的损失函…

QUIC协议报文解析(三)

在前面的两篇文字里我们简单介绍了QUIC的发展历史&#xff0c;优点以及QUIC协议的连接原理。本篇文章将会以具体的QUIC报文为例&#xff0c;详细介绍QUIC报文的结构以及各个字段的含义。 早期QUIC版本众多&#xff0c;主要有谷歌家的gQUIC&#xff0c;以及IETF致力于将QUIC标准…

打印由数字组成的金字塔图案——python

1222 33333 4444444 555555555打印由数字组成的金字塔图案。但n9时&#xff0c;如下图所示。 输入格式: 输入一个整数n&#xff08;1<A<9&#xff09;。 输出格式: 输出由数字组成的金字塔图案。 输入样例: 在这里给出一组输入。例如&#xff1a; 5输出样例: 在这…

【 2023华为杯C题】大规模创新类竞赛评审方案研究(思路、代码......)

目录 1 题目概述 2 问题 3 极差的定义及标准分的计算方法 4 题目及数据下载 5 思路、代码下载...... 1 题目概述 现在创新类竞赛很多&#xff0c;其中规模较大的竞赛&#xff0c;一般采用两阶段&#xff08;网评、现场评审&#xff09;或三阶段&#xff08;网评、现场评审…

高效畅通的iOS平台S5配置指南

在iOS平台上&#xff0c;使用S5代理ip访问互联网是一种非常有用的技巧。无论是为了保证隐私安全&#xff0c;还是解决网络限制问题&#xff0c;S5代理ip都能为您提供更快、更稳定的互联网访问体验。本文将为您详细介绍如何在iOS平台上配置和使用S5代理ip&#xff0c;让您的网络…

git之撤销工作区的修改和版本回溯

有时候在工作区做了一些修改和代码调试不想要了,可如下做 (1)步骤1:删除目录代码,确保.git目录不能修改 (2)git log 得到相关的commit sha值 可配合git reflog 得到相要的sha值 (3)执行git reset --hard sha值,可以得到时间轴任意版本的代码 git reset --hard sha值干净的代…

【Java 基础篇】Java网络编程实战:P2P文件共享详解

Java网络编程是现代软件开发中不可或缺的一部分&#xff0c;因为它允许不同计算机之间的数据传输和通信。在本篇博客中&#xff0c;我们将深入探讨Java中的P2P文件共享&#xff0c;包括什么是P2P文件共享、如何实现它以及一些相关的重要概念。 什么是P2P文件共享&#xff1f; …

23个销量最高的3D扫描仪【2023】

如果你可以 3D 扫描它&#xff0c;你就可以 3D 打印它。 市场上 3D 扫描仪的种类和质量非常丰富&#xff0c;机器尺寸、功能和价格各异。 这样的选择虽然本身是一件很棒的事情&#xff0c;但也会让从无用的东西中挑选出宝石成为一件苦差事。 推荐&#xff1a;用 NSDT编辑器 快速…

HTTP各版本差异

HTTP1.0 无法复用连接 HTTP1.0为每个请求单独新开一个TCP连接 #mermaid-svg-9N3exXRS4VvT4bWF {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-9N3exXRS4VvT4bWF .error-icon{fill:#552222;}#mermaid-svg-9N3exXRS…

Reinforcement Learning(二)--on-policy和off-policy

1.前言 强化学习&#xff08;Reinforcement learning&#xff0c;RL&#xff09;是机器学习的一个分析&#xff0c;特点是概念多、公式多、入门门槛高&#x1f972;&#xff08;别问我怎么知道的&#xff09;。本篇文章着重讲解RL最重要的概念之一&#xff0c;即on-policy和of…

2023工博会强势回归!智微工业携八大系列重磅亮相

中国国际工业博览会&#xff08;简称"中国工博会"&#xff09;自1999年创办以来&#xff0c;历经二十余年发展创新&#xff0c;通过专业化、市场化、国际化、品牌化运作&#xff0c;已发展成为通过国际展览业协会&#xff08;UFI&#xff09;认证、中国工业领域规模最…

mybatis/mp批量插入非自增主键数据

文章目录 前言一、mp的批量插入是假的二、真正的批量插入1.利用sql注入器处理2.采用自编码,编写xml批量执行生成内容如下: 三 问题问题描述问题原因问题解决粘贴一份,兼容集合替换原有文件 总结自增与非自增区别: 前言 mybatis/mp 在实际开发中是常用的优秀持久层框架,但是在非…

Linux:GlusterFS 集群

GlusterFS介绍 1&#xff09;Glusterfs是一个开源的分布式文件系统,是Scale存储的核心,能够处理千数量级的客户端.在传统的解决 方案中Glusterfs能够灵活的结合物理的,虚拟的和云资源去体现高可用和企业级的性能存储. 2&#xff09;Glusterfs通过TCP/IP或InfiniBand RDMA网络链…