ZeRO Memory Optimizations Toward Training Trillion Parameter Models

news2024/11/25 8:16:47

1总述

Zero Redundancy Optimizer: 提高了可以被有效训练的模型的大小,极大提高了模型训练的速度。

  • 保持了较小的通信量
  • 保持较高的计算粒度

数据并行DP

  • 并没有减少每个device上的内存占用
  • 当模型有1.4B 参数时,就会超过GPU的32GB显存
  • 通过PP, MP, CPU-offload 方式解决,降低了功能性,可用性和计算效率

模型并行MP

  • 垂直切分模型,将每一层上的计算和参数分到多个设备上
  • 在同一个work node之内,带宽较高,可以使用MP,但是如果跨界点,MP的效率将大大降低

大模型中的内存占用

  1. model states :

    • optimizer states:比如Adam 算法中的动量和方差
    • 梯度
    • 参数
  2. residual states:

    • 激活值
    • 临时的buffer
    • 没有利用的内存碎片

优化Model states Memory

  • Model states 占用了训练过程中的最多内存。
  • 使用DP会在多个设备上存在整个model states的拷贝
  • MP 将model states在各个设备上进行切分,但是计算粒度很细,通信量很大。

这些方法都在整个训练过程中,静态维持着 model states, 相反ZeRO将model states切分,在有些设备上丢弃掉不属于自己的model states

ZeRO-DP: 实现和数据并行一样的通信量,和模型并行一样的内存效率。

请添加图片描述

ZeRO-DP 有三种主要策略, 这三种策略逐层开启:

  1. Optimizer State Partition: 将内存消耗减少4倍, 通信量保持不变
  2. Gradiant Partition: 将内存消耗减少8倍,保持通信量不变
  3. Parameter Partition: 内存消耗按照 DP的并行度线性缩减。通信量将变成原先的1.5倍

优化 Residual States Memory

ZeRO-R

  1. 需要存储激活值,以便于反向传播的计算。使用检查点对于大模型来说还不够用。将激活值进行划分,以去除MP方法中的重复激活值。( 这里还是有点不太懂,最好还是能深入看一下模型并行的细节)
  2. 将临时 buffer 固定到合适的大小,在内存占用和计算效率之间实现balance
  3. 由于有的数据memory的生命周期较长,比如参数所占用的内存。但是中间结果占用内存的生命周期短。这种不同生命周期的内存相互交错会造成内存的碎片化。因此,在内存中预先开辟指定大小的内存,用于长生命周期的内存分配。此外,这样做也减少了在分配内存时,硬件查找空余内存的时间。

使用ZeRO-DP的方式,我们可以在通用GPU上容纳较大的模型,因此不需要MP对模型进行切分。并且,使用DP的方式,不切分模型也更加简单。

但是有些情况下,我们还是要使用MP,我们将ZeRO-DP与MP结合起来一起使用:

  1. 当模型较大时,单使用DP还是在一个GPU上不能容纳整个模型
  2. 如果使用单纯使用DP,DP并行度较高,每个GPU上都会计算一个mini-batch,这样会导致融合成的batch-size较大,较大的batch-size会使得收敛较为困难。

使用ZeRO和MP相结合,理论上可以将内存占用缩减 N d × N m N_d\times N_m Nd×Nm

2相关工作

减少内存的非并行方法

减少激活值的内存占用

  • compression
  • activation checkpointing
  • live analysis

CPU Offload

将model states 转移到PCU的内存上。
在ZeRO-R中,可以将激活值的检查点转移到CPU内存中。

训练的优化器 Optimizers

由于ZeRO可以减少,内存的占用,因此节省下来的内存还支持添加其他的optimizers

3 内存消耗状况分析

Model States 内存消耗

Model states消耗了大部分内存。

考虑Adam optimizer,Adam 需要保存

  1. the time averaged momentum
  2. variance of the gradients to compute the updates.

optimizer states通常消耗了大部分内存,尤其是在混合精度训练的情况下。

  • the mixed-precision optimizer keeps an fp32 copy of the parameters as well as an fp32 copy of all the other optimizer states.
  • 此外Adam 还有一部分fp16的参数和梯度cppy

这里占用了大部分内存,但是只有当反向传播结束后,这里的参数才需要更新。

Residual Memory消耗

  • 激活值 1000亿个参数的模型,bitch-size32 ,即使使用了检查点 激活值也需要消耗60G内存。
  • 临时buffer
  • 内存碎片:

4 ZeRO: Insights and Overview

ZeRO的前提是,要保证效率。

ZeRO powered DP is based on three key insights:

  1. DP比MP拓展更加高效,是因为DP的计算粒度更大。MP的计算粒度更小。
  2. DP内存消耗高,相反MP将model states进行划分获得更高的内存效率
  3. DP MP都在训练过程中一直维护着model states

ZeRO-DP 在多个设备间将model states进行划分,每个设备上没有重复的参数。
在训练过程中,进行动态的通信,减少通信量。

