深度学习:大规模模型分布式训练框架DeepSpeed

news2024/11/14 13:24:00

深度学习:大规模模型分布式训练框架DeepSpeed

  • DeepSpeed简介
  • DeepSpeed核心特点
  • DeepSpeed如何工作?
  • DeepSpeed如何使用?
  • 参考文献

DeepSpeed简介

在这里插入图片描述

随着机器学习模型变得越来越复杂和庞大,训练这些模型所需的计算资源也在不断增加。特别是在自然语言处理(NLP)等领域,模型大都达到了数十亿甚至数千亿参数的规模,这就需要多卡或者多节点分布式训练。为了有效地训练这些巨型模型,微软Microsoft推出了一个名为DeepSpeed的开源大规模模型分布式训练框架,提供了一些优化策略和工具,旨在支持大规模模型训练和更高效的训练过程。

DeepSpeed的设计初衷就是简化并优化大规模模型的训练。DeepSpeed 实现了3D并行,即三种并行方法的灵活组合:ZeRO 支持的数据并行,流水线并行和张量切片模型并行。这些技术可以极大地减少单个GPU的内存消耗,允许在有限资源下训练更大的模型。此外,DeepSpeed通过ZeRO-Offload可以同时利用CPU和GPU内存来训练大模型,极大地降低显存消耗。

DeepSpeed提供了高度优化的数据加载和网络通信工具,这些工具可以减少通信量、显著提高多GPU和多节点环境下的训练效率。该框架还支持混合精度训练,进一步提升了计算速度和资源利用率。此外,DeepSpeed提出了一种稀疏注意力核,与经典的稠密 Transformer 相比,它支持的输入序列长一个数量级,并在保持相当的精度下获得最高 6 倍的执行速度提升。

此外,DeepSpeed致力于优化大规模训练,但为了注重用户体验。DeepSpeed提供了易于集成的API,使得将现有的PyTorch模型迁移到DeepSpeed框架变得轻而易举,而无需进行大量的代码重写。

DeepSpeed是一个活跃的开源项目,其在GitHub上持续更新和维护,其Github链接为https://github.com/microsoft/DeepSpeed。

DeepSpeed核心特点

DeepSpeed的核心特点如下:
在这里插入图片描述
DeepSpeed在模型训练上提供了ZeRO、3D-Parallelism、DeepSpeed-MoE、ZeRO-Infinity 等创新技术,使大规模深度学习训练变得有效、高效,大大提高了易用性,并在可能的规模方面重新定义了深度学习训练格局。
DeepSpeed在模型推理上汇集了Tensor、Pipeline、Expert和ZeRO-parallelism等并行技术的创新,并将它们与高性能定制推理内核、通信优化和异构内存技术相结合,以前所未有的规模实现推理,同时实现无与伦比的延迟、吞吐量和性能。
DeepSpeed在模型压缩上,提供易于使用且组合灵活的压缩技术来压缩他们的模型,同时提供更快的速度、更小的模型大小并显着降低的压缩成本。
DeepSpeed团队推出了一项名为 DeepSpeed4Science 的新计划,旨在通过人工智能系统技术创新构建独特的能力,帮助领域专家解开当今最大的科学谜团。

DeepSpeed如何工作?

下面看一看DeepSpeed的一些核心组件和它们是如何工作的。

  1. ZeRO优化器
    ZeRO(Zero Redundancy Optimizer)是DeepSpeed的一个关键创新,旨在解决大模型训练中的内存瓶颈问题。它通过优化数据并行策略中的冗余数据来实现内存节省。简单来说,ZeRO将模型参数、梯度和优化器状态等分散存储在多个GPU上,而不是在每个GPU上存储一份完整的副本。它在训练期间使用动态通信计划,以在分布式设备之间共享必要的数据,以保持计算粒度和数据并行性的通信量。这样做可以显著减少每个GPU的内存负担,使得训练更大的模型成为可能。ZeRO的级别分类如下:
  • ZeRO-0:禁用所有类型的分片,仅使用 DeepSpeed 作为 DDP (Distributed Data Parallel);
  • ZeRO-1:分割优化器状态,减少了4倍的内存,通信容量与数据并行性相同;
  • ZeRO-2:分割优化器状态与梯度,8x内存减少,通信容量与数据并行性相同;
  • ZeRO-3:分割优化器状态、梯度与参数,内存减少与数据并行度和复杂度成线性关系。
  • ZeRO-Infinity 是ZeRO-3的拓展。允许通过使用 NVMe 固态硬盘扩展 GPU 和 CPU 内存来训练大型模型。ZeRO-Infinity 需要启用 ZeRO-3。
  1. ZeRO-Offload技术
    ZeRO-Offload进一步扩展了ZeRO的能力,通过将部分计算任务卸载到CPU上,减少了GPU上的计算需求。这允许在GPU资源受限的情况下训练大型模型,同时还能够有效利用CPU资源。
  2. 参数分片
    在DeepSpeed中,参数分片是另一种减少GPU内存需求的手段。通过将模型的参数分割成更小的片段,并在训练过程中只在必要时将它们加载到内存中,DeepSpeed可以进一步减少单个GPU所需的内存量,从而允许更大模型的训练。
  3. 混合精度训练
    混合精度训练是指在训练过程中同时使用FP16(半精度浮点数)和FP32(单精度浮点数)两种精度的技术。使用FP16可以大大减少内存占用,从而可以训练更大规模的模型。在使用混合精度训练时,需要使用一些技术来解决可能出现的梯度消失和模型不稳定的问题,例如动态精度缩放和混合精度优化器等。

