DeepSpeed是一个深度学习优化软件套件,使分布式训练和推理变得简单、高效和有效。它可以做些什么呢?训练/推理具有数十亿或数万亿参数的密集或稀疏模型;实现出色的系统吞吐量并有效扩展到数千个GPU;在资源受限的GPU系统上进行训练/推理;实现前所未有的低延迟和高吞吐量的推理;以低成本实现极限压缩,实现无与伦比的推理延迟和模型尺寸减小。特别说明,DeepSpeed在Windows上仅支持推理,不支持训练。

一.DeepSpeed四大创新支柱


1.DeepSpeed-Training

  DeepSpeed提供了系统创新的融合,使大规模深度学习训练变得有效、高效,大大提高了易用性,并在可能的规模方面重新定义了深度学习训练版图。ZeRO、3D-Parallelism、DeepSpeed-MoE、ZeRO-Infinity等创新属于培训支柱[2]。

2.DeepSpeed-Inference

  DeepSpeed汇集了tensor、pipeline、expert和ZeRO-parallelism等并行技术的创新,并将它们与高性能定制推理内核、通信优化和异构内存技术相结合,以前所未有的规模实现推理,同时实现无与伦比的延迟、吞吐量和性能。降低成本。这种推理系统技术的系统组合属于推理支柱[3]。

3.DeepSpeed-Compression

  为了进一步提高推理效率,DeepSpeed为研究人员和从业人员提供易于使用且组合灵活的压缩技术来压缩他们的模型,同时提供更快的速度、更小的模型大小并显着降低的压缩成本。此外,ZeroQuant和XTC等SoTA在压缩方面的创新也包含在压缩支柱下[4]。

4.DeepSpeed4Science

  觉得离自己好遥远,就不介绍这个了[5]。

5.DeepSpeed软件架构

(1)APIs:配置参数都在ds_config.json文件中,上层通过简单的API接口就可以训练模型和推断。

(2)RunTime:DeepSpeed的核心运行时组件,使用Python语言实现,负责管理、执行和优化性能。它承担了将训练任务部署到分布式设备的功能,包括数据分区、模型分区、系统优化、微调、故障检测以及检查点的保存和加载等任务。

(3)DeepSpeed的底层内核组件,使用C++和CUDA实现。它优化计算和通信过程,提供了一系列底层操作等。

二.分布式模型训练

  分布式模型训练包括:数据并行,模型并行(张量并行和流水线并行),混合并行。如下所示:

1.数据并行

  在数据并行系统中,每个计算设备都有整个神经网络模型的完整副本(Model Replica),进行迭代时,每个计算设备只分配了一个批次数据样本的子集,并根据该批次样本子集的数据进行网络模型的前向计算。如下所示:


2.模型并行

  模型并行(Model Parallelism)往往用于解决单节点内存不足的问题。模型并行可以从计算图角度,以下两种形式进行切分:按模型的层切分到不同设备,即层间并行或算子间并行(Inter-operator Parallelism),也称之为流水线并行(Pipeline Parallelism,PP);将计算图层内的参数切分到不同设备,即层内并行或算子内并行(Intra-operator Parallelism),也称之为张量并行(Tensor Parallelism,TP)。如下所示:


3.混合并行

  混合并行(Hybrid Parallelism,HP)是将多种并行策略如数据并行、流水线并行和张量并行等进行混合使用。通过结合不同的并行策略,混合并行可以充分发挥各种并行策略的优点,以最大程度地提高计算性能和效率。如下所示:



4.DeepSpeed 3D并行策略示意图

  图中给出了包含32个计算设备进行3D并行的例子。神经网络的各层分为4个流水线阶段。每个流水线阶段中的层在4个张量并行计算设备之间进一步划分。最后,每个流水线阶段有两个数据并行实例,使用ZeRO内存优化在这2个副本之间划分优化器状态量。如下所示:



5.典型HPC集群硬件组成

  整个计算集群包含大量带有计算加速设备的服务器。每个服务器中往往有多个计算加速设备(通常2-16个)。多个服务器会被放置在一个机柜(Rack)中,服务器通过架顶交换机(Top of Rack Switch,ToR)连接网络。在架顶交换机满载的情况下,可以通过在架顶交换机间增加骨干交换机(Spine Switch)进一步接入新的机柜。这种连接服务器的拓扑结构往往是一个多层树(Multi-Level Tree)。如下所示:

三.如何存储参数

1.Model States

解析:模型本身相关且必须存储的内容,如下所示:

(1)Parameters:模型参数

(2)Gradients:模型梯度

(3)Optimizer States:Adam优化算法中的momentum和variance

2.Residual States

解析:非模型本身必须,但在训练过程中产生的内容,如下所示:

(1)Activation:激活值

(2)Temporary Buffers:临时存储

(3)Unusable Fragmented Memory:碎片化存储空间

