大模型分布式训练之DeepSpeed优化器并行(ZeRO)原理

由于大模型参数量非常庞大,所以我们常常需要用到分布式训练来解决训练过程中计算资源不足的问题,现在也出现了很多大模型相关的分布式训练框架,但是使用的比较多的还是deepspeed的数据并行,那么deepspeed是怎么实现数据并行的呢

文章目录

  • DeepSpeed
  • ZeRO-1原理
  • ZeRO-2原理
  • ZeRO-3原理
  • ZeRO-Offload
  • deepspeed的使用
  • 参考

DeepSpeed

DeepSpeed是一个开源的深度学习优化库,它由微软开发并维护,旨在提高大规模模型训练的效率和可扩展性。通过创新的算法和技术,DeepSpeed能够降低训练超大规模模型的复杂性和资源需求,让深度学习训练变得更快、更高效。

DeepSpeed特点和优势:

  • 高效的并行化策略:DeepSpeed支持多种并行化方法,包括数据并行、模型并行和流水线并行。这些方法可以灵活组合,以适应不同规模和复杂度的深度学习模型。通过并行化,DeepSpeed能够显著提高训练速度和可扩展性。
  • 内存优化技术:为了降低内存占用和提高训练效率,DeepSpeed引入了ZeRO(Zero Redundancy Optimizer)技术。ZeRO通过将优化器的状态、梯度和参数在分布式环境中进行分割,从而减少了冗余的内存占用。这使得在有限的内存资源下训练更大的模型成为可能。
  • 混合精度训练支持:DeepSpeed支持混合精度训练,即同时使用单精度和半精度浮点数进行训练。这种方法可以在保持模型性能的同时,减少内存占用和计算时间,降低能耗。
  • 易用性和兼容性:DeepSpeed与PyTorch等主流深度学习框架紧密集成,提供了易用的API和丰富的文档支持。这使得用户能够轻松地将DeepSpeed集成到他们的项目中,并充分利用其提供的优化功能。此外,DeepSpeed还提供了高度优化的数据加载和网络通信工具,以减少通信量并提高多GPU和多节点环境下的训练效率。

DeepSpeed实现数据并行主要是通过ZeRO(Zero Redundancy Optimizer)技术和混合进度训练,混合进度训练这里不再过多介绍,ZeRO原理到底是什么呢?小编花了一个晚上终于搞懂了!
优化器数据并行有三种方式,即ZeRO-1/23

ZeRO-1原理

只对optimizer状态进行切分
具体步骤:

  1. 把batch分成N份,每张卡(GPU)一份

  2. 执行一步前向和反向传播计算后,每个GPU各得一份梯度

  3. 对梯度执行all-reduce操作,得到完整梯度,这里all-reduce操作是将每个节点上的部分梯度累加起来,并将结果广播到所有节点,这样所有节点都拥有一份完整的梯度

  4. 每个 GPU 得到完整的梯度 G后,对各自的权重进行更新,权重的更新由优化器状态和梯度共同决定
    在这里,优化器的状态也被切分成了N份,每个GPU只需要存储和更新总优化器状态的 1/N ,并更新1/N 的权重;

  5. 每个GPU维护各自优化器里面更新的权重,最后执行all-gather,使得每个GPU都有更新后的权重,all-gather 操作将更新后的权重同步到所有节点
    在这里插入图片描述

ZeRO-2原理

在optimizer状态划分的基础上,再对梯度也进行划分,每个GPU各自维护一块自己的梯度
具体步骤:

  1. 把batch分成N份,每张卡(GPU)一份
  2. 执行一步前向和反向传播计算后,每个GPU各得一份梯度
  3. 对梯度执行all-reduce,保证每个GPU所维护的梯度是聚合梯度(即各节点汇总之后的梯度),聚合之后对梯度进行切分
    具体是怎么切分梯度的呢? 举个栗子——
    eg:① 比如GPU1只负责维护梯度G1,其他GPU只需要把对应位置梯度发给GPU1即可
    ② 汇总完毕后,其他不是GPU1维护的梯度会从GPU1中移除,即更新后马上释放
  4. 每个GPU用所维护的优化器和梯度更新相应的权重,即每块GPU维护独立的权重
  5. 最后对权重执行all-gather,将其他GPU的权重同步一份完整的到自己节点上来
    在这里插入图片描述

ZeRO-3原理