DeepSpeed如何使用?

DeepSpeed可以与现有的PyTorch代码库无缝集成,开发者仅需进行少量修改即可开始使用。下面是一些基本的步骤在已经搭建好模型的基础上来开始使用DeepSpeed:

  1. 安装DeepSpeed:可以通过pip包管理器快速安装pip install deepspeed
  2. 修改代码以兼容DeepSpeed:这通常包括导入DeepSpeed库import deepspeed、初始化DeepSpeed引擎deepspeed.initialize(),并对数据加载器data_loader和迭代训练(前向传播和反向传播)进行设置。
  3. 配置运行环境:根据你的硬件和模型大小,设置配置文件,包括batch size、学习率、优化器选择、内存优化等等。
  4. 启动训练:使用DeepSpeed提供的命令行工具来启动训练过程,这个工具可以在多个GPU上分布式地运行你的模型。

此外,DeepSpeed现已集成到一些开源深度学习框架中,例如Transformers、Accelerate、Lightning、MosaicML、Determined和MMEngine。可以结合这些开源框架使用DeepSpeed,例如,transformers框架可以通过Trainer来使用集成的DeepSpeed功能,这种用法需要提供配置文件deepspeed_config.json,详细教程见transformers官网链接:

from transformers import Trainer

deepspeed_config = "./deepspeed_config.json"

model = ...
args = TrainingArguments(
	...
	deepspeed=deepspeed_config,
	...
)

trainer = Trainer(
    model=model,
    args=args,
    train_dataset=train_dataset,
    data_collator=data_collator,
    optimizer=optimizer,
)
trainer.train()
trainer.save_model("best")

参考文献

  1. [LLM]大模型训练(一)–DeepSpeed介绍
  2. [LLM]大模型训练(二)–DeepSpeed使用

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

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

相关文章

【已解决】Invalid bound statement (not found)