3.混合精度训练

解析:混合精度训练就是一部分参数使用FP16(4B)存储,另一部分参数使用FP16或BF16(2B)存储,以此来减轻存储压力。FP32中第31位为符号位,第30到第23位用于表示指数,第22到第0位用于表示尾数。FP16中第15位为符号位,第14到第10位用于表示指数,第9到第用于表示尾数。BF16中第15位为符号位,第14到第7位用于表示指数,第6到第0位用于表示尾数。如下所示:


  混合精度优化过程,如下所示:

四.如何优化储存

  零冗余优化器(ZeRO)是一种用于大规模分布式深度学习的新颖内存优化技术,它可以大大减少模型和数据并行性所需的资源,同时可以大量增加可训练的参数数量。本质就是用完即弃,需要再补。如下所示:


  ZeRO是一系列显存优化方法的统称,它分为ZeRO-DP(Zero Redundancy Optimizer-Data Parallel)和ZeRO-R(Zero Redundancy Optimizer-Reduce)两部分。如下所示:

1.ZeRO-DP

(1)ZeRO-1

ZeRO-1对优化器状态都进行分片,占用内存为原始的1/4,通信容量与数据并行性相同。

(2)ZeRO-2

ZeRO-2对优化器状态和梯度都进行分片,占用内存为原始的1/8,通信容量与数据并行性相同。

(3)ZeRO-3

ZeRO-3对优化器状态、梯度以及模型参数都进行分片,内存减少与数据并行度和复杂度成线性关系,同时通信容量是数据并行性的1.5倍。

论文:ZeRO:Memory Optimizations Toward Training Trillion Parameter Models:https://arxiv.org/pdf/1910.02054.pdf

2.ZeRO-R

(1)激活检查点(Partitioned Activation Checkpointing)

activation的存储非常灵活,更需要设计好实验。

(2)临时缓冲区(Constant Size Buffer)

固定大小的内存Buffer。

(3)空间管理(Memory Defragmentation)

主要是将碎片化内存空间重新整合为连续存储空间。

3.ZeRO-Offload

  本质就是显存不够,内存来凑。ZeRO-Offload分为Offload Strategy和Offload Schedule两部分,前者解决如何在GPU和CPU间划分模型的问题,后者解决如何调度计算和通信的问题。

论文:ZeRO-Offload:Democratizing Billion-Scale Model Training:https://arxiv.org/pdf/2101.06840.pdf

4.ZeRO-Infinity

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

论文:ZeRO-Infinity:Breaking the GPU Memory Wall for Extreme Scale Deep Learning:https://arxiv.org/pdf/2104.07857.pdf



  本文只是一个大纲框架,后续打算针对DeepSpeed和Megatron-LM框架写一个源码解读教程,以前总认为写软件没啥意思,现在发现分布式机器学习系统还是很有意思的,如果算法给力,直观可见的节省存储,提高训练效率,降低推理的延时和增加高吞吐量。

参考文献:

[1]DeepSpeed项目地址:https://github.com/microsoft/DeepSpeed

[2]DeepSpeed训练:https://www.deepspeed.ai/training/

[3]DeepSpeed推理:https://www.deepspeed.ai/inference

[4]DeepSpeed压缩:https://www.deepspeed.ai/compression

[5]DeepSpeed4Science网站和教程:https://deepspeed4science.ai/和https://www.deepspeed.ai/deepspeed4science/

[6]DeepSpeed入门:https://www.deepspeed.ai/getting-started/

[7]DeepSpeed JSON配置:https://www.deepspeed.ai/docs/config-json/

[8]DeepSpeed API文档:https://deepspeed.readthedocs.io/en/latest/

[9]DeepSpeed教程:https://www.deepspeed.ai/tutorials/

[10]DeepSpeed博客:https://www.deepspeed.ai/posts/

[11]deepspeed-mii:https://github.com/microsoft/deepspeed-mii

[12]Transformer DeepSpeed集成:https://huggingface.co/docs/transformers/main/main_classes/deepspeed

[13]DeepSpeed官方文档:https://deepspeed.readthedocs.io/en/latest/

[14]ZeRO & DeepSpeed: New system optimizations enable training models with over 100 billion parameters:https://www.microsoft.com/en-us/research/blog/ZeRO-deepspeed-new-system-optimizations-enable-training-models-with-over-100-billion-parameters/

[15]《大规模语言模型:从理论到实践》