ZeRO-3在ZeRO-1和ZeRO-2的基础上,对权重进行各自的维护,即不再维护一整份权重了
具体步骤:

  1. 把batch分成N份,每张卡(GPU)一份
  2. 这个时候模型的权重参数(张量)也被分成N份
  3. 在进行前向计算之前,对权重执行all-gather操作取回分布在各GPU上的权重,组成完整的参数进行前向计算,计算完成后,把不属于自身维护的权重抛弃
  4. 在进行反向传播计算之前,对权重执行all-gather操作取回分布在各GPU上的权重,组成完整的参数进行反向传播计算,计算完成后,把不属于自身维护的权重抛弃
  5. backward之后得到各自的梯度,对梯度执行all-reduce,得到聚合的梯度之后更新其自身维护的权重,然后立刻把不是自己维护的梯度抛弃
  6. 由于每个GPU只保存其自身维护的权重参数,因为无需对权重进行all-reduce
    在这里插入图片描述
    注:
  • ZeRO-3其实是增加了通信开销,来减少每张GPU的显存占用,以通信换显存
  • 可能有人会问,ZeRO-3对权重参数进行了切分,应该算张量并行吧???其实不是,因为ZeRO-3在前向和反向的时候,还是用的完整的权重来计算的(张量并行在前向和反向的时候也只用一部分权重)

ZeRO-Offload

把占用显存多的部分卸载到cpu上,计算和激活值部分放到gpu上,这样比起跨机,更能节省内存,也能减少跨机跨通信域的通信压力
原理:

  • 高计算:前向传播和反向传播计算量高,相关的权重参数计算和激活值计算仍然在gpu
  • 低计算:权重更新部分计算量低,以通信为主,且需要的显存较大,放入到cpu中

deepspeed的使用

官方教程
感觉官网说的挺明白的,这里不再过多赘述~~~
有任何说的不对的地方,欢迎大家指正!!!

参考

  • https://blog.csdn.net/myTomorrow_better/article/details/138945584
  • https://www.bilibili.com/video/BV1fb421t7KN/?spm_id_from=333.788&vd_source=9b5bcbc75b2a02599faa4bac703679a1

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Unity】web gl inputFied 中文输入,同时支持TextMeshInputFied,支持全屏

同时支持TextMeshInputFied,支持全屏。 使用github包【WebGLInput】:https://github.com/kou-yeung/WebGLInput 需要资源的在这里也可以下载 https://download.csdn.net/download/weixin_46472622/89600795 用于unity web gl 中文输入,只需…

【人工智能】边缘计算与 AI:实时智能的未来

💎 我的主页:2的n次方_ 💎1. 引言 随着物联网设备数量的爆炸性增长和对实时处理需求的增加,边缘计算与人工智能(Edge AI)成为一个热门话题。Edge AI 通过在本地设备上运行 AI 算法,减少对云计…

大数据-61 Kafka 高级特性 消息消费02-主题与分区 自定义反序列化 拦截器 位移提交 位移管理 重平衡

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

Python酷库之旅-第三方库Pandas(062)

目录 一、用法精讲 241、pandas.Series.view方法 241-1、语法 241-2、参数 241-3、功能 241-4、返回值 241-5、说明 241-6、用法 241-6-1、数据准备 241-6-2、代码示例 241-6-3、结果输出 242、pandas.Series.compare方法 242-1、语法 242-2、参数 242-3、功能 …

最新小猫咪PHP加密系统源码V1.4_本地API接口_带后台

简介: 最新小猫咪PHP加密系统源码V1.4_完全本地化加密API接口_带后台 小猫咪PHP加密系统历时半年,它再一次迎来更新,更新加密算法(这应该是最后一次更新加密算法了,以后主要更新都在框架功能上面了)&…

Python 爬虫项目实战(一):破解网易云 VIP 免费下载付费歌曲

前言 网络爬虫(Web Crawler),也称为网页蜘蛛(Web Spider)或网页机器人(Web Bot),是一种按照既定规则自动浏览网络并提取信息的程序。爬虫的主要用途包括数据采集、网络索引、内容抓…

代码随想录27天|贪心

455.分发饼干 代码随想录 第一想法 将孩子胃口值g[i] 按从小到达的顺序排列,饼干尺寸也按照从小到大的顺序去排列。 优先将大尺寸喂给大胃口孩子。如果满足不了胃口那么久试着分给下一个孩子。 要尽量满足更多的孩子,那么大尺寸的饼干就不能喂给小胃口…