减少激活值内存

  1. MP 可以划分model states 但是经常会造成激活值内存的重复。 比如,如果我们将参数层纵向切分到两个GPU上,每个GPU上都需要完整的激活值输入才能进行计算,这就造成了激活值的重复。
  2. 对于计算强度非常大的模型,可以掩盖激活值检查点数据移动的开销

管理临时buffer
ZeRO-R使用固定大小的buffer。避免在计算过程中临时buffer使用量爆炸

管理内存碎片

  • 检查点激活值的内存周期较长,普通激活值会重计算内存周期短。
  • 激活值的梯度内存周期短,参数的梯度内存周期长

将检查点激活值和参数梯度移动到预先分配好的连续内存中,避免内存碎片。

5 Deep Dive into ZeRO-DP

请添加图片描述

Optimizer State Partitioning

如果使用Adam之类的算法,并且由混合精度计算等过程,就需要有一大部分内存用于存储Adam算法所需要的变量。
如果每个设备都在运用Adam算法更新后,还保留了 optimizer的参数,这就造成了参数重复。
将Adam参数分程 N d N_d Nd 等分,每个设备上保留一份。每个设备上需要维护的 optimizer state大小变为原先的 1 N d \frac{1}{N_d} Nd1

当需要相应的参数进行Adam 算法时,使用 all-gather.

Gradient Partitioning

在反向传播过程中,先将参数广播到各个设备上。根据参数,检查点激活值,上游梯度,计算各个设备计算上的参数梯度。将参数梯度进行reduce,结果保留到对应的设备上,其他设备丢弃参数梯度。

Parameter Partitioning

将参数进行划分,当前向或者反向传播中使用到对应参数时,将参数broadcast

6 Deep Dive into ZeRO-R

Pa Partitioned Activation Checkpointing

当使用MP时,将激活值的检查点进行划分。当再反向传播需要使用激活值时,将使用 all-gather使得每个设备上都有完整的激活值检查点。

同时还可以使用CPU-offload技术。

Cb Constant Size Buffers

输入 越大,计算效率越高。
需要在内存和计算效率之间寻求平衡。

MD: Memory Defragmentation

预先分配连续的内存区域,用于长周期内存。

7 Communication Analysis of ZeRO-DP

  1. 当使用Pos、Pg时,ZeRO-DP没有引入任何额外的通信量

  2. 当使用Pos、Pg还使用Pp时,ZeRO-DP的通信量是原先的1.5倍

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

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

相关文章

P4D编程遇到乱码?别急,这里有解决方案!

P4D简介: P4D(Python for Delphi)是一种用于在Delphi开发环境中嵌入Python的技术,它允许开发人员使用Python语言编写脚本和模块,然后将其集成到Delphi应用程序中。这使得开发人员可以利用Python的强大功能来扩展和增强…

JavaWeb(7)——前端综合案例1(面向对象)

一、需求 JS进阶-day3-184-综合案例-模态框构造函数写法 二、 实现 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta…

Meta AI研究团队新AI模型:Segment Anything图像分割任务

Segment Anything是Meta AI研究团队开发的一种新的AI模型&#xff0c;用于图像分割任务。该模型可以对任何图像中的任何对象进行分割&#xff0c;即将对象从图像中"剪切"出来。Segment Anything模型&#xff08;SAM&#xff09;是一个可提示的模型&#xff0c;可以根…

Linux常用命令——dpkg-preconfigure命令

在线Linux命令查询工具 dpkg-preconfigure Debian Linux中软件包安装之前询问问题 补充说明 dpkg-preconfigure命令用于在Debian Linux中软件包安装之前询问问题。 语法 dpkg-preconfigure(选项)(参数)选项 -f&#xff1a;选择使用的前端&#xff1b; -p&#xff1a;感兴…

我国科学家揭秘河蚌铰链耐疲劳的秘密

《科学》杂志发表了中国科学技术大学俞书宏院士团队联合吴恒安教授团队的研究成果。他们揭示了河蚌铰链耐疲劳的奥秘&#xff0c;并提出了一种耐疲劳材料设计的新思路。 在此次研究中&#xff0c;研究人员探明了河蚌铰链中折扇形组织的设计原理&#xff0c;发现这种生物组织在河…

【Redis】内存数据库 Redis 基础

目录 内存数据库Redis概念Redis 安装Redis的启动方式Redis命令行客户端 Redis通用命令Redis key结构Redis value数据类型String 和基础操作Hash 和基础操作List 和基础操作Set 和基础操作Sorted_set 和基础操作 Redis的Java客户端Jedis客户端SpringDataRedis客户端自定义RedisT…

Linux下 Docker容器引擎基础(1)

简述&#xff1a; Docker的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器。通过这种容器打包应用程序&#xff0c;意味着简化了重新部署、调试这些琐碎的重复工作&#xff0c;极大的提高了工作效率。例如&#xff1a;项目从腾讯云迁移阿…

机器学习-New Optimization

机器学习(New Optimization) 前言&#xff1a; 学习资料 videopptblog 下面的PPT里面有一些符号错误&#xff0c;但是我还是按照PPT的内容编写公式&#xff0c;自己直到符号表示什么含义就好了 Notation 符号解释 θ t \theta_t θt​第 t 步时&#xff0c;模型的参数 Δ L …

