首页 > 其他分享 >DeepSpeed: 大模型训练框架 | 京东云技术团队

DeepSpeed: 大模型训练框架 | 京东云技术团队

时间:2023-10-26 12:02:51浏览次数:35  
标签:DeepSpeed 框架 训练 模型 Zero GPU 京东 CPU 分布式

背景:

目前,大模型的发展已经非常火热,关于大模型的训练、微调也是各个公司重点关注方向。但是大模型训练的痛点是模型参数过大,动辄上百亿,如果单靠单个GPU来完成训练基本不可能。所以需要多卡或者分布式训练来完成这项工作。

一、分布式训练

1.1 目前主流的大模型分布式训练主要包括两种:

  • 数据并行训练
  • 模型并行训练

二、DeepSpeed

DeepSpeed是由Microsoft提供的分布式训练工具,旨在支持更大规模的模型和提供更多的优化策略和工具。对于更大模型的训练来说,DeepSpeed提供了更多策略,例如:Zero、Offload等。

2.1 基础组件

分布式训练需要掌握分布式环境中的基础配置,包括节点变化、全局进程编号、局部进程编号、全局总进程数、主节点等。这些组件都跟分布式训练紧密相关,同时组件之间也有非常大的联系,例如通信联系等。

2.2 通信策略

既然是分布式训练,那机器之间必须要保持通信,这样才可以传输模型参数,梯度参数等信息。

DeepSpeed提供了mpi、gioo、nccl等通信策略

通信策略

通信作用

mpi

它是一种跨界点的通信库,经常用于CPU集群的分布式训练

gloo

它是一种高性能的分布式训练框架,可以支持CPU或者GPU的分布式训练

nccl

它是nvidia提供的GPU专用通信库,广泛用于GPU上的分布式训练

我们在使用DeepSpeed进行分布式训练的时候,可以根据自身的情况选择合适的通信库,通常情况下,如果是GPU进行分布式训练,可以选择nccl。

2.3 Zero(零冗余优化器)

Microsoft开发的Zero可以解决分布式训练过程中数据并行和模型并行的限制。比如: Zero通过在数据并行过程中划分模型状态(优化器、梯度、参数),来解决数据并行成可能出现内存冗余的情况(正常数据并行训练,模型全部参数是复制在各个机器上的);同时可以在训练期间使用动态通信计划,在分布式设备之间共享重要的状态变量,这样保持计算粒度和数据并行的通信量。

Zero是用于大规模模型训练优化的技术,它的主要目的是减少模型的内存占用,让模型可以在显卡上训练,内存占用主要分为Model StatesActivation两个部分,Zero主要解决的是Model States的内存占用问题。

Zero将模型参数分成三个部分:

状态

作用

Optimizer States

优化器在进行梯度更新的时候需要用到的数据

Gradient

在反向转播过程中产生的数据,其决定参数的更新方向

Model Parameter

模型参数,在模型训练过程中通过数据“学习”的信息

Zero的级别如下:

级别

作用

Zero-0

不使用所有类型的分片,仅使用DeepSpeed作为DDP

Zero-1

分割Optimizer States, 减少4倍内存,通信容量和数据并行性相同

Zero-2

分割Optimizer States和Gradients,减少8倍内存,通信容量和数据并行性相同

Zero-3

分割Optimizer States、gradients、Parametes,内存减少与数据并行度呈线性关系。例如,在64个GPU(Nd=64)之间进行拆分将产生64倍的内存缩减。通信量有50%的适度增长

Zero-Infinity

Zero-Infinity是Zero-3的扩展,它允许通过使用 NVMe 固态硬盘扩展 GPU 和 CPU 内存来训练大型模型

2.4 Zero-Offload:

相比GPU,CPU就相对比较廉价,所以Zero-Offload思想是将训练阶段的某些模型状态放(offload)到内存以及CPU计算。

DeepSpeed: 大模型训练框架 | 京东云技术团队_DeepSpeed

Zero-Offload不希望为了最小化显存占用而让系统计算效率下降,但如果使用CPU也需要考虑通信和计算的问题(通信:GPU和CPU的通信;计算:CPU占用过多计算就会导致效率降低)。

Zero-Offload想做的是把计算节点和数据节点分布在GPU和CPU上,计算节点落到哪个设备上,哪个设备就执行计算,数据节点落到哪个设备上,哪个设备就负责存储。

Zero-Offload切分思路:

下图中有四个计算类节点:FWD、BWD、Param update和float2half,前两个计算复杂度大致是 O(MB), B是batch size,后两个计算复杂度是 O(M)。为了不降低计算效率,将前两个节点放在GPU,后两个节点不但计算量小还需要和Adam状态打交道,所以放在CPU上,Adam状态自然也放在内存中,为了简化数据图,将前两个节点融合成一个节点FWD-BWD Super Node,将后两个节点融合成一个节点Update Super Node。如下图右边所示,沿着gradient 16和parameter 16两条边切分。

DeepSpeed: 大模型训练框架 | 京东云技术团队_浮点数_02

Zero-Offload计算思路:

在GPU上面进行前向和后向计算,将梯度传给CPU,进行参数更新,再将更新后的参数传给GPU。为了提高效率,可以将计算和通信并行起来,GPU在反向传播阶段,可以待梯度值填满bucket后,一遍计算新的梯度一遍将bucket传输给CPU,当反向传播结束,CPU基本上已经有最新的梯度值了,同样的,CPU在参数更新时也同步将已经计算好的参数传给GPU,如下图所示。

DeepSpeed: 大模型训练框架 | 京东云技术团队_浮点数_03

2.5 混合精度:

混合精度训练是指在训练过程中同时使用FP16(半精度浮点数)和FP32(单精度浮点数)两种精度的技术。使用FP16可以大大减少内存占用,从而可以训练更大规模的模型。但是,由于FP16的精度较低,训练过程中可能会出现梯度消失和模型坍塌等问题。

DeepSpeed支持混合精度的训练,可以在config.json配置文件中设置来启动混合精度("fp16.enabled":true)。在训练的过程中,DeepSpeed会自动将一部分操作转化为FP16格式,并根据需要动态调整精度缩放因子,来保证训练的稳定性和精度。

在使用混合精度训练时,需要注意一些问题,例如梯度裁剪(Gradient Clipping)和学习率调整(Learning Rate Schedule)等。梯度裁剪可以防止梯度爆炸,学习率调整可以帮助模型更好地收敛。

三、总结

DeepSpeed方便了我们在机器有限的情况下来训练、微调大模型,同时它也有很多优秀的性能来使用,后期可以继续挖掘。

目前主流的达模型训练方式: GPU + PyTorch + Megatron-LM + DeepSpeed

优势

  1. 存储效率:DeepSpeed提供了一种Zero的新型解决方案来减少训练显存的占用,它与传统的数据并行不同,它将模型状态和梯度进行分区来节省大量的显存;
  2. 可扩展性:DeepSpeed支持高效的数据并行、模型并行、pipeline并行以及它们的组合,这里也称3D并行;
  3. 易用性: 在训练阶段,只需要修改几行代码就可以使pytorch模型使用DeepSpeed和Zero。

参考:

1\. http://wed.xjx100.cn/news/204072.html?action=onClick

2\. https://zhuanlan.zhihu.com/p/513571706

作者:京东物流 郑少强

来源:京东云开发者社区 转载请注明来源

标签:DeepSpeed,框架,训练,模型,Zero,GPU,京东,CPU,分布式
From: https://blog.51cto.com/u_15714439/8032044

相关文章

  • 使用Scrapy框架爬取当当网图书信息
    在本文中,我们将使用Scrapy框架来爬取当当网的图书信息。Scrapy是一个强大的Python爬虫框架,可以帮助我们快速高效地从网页中提取所需的数据。首先,我们需要创建一个爬虫组件。在这个组件中,我们定义了爬虫的名称、允许的域名以及起始的爬虫页面。在parse方法中,我们使用BeautifulSoup库......
  • 基于 ElementUi框架的 table组件制作的 报表功能
    <template><!--月周计划报表--><divclass="monthPlanForm"><el-table:data="tableData":span-method="spanMethod"style="width:100%"><el-table-columntype="index"widt......
  • Util应用框架 UI 开发快速入门
    本文是Util应用框架AngularUI开发快速入门教程.Util前端技术概述Util应用框架目前仅支持用于开发管理后台的UI.本文介绍了UtilUI的技术特点和功能支持.UI技术选型Js语言TypeScriptTypeScript是微软开发的脚本语言,扩展了弱类型的Javascript,提供增强的语......
  • SpringBoot自动配置原理解析 | 京东物流技术团队
    1:什么是SpringBoot自动配置首先介绍一下什么是SpringBoot,SpringBoost是基于Spring框架开发出来的功能更强大的Java程序开发框架,其最主要的特点是:能使程序开发者快速搭建一套开发环境。SpringBoot能将主流的开发框架(例如SpringMVC,Dubbo,Mybatis,Redis等),做到像Maven导入Jar包一样......
  • Java类加载机制详解 | 京东云技术团队
    一.类加载器及双亲委派机制类加载器加载类备注启动类加载器(BootstrapClassLoader)JAVA_HOME/jre/lib无上级,无法直接访问由jvm加载拓展类加载器(ExtensionClassLoader)JAVA_HOME/jre/lib/ext父加载器为Bootstrap,显示为null。该类由Bootstrap加载应用类加载器(ApplicationClassLoa......
  • 2023年值得使用的 Node.js 框架
    2023年值得使用的Node.js框架Hacker2022-05-2623,542阅读10分钟 专栏: 前端随记 Node.js是最受欢迎的JavaScript运行时,今天就来看看有哪些热门、值得使用的Node.js框架。1.Next.jsNext.js是一个用于生产环境的React应用框架,使用它可以快速上手开发R......
  • golang的Leaf框架安装步骤
    最近在学习golang的Leaf游戏服务器框架(官方github),官方的安装步骤,非常简单,如下图:我在安装的时候也遇到一些疑问,因此记录下来我的实操步骤!1、我的现有GOPATH=E:\Go,src目录下有一些做过的项目2、获取LeafServer,我在src目录下clone的,遵循以前的原则,项目文件都放到GOPATH的src目录......
  • Unity如何搭建游戏框架
    Unity引擎本省就是一个框架,我们基于Unity再做一个游戏开发框架,本质就是建立一种组织自己项目的方式和方法,让程序+美术+策划一起协同工作,同时能开发出满足项目需求的游戏产品。所以游戏框架的架构与设计与项目管理本身有很密切的关系,今天从另外一个维度来说说基于游戏引擎来如何......
  • Unity架构师必备开源框架:3天打造大厂商用框架
    现在Unity的相关技术已经都非常常熟了,如果你的技术能力与阅历够,搭建一个商用的游戏框架,你只需要3天的时间。今天给大家分享一个Unity老鸟3天能搭建一个自己的商用框架的几个必备的开源库,方便大家学习与使用,同时学习这些有前途的开源库也能让你在公司里面游刃有余。 对啦!这里有个......
  • Unity打造Timer定时器框架
    1:为什么我们要自己造轮子来做定时器系统传统的Unity做定时器的方式有三种,总结如下:对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。(1)在组件类里面定义一个变量,每次Update的时候,累积时间,当时间......