【多线程】线程状态与并发三大特性的细节剖析

这篇文章主要用于对于多线程的一些查缺补漏。 一、 线程的状态 1,操作系统层面,线程的5种状态 关于线程有几种状态,有多种说法,5、6、7都有。 首先对于操作系统来说,只有5种状态,状态如下新建&#xff…

浅谈KMP算法(c++)

目录 前缀函数应用【模板】KMP题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示样例 1 解释数据规模与约定 思路AC代码 本质不同子串数 例题讲解[NOI2014] 动物园题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示思路AC代码 [POI2006] OKR-Periods of …

智慧水务项目(一)django(drf)+angular 18 通过pycharm建立项目

一、环境准备 windows 10 pycharm python3.11 二、pycharm 创建django项目 三、建立requirements.txt 在根目录创建requirements.txt,也就是与manage.py同一目录下,先放下面几个依赖 Django djangorestframeworkpip install -r .\requirements.txt 更新下pip python…

ShardingSphere实战(1)- 分库分表基础知识

一、为什么要分库分表 分库分表是一种数据库优化策略,主要用于解决大型应用或高并发场景下数据库性能瓶颈的问题。具体来说,分库分表可以带来以下好处: 提高性能: 减少单个数据库实例的负载,避免单点性能瓶颈。当数据…

【香橙派系列教程】(五)Linux的热拔插UDEV机制

【五】Linux的热拔插UDEV机制 在上一篇中我们发现,当手机接入开发板时,系统并不认识,当我们在/etc/udev目录下创建一个规则后,就可以通过adb访问到手机了,这里到底是怎么回事? 文章目录 【五】Linux的热拔插…

武汉流星汇聚:亚马逊平台消费者众多,助力中国卖家销售额大幅增长

在全球电商的浩瀚星空中,亚马逊凭借其庞大的消费者规模和强大的市场影响力,为无数商家特别是中国卖家提供了前所未有的发展机遇。近年来,越来越多的中国卖家选择通过亚马逊平台,将优质产品直接送达全球消费者的手中,并…

精选3款国内wordpress 主题,建站首选

WordPress作为一款功能强大且易于使用的建站平台,已经成为了许多企业和个人搭建网站的首选。为了帮助大家更好地选择适合自己的WordPress主题,小编将为大家推荐三款国内优秀的WordPress主题:子比主题、OneNav主题和RiTheme主题。 1.子比主题…

JavaScript ES6语法详解(下)

前言:哈喽,大家好,我是码喽的自我修养!今天给大家分享JavaScript ES6语法详解(下)!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到带大家,欢迎收藏关注…

Qt Creator 与 ESP-IDF QEMU 模拟器使用指南

标题: Qt Creator 与 ESP-IDF QEMU 模拟器使用指南 概要: 本文为开发者提供了使用 Qt Creator 和 ESP-IDF QEMU 模拟器进行 ESP32 开发的详细指南,包括环境准备、项目创建和编译、模拟器设置、编程和调试等方面的内容。通过本指南,可以快速上手 Qt Crea…

Learning vtkjs之Calculator

过滤器 公式计算器 Calculator 介绍 The Calculator filter is a fast way to add derived data arrays to a dataset. These arrays can be defined over points, cells, or just field data that is “uniform” across the dataset (i.e., constant over all of space). Va…

手把手教你实现日期类

目录 前言 1.头文件的实现 2.日期类函数各项功能实现 2.1 初始化和打印(比较简单) 2.2日期大小判断 2.3日期的加减运算 3.日期类的输入输出 4.测试代码参考 结束语 前言 前面我们讲解了类的对象的大部分知识,例如拷贝构造&#xff0c…

优化数据处理效率,解读 EasyMR 大数据组件升级

EasyMR 作为袋鼠云基于云原生技术和 Hadoop、Hive、Spark、Flink、Hbase、Presto 等开源大数据组件构建的弹性计算引擎。此前,我们已就其展开了多方位、多角度的详尽介绍。而此次,我们成功接入了大数据组件的升级和回滚功能,能够借助 EasyMR …

乐乐音乐Kotlin版

简介 乐乐音乐Kotlin版,主要是基于ExoPlayer框架开发的Android音乐播放器,它支持lrc歌词和动感歌词(ksc歌词、krc歌词、trc歌词、zrce歌词和hrc歌词等)、多种格式歌词转换器及制作动感歌词、翻译歌词和音译歌词。 编译环境 Android Studio Jellyfish | …