报错讯息 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.casey.mapper.SysRoleMapper.getUserRoleCode at org.apache.ibatis.binding.MapperMethod S q l C o m m a n d . < i n i t > ( M a p p e r M e t h o d . j a v a :…

数据库MYSQL no.2

1.加法 加法&#xff1a;在java中有运算和拼接的功能&#xff0c;但是数据库中加号只做运算。 拼接是concat&#xff08;...&#xff0c;...&#xff09; 2. IFNULL ifnull(字段&#xff0c;0) 为null就返回逗号后面的东西0. 3.条件查询&#xff1a; 1.条件表达式 &#…

第84讲:基于各种场景使用mysqldump逻辑备份数据库

文章目录 1.mysqldump备份工具的语法格式2.使用mysqldump进行全库备份3.备份单个库或者多个库的数据4.备份某个库下的单表或者多表的数据5.mysqldump备份数据库时必加的一些参数5.1.基本参数5.2.核心参数 6.mysqldump备份数据库时的一些其他参数 1.mysqldump备份工具的语法格式…

条件随机场 (CRF) 的损失函数以及faiss 的原理介绍

1、条件随机场 (CRF) 的损失函数 条件随机场&#xff08;CRF&#xff09;是一种统计建模方法&#xff0c;常用于结构化预测问题&#xff0c;如序列标注、分词和命名实体识别等。在CRF模型中&#xff0c;损失函数用于衡量模型预测的标记序列与真实标记序列之间的差异。CRF的目标…

C++-模板与容器

1、模板 模板可以让类或者函数支持一种通用类型&#xff0c;这种通用类型在实际运行过程中可以使用任何数据类型。因此程序员可以写出一些与类型无关的代码。这种编程方式也叫“泛型编程”。 通常有两种形式&#xff1a; 函数模板类模板 1.1 函数模板 //模板类型声明 template&…

【基础篇】九、程序计数器 JVM栈

文章目录 0、运行时数据区域1、程序计数器2、JVM栈3、JVM栈--栈帧--局部变量表4、JVM栈--栈帧--操作数栈5、JVM栈--栈帧--桢数据6、栈溢出7、设置栈空间大小8、本地方法栈 0、运行时数据区域 JVM结构里&#xff0c;类加载器下来&#xff0c;到了运行时数据区域&#xff0c;即Ja…

Navicat for Mysql怎么执行创建表的脚本

Navicat for Mysql怎么执行创建表的脚本 Navicat 怎么执行sql文件 Navicat 执行创建表语句 Navicat 执行sql语句 Navicat 怎么创建表语句 1、打开Navicat数据库管理工具&#xff1b; 2、点击菜单栏上的“工具”&#xff0c;选择“命令列界面”&#xff1b; 打开了命令列界面…

Vue学习计划-Vue3--核心语法(三)computed计算属性、watch监听、watchEffect函数

1. computed计算属性 作用&#xff1a;根据已有数据计算出新数据&#xff08;和Vue2中的computed作用一致&#xff09;。 2. watch监视与watchEffect 1. watch 作用&#xff1a;监视数据的变化&#xff08;和Vue2的watch作用一致&#xff09;特点&#xff1a;Vue3中的watch…

Flume基础知识(五):Flume实战之实时监控目录下多个新文件

1&#xff09;案例需求&#xff1a; 使用 Flume 监听整个目录的文件&#xff0c;并上传至 HDFS 2&#xff09;需求分析&#xff1a; 3&#xff09;实现步骤&#xff1a; &#xff08;1&#xff09;创建配置文件 flume-dir-hdfs.conf 创建一个文件 vim flume-dir-hdfs.conf …

一起学docker(六)| Dockerfile自定义镜像 + 微服务模块实战

DockerFile 是什么 Dockerfile是用来构建Docker镜像的文本文件&#xff0c;是由一条条构建镜像所需的指令和参数构成的脚本。 构建步骤 编写Dockerfile文件docker build命令构建镜像docker run运行镜像 Dockerfile构建过程 基础知识 每个保留字指令都必须为大写字母且后面…

逻辑回归(LR)----机器学习

基本原理 逻辑回归&#xff08;Logistic Regression&#xff0c;LR&#xff09;也称为"对数几率回归"&#xff0c;又称为"逻辑斯谛"回归。 logistic回归又称logistic 回归分析 &#xff0c;是一种广义的线性回归分析模型&#xff0c;常用于数据挖掘&#…

『年度总结』逐梦编程之始:我的2023学习回顾与展望

目录 这篇博客&#xff0c;我将回顾2023年编程之旅的起点&#xff0c;同时展望2024年的新征程。 前言 我与Python 我与C语言 第一篇正式博客&#xff1a; 第二篇正式博客&#xff08;扫雷&#xff09;&#xff1a; 指针学习笔记: C语言学习笔记&#xff1a; 我与数据结构…

SCT52A40——120V,4A,高频高压侧和低压侧栅极驱动器,替代UCC27200/UCC27201/MIC4604YM等

• 8-24V宽供电电压 • 驱动高侧和低侧N通道MOSFET • 4A峰值输出源电流和汇电流 • 升压电源电压范围可达120V • 集成阴极负载二极管 • TTL兼容输入&#xff0c;-10V输入 • 45ns传输延迟 • 1000pF负载下7ns上升和4.5ns下降时间 • 2ns延迟匹配时间 • 静态电流252uA • 15…

JDK、JRE、JVM的联系与区别

JDK、JRE、JVM的联系与区别 一、JDK,JRE,JVM定义 JDK(Java Development Kit),包含JRE,以及增加编译器和调试器等用于程序开发的文件。 JRE(Java Runtime Environment)&#xff0c;包含Java虚拟机、库函数、运行Java应用程序所必须的文件。 JVM(Java Virtual Machine)是一个虚…

Vue中的选项式 API 和组合式 API,两者有什么区别

Vue中的选项式 API&#xff08;Option API&#xff09;和组合式 API&#xff08;Composition API&#xff09;是两种不同的组件编写方式&#xff0c;它们各有特点和适用场景&#xff1a; 选项式 API&#xff08;Option API&#xff09;: 传统方法&#xff1a;Vue最初的编程范式…

LeetCode 热题 100——42. 接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表…

一起玩儿物联网人工智能小车(ESP32)——25. 利用超声波传感器测量距离

摘要&#xff1a;本文介绍如何利用超声波传感器测量障碍物的距离 测量距离是智能小车经常要用到的功能&#xff0c;今天就来介绍一个最常用的测量距离的传感器——超声波传感器。 超声波传感器的测距原理是利用超声波发射器向某个方向发射超声波&#xff0c;与此同时&#xff…

Health System Pro - Plug Play Solution

Health System为您提供了可重复使用的健康组件、健康条和碰撞块组件&#xff0c;可以轻松定制和扩展&#xff0c;以满足任何项目的需求。通过使用Health System&#xff0c;您可以节省时间和精力&#xff0c;避免为每个项目或游戏实体重写健康逻辑&#xff0c;从而带来更高效的…

计算机网络(9):无线网络

无线局域网 WLAN 无线局域网常简写为 WLAN (Wireless Local Area Network)。 无线局域网的组成 无线局域网可分为两大类。第一类是有固定基础设施的&#xff0c;第二类是无固定基础设施的。所谓“固定基础设施”是指预先建立起来的、能够覆盖一定地理范围的一批固定基站。 …

Python----matplotlib库

目录 plt库的字体&#xff1a; plt的操作绘图函数&#xff1a; plt.figure(figsizeNone, facecolorNone): plt.subplot(nrows, ncols, plot_number)&#xff1a; plt.axes(rect)&#xff1a; plt.subplots_adjust(): plt的读取和显示相关函数&#xff1a; plt库的基础图…