DeepSpeed框架:1-大纲和资料梳理的更多相关文章

  1. 《精通Python爬虫框架Scrapy》学习资料

    <精通Python爬虫框架Scrapy>学习资料 百度网盘:https://pan.baidu.com/s/1ACOYulLLpp9J7Q7src2rVA

  2. 【微服务】使用spring cloud搭建微服务框架,整理学习资料

    写在前面 使用spring cloud搭建微服务框架,是我最近最主要的工作之一,一开始我使用bubbo加zookeeper制作了一个基于dubbo的微服务框架,然后被架构师否了,架构师曰:此物过时.随 ...

  3. Java集合框架系列大纲

    ###Java集合框架之简述 Java集合框架之Collection Java集合框架之Iterator Java集合框架之HashSet Java集合框架之TreeSet Java集合框架之Link ...

  4. Java基础19:Java集合框架梳理

    更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...

  5. 最新 iOS 框架整体梳理(二)

    在前面一篇中整理出来了一些了,下面的内容是接着上面一篇的接着整理.上篇具体的内容可以点击这里查看:   最新 iOS 框架整体梳理(一) Part - 2          34.CoreTeleph ...

  6. 最全各种系统版本的XPosed框架资料下载整理

    由于XPosed在不同安卓系统版本中对应的版本不同,给很多新手造成极大困扰,本文作者经过几番努力,给大家整理了各个版本对应的xposed框架版本以及相关资料,并附上相关下载链接,希望对大伙有所帮助. ...

  7. 【深度学习Deep Learning】资料大全

    最近在学深度学习相关的东西,在网上搜集到了一些不错的资料,现在汇总一下: Free Online Books  by Yoshua Bengio, Ian Goodfellow and Aaron C ...

  8. 机器学习(Machine Learning)&深度学习(Deep Learning)资料(Chapter 2)

    ##机器学习(Machine Learning)&深度学习(Deep Learning)资料(Chapter 2)---#####注:机器学习资料[篇目一](https://github.co ...

  9. 前端Js框架汇总【转】

    概述: 有些日子没有正襟危坐写博客了,互联网飞速发展的时代,技术更新迭代的速度也在加快.看着Java.Js.Swift在各领域心花路放,也是煞是羡慕.寻了寻.net的消息,也是振奋人心,.net co ...

  10. WEB前端JS与UI框架

    前端Js框架汇总 概述: 有些日子没有正襟危坐写博客了,互联网飞速发展的时代,技术更新迭代的速度也在加快.看着Java.Js.Swift在各领域心花路放,也是煞是羡慕.寻了寻.net的消息,也是振奋人 ...

随机推荐

  1. 怎么把 session 中的实体类转换回来

    例子 : 如上比如user user1=new user(): user1.id=1: user1.name="张三": session["user1"]=us ...

  2. linux内核vmlinux的编译过程(七)

    一. vmlinux目标及其构建规则 定义在顶层Makefile中,如下: # The all: target is the default when no target is given on th ...

  3. Go语言的Printf用法

    在 Go 语言中,Printf 是用于格式化输出的函数,用于将数据以指定格式打印到标准输出或其他输出流.其中,%p 是 Printf 函数的一个格式化动词,用于输出指针的值. 以下是 %p 的详细说明 ...

  4. 代码随想录算法训练营第四天|力扣24.两两交换链表节点、力扣19.删除链表的倒数第N个结点、力扣面试02.07链表相交、力扣142.环形链表

    两两交换链表中的节点(力扣24.) dummyhead .next = head; cur = dummyhead; while(cur.next!=null&&cur.next.ne ...

  5. Docker本地搭建个人企业私有云盘seafile搭建(完美解决ONLYOFFICE无法预览的情况)

    seafile搭建 #创建存放路径 mkdir -p /media/megrez/data/seafile/seafile-mysql/db mkdir -p /media/megrez/data/s ...

  6. debian11安装mysql5.7

    前言 mysql官网5.7版本的只找到debian10的,没有debian11的,试了下也能用. 系统版本:debian 11 mysql版本:5.7.35 步骤 下载bundle的tar包.官网地址 ...

  7. 3.0 Python 迭代器与生成器

    当我们需要处理一个大量的数据集合时,一次性将其全部读入内存并处理可能会导致内存溢出.此时,我们可以采用迭代器Iterator和生成器Generator的方法,逐个地处理数据,从而避免内存溢出的问题. ...

  8. Html+JavaScript实现手写签名

    前言 Hello各位,本葡萄又来啦,今天遇到的场景是这样的:在日常业务流程中,经常需要某一流程环节中相关责任人员进行审批签字,早期许多公司为了省事就直接会把这位负责人的签名以键盘打字(楷体)的形式打印 ...

  9. Linux下后台运行Java程序

    1.背景描述 用Java编写了一个程序(可执行的jar),需要在Linux中启动并持续运行 1.1.直接执行程序 直接执行程序后,在程序执行期间,无法在当前会话中再执行其他操作 1.2.直接执行程序后 ...

  10. 分布式测试插件 pytest-xdist 使用详解

    使用背景: 大型测试套件:当你的测试套件非常庞大,包含了大量的测试用例时,pytest-xdist可以通过并行执行来加速整体的测试过程.它利用多个进程或计算机的计算资源,可以显著减少测试执行的时间. ...