CSS图片放到<div>里面,自适应宽高全部显示,点击图片跳到新页面预览

有一个需求是图片放到一个固定宽高的<div>里面&#xff0c;不管是横图还是竖图&#xff0c;都要全部显示出来并且保持图片的长宽比例不变形&#xff0c;点击图片可以跳到一个新页面预览&#xff0c;代码如下&#xff1a; <!DOCTYPE html> <html> <head>…

第六次作业 密码学

发送者为Alice 接受者为Bob 首先对原始信息进行hash运算得到信息摘要&#xff0c;然后使用发送者Alice私钥进行签名&#xff08;签名的作用是验证该信息是Alice的&#xff09;&#xff0c;然后将原始信息数字签名Alice证书&#xff08;该Alice的证书是由CA组织进行办发的&…

YOLOV8改进:更换PoolFormer主干网络

1.该文章属于YOLOV5/YOLOV7/YOLOV8改进专栏,包含大量的改进方式,主要以2023年的最新文章和2022年的文章提出改进方式。 2.提供更加详细的改进方法,如将注意力机制添加到网络的不同位置,便于做实验,也可以当做论文的创新点。 2.涨点效果:添加PoolFormer主干,有效涨点。 论…

bigemap在工程项目行业里的应用案例

一、工程单位为什么要选择bigemap : 1.地图影像清晰&#xff0c;更新及时 2.能直接用软件做等高线地形图进行投影转换配合cad来使用 3.直接在线下载卫星图和高程节省测绘时间&#xff0c;以及手机端去做数据的采集&#xff0c;对工作有帮助 二、工程单位使用场景&#xff1a; …

Stable Diffusion AI绘画初学者指南【概述、云端环境搭建】

概述、云端环境搭建 Stable Diffusion 是什么、能干啥&#xff1f; 是一种基于深度学习的图像处理技术&#xff0c;可以生成高质量的图像。它可以在不需要真实图像的情况下&#xff0c;通过文字描述来生成逼真的图像。 可以对图像进行修复、超分辨率转换&#xff0c;将低分辨…

可以写进简历的kafka优化-----吞吐量提升一倍的方法

冲突 在看到项目工程里kafka 生产端配置的batch.size为500&#xff0c;而实际业务数据平均有1K大小的时候&#xff1b;我有点懵了。是的&#xff0c;这里矛盾了&#xff1b;莫非之前的作者认为这个batch.size是发送的条数&#xff0c;而不是kafka生产端内存缓存记录的大小&…

【数据结构】手撕排序NO.2----直接插入排序与希尔排序

目录 一. 导入 二. 直接插入排序 2.1 基本思想 2.2 过程分析 2.3 代码实现 2.4 复杂度/稳定性分析 三. 希尔排序(缩小增量排序) 3.1 基本思想 3.2 过程分析 3.3 代码实现 3.4 复杂度/稳定性分析 一. 导入 本期是排序篇的第二期&#xff0c;我们的主角是插入排序。在座的各…

提高电脑寿命的维护技巧与方法分享

在维护电脑运行方面&#xff0c;我有一些自己觉得非常有用的技巧和方法。下面我将分享一些我常用的维护技巧&#xff0c;并解释为什么我会选择这样做以及这样做的好处。 首先&#xff0c;我经常清理我的电脑内部的灰尘。电脑内部的灰尘会影响散热效果&#xff0c;导致电脑发热…

Nodejs 第五章(Npm run 原理)

npm run xxx 发生了什么 按照下面的例子npm run dev 举例过程中发生了什么 读取package json 的scripts 对应的脚本命令(dev:vite),vite是个可执行脚本&#xff0c;他的查找规则是&#xff1a; 先从当前项目的node_modules/.bin去查找可执行命令vite如果没找到就去全局的node…

C++模板初阶学习

目录 1.函数模板1.1函数模板概念1.2函数模板格式1.3函数模板的原理1.4函数模板实例化隐式实例化显示实例化 1.5模板参数适配原则 2.类模板2.1类模板的定义格式2.2类模板实例化 总结 1.函数模板 如何实现一个通用的交换函数呢&#xff1f; #include<iostream> using nam…

软件外包开发的JAVA开发框架

Java的开发框架有很多&#xff0c;以下是一些常见的Java开发框架及其特点&#xff0c;每个框架都有其特定的使用场景和优势&#xff0c;开发者可以根据项目的需求选择合适的框架。今天和大家介绍常见的框架及特点&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&…

Day50 算法记录| 动态规划 17(子序列)

这里写目录标题 647. 回文子串516.最长回文子序列总结 647. 回文子串 1.动态规划和2.中心扩展 这个视频是基于上面的视频的代码 方法1:动态规划 布尔类型的dp[i][j]&#xff1a;表示区间范围[i,j] &#xff08;注意是左闭右闭&#xff09;的子串是否是回文子串&#xff0c;如…