Zero系列三部曲:Zero、Zero-Offload、Zero-Infinity

news2024/11/18 9:28:04

Zero系列三部曲:Zero、Zero-Offload、Zero-Infinity

  • Zero
    • Introduction
    • Zero DP
      • 流程图详解
    • Zero-R
  • Zero-Offload
  • Zero- Infinity
  • reference

Zero

Introduction

以数据并行为例,在训练的时候,首先把模型参数在每个GPU上复制一份,然后把batch的数据平均拆开分配到多个GPU上进行计算,计算完再返回来合并。

当把1B参数精度为fp32的模型加载进需要4G,fp16需要2G,int 8 则需要1G。目前训练的模型都是采用fp32\16混合精度训练,由于Nvidia的显卡在float16上的计算速度要比float32快几倍。但是如果只使用float16训练,会产生一些局限性,当由于精度不够,在累加梯度的时候,可能好几个很小的数相加还是很小,导致梯度消失,反之也是如此。于是现在的主流方法是采用混合的训练方法,首先以float16前向计算计算loss,当在计算梯度的时候,会把float16为转换为float32完成计算,然后在转换为16位完成后续的反向传播,这样似乎很好的解决了问题,速度、精度、稳定性三者兼得。

实则不是如此,目前在训练大模型的时候,一般默认采用Adam优化器,它对lr不是那么敏感,方便调参,首先看下面图回顾一下Adam的计算流程:

  1. 首先对整个batch梯度求和平均,然后利用动量法的思想对梯度平滑。
  2. 与SGDM不同,还会对梯度权重做限制,让所有权重和为1。
  3. 然后计算梯度方差。

位(bit)是二进制中的基本单位,它是指计算机内存中存储信息的最小单位,一个位只能存储0或1。字节(byte)是计算机中的常用存储单元,它表示8个二进制位的集合。因此,1字节等于8位。
一个float32的模型参数有32个bit,1byte=8bit,一个float32参数就是4byte。
1024byte=1kb

假设模型参数为¥,那么GPU就需要存储float16模型参数2¥,梯度2¥,由于采用混合精度训练,还需要float32的模型参数4¥用来计算梯度,由于用的adam,还需要维护4¥的动量与4¥的梯度方差,那么加在一起就是(2+2+(4+4+4))¥。

但是其中的4+4+4只有在参数更新的时候才会起作用,于是作者的就想从这里找突破口。

Zero DP

在这里插入图片描述
作者采取三个方法优化内存,Pos、Pg、Pp。
大体思路都是一样的,把每个模型的参数、梯度、优化器状态分别平均分给所有的模型,当时计算需要用到其他卡的内容是,通过GPU之间的通讯传输,以通讯换内存。

其中前两个方法不增加通讯成本,第三个方法会增加GPU之间的通信成本。

流程图详解

微软官方视频介绍

这表示一个Transformer block,每个白色方块代表1个layer。
在这里插入图片描述
现在有粉色的数据集与四块GPU
在这里插入图片描述
以数据并行的方式先把数据分成四份放入GPU
在这里插入图片描述
其中每个transformer block下面对应两列 彩色的小方块,表示block占用的内存。
在这里插入图片描述
其中蓝色表示fp16参数,橙色表示fp16梯度,绿色表示Adam state
在这里插入图片描述
block上面的蓝色表示储存activations的 buffer
在这里插入图片描述
通过上面所说的Zero三个阶段把模型各个模型占用内存分为四块,每个GPU只保留其中一块,计作M0、M1、M2、M3
在这里插入图片描述
在前向传播的过程中,首先把M0的蓝色部分(也就是模型fp16参数)传送给其他GPU,它们的区别就是没gpu上的数据不同
在这里插入图片描述
完成这部分的前向计算后,删除参数,继续后面的前向计算。
在这里插入图片描述
在计算最后一块的前向计算后,模型参数先不删除,完成前向计算后,每个GPU分别计算各自的Loss
在这里插入图片描述
然后开始执行反向传播,每个GPU首先计算M3对应的梯度,然后GPU012把对应的梯度传送给GPU3,GPU3将梯度累加。
在这里插入图片描述
然后其他GPU删除各自M3位置上的激活函数、参数、梯度,只保留GPU3的。
在这里插入图片描述
然后继续反向传播,用同样的方法:传递参数、计算梯度、传递梯度、累加梯度、删除不需要的activations、weight、gradient.
完成上述操作后,现在每个GPU都有对用的部分参数与全局的梯度,开始更新参数通过Adam,首先把一些转换fp32 的参数、梯度、动量。
在这里插入图片描述
然后把更新完成的fp32参数转换成fp16,然后传替换上面的第一层的参数。在这里插入图片描述

Zero-R

激活函数:在前向传播计算完成激活函数之后,对把激活值丢弃,由于计算图还在,等到反向传播的时候在此计算激活值,算力换内存。或者采取一个与cpu执行一个换入换出的操作。

临时缓冲区:模型训练过程中经常会创建一些大小不等的临时缓冲区,比如对梯度进行AllReduce啥的,解决办法就是预先创建一个固定的缓冲区,训练过程中不再动态创建,如果要传输的数据较小,则多组数据bucket后再一次性传输,提高效率。

内存碎片:显存出现碎片的一大原因是时候gradient checkpointing后,不断地创建和销毁那些不保存的激活值,解决方法是预先分配一块连续的显存,将常驻显存的模型状态和checkpointed activation存在里面,剩余显存用于动态创建和销毁discarded activation复用了操作系统对内存的优化,不断内存整理。

Zero-Offload

参数不够、内存来凑!
上面Zero3的流程,我们用下面的图来表示,⭕️表示state,正方形表示计算图,箭头表示数据流向、M表示模型参数,float2half表示32位转16位
在这里插入图片描述
zero-offload要做的事就是把一步切开,放入cpu中,如下图:
在这里插入图片描述
CPU与GPU通信数据是很大的,切开的只是传播gradient16的时候,这样保证传播数据量最小。前向传播,反向传播在GPU上,更新参数在cpu上。

同时
GPU在计算梯度的同时也在把计算好的梯度传递给CPU,当计算梯度完成时,CPU也同时获得了所有的梯度,CPU更新参数的过程也是如此,动态同步更新参数。
在这里插入图片描述

Zero- Infinity

背景:显卡的显存赶不上模型参数的增长
在这里插入图片描述
在这里插入图片描述

reference

https://arxiv.org/pdf/2101.06840.pdf
https://arxiv.org/abs/1910.02054
https://arxiv.org/pdf/2104.07857.pdf

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

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

相关文章

IP报文解析(TCP、UDP、 ICMP)及代码分享(C++)

一、OSI模型与TCP/IP协议栈 1.1 OSI 7层模型: 应用层: 功能:用户接口,文件传输、电子邮件、虚拟终端、文件服务 设备:网关 协议:HTTP、TFTP、SMTP、FTP、SNMP、DNS、Telnet 表示层: 功能&…

Spring 面试题总结(2023最新版)

文章目录 1、谈谈你对Spring的理解?1.1 发展历程1.2 Spirng的组成1.3 Spring的好处 2、Autowired和Resource的区别2.1 共同点:2.2 Autowired2.3 Resource2.3.1 Resource的装配顺序 3、Spring常用注解3.1、给容器中注入组件3.1.1 包扫描组件标注注解3.1.2…

复数的基本知识

复数的基本知识 文章目录 复数的基本知识前言表示方法百度百科简单来说: 复数的运算 前言 这里只有一点点关于复数的知识,主要是最近的FFT要用到。 表示方法 百度百科 我们把形如 abi (a,b均为实数)的数称为复数,其…

c++ “拷贝构造,运算符重载”

1.拷贝构造 拷贝构造的意思为:创造一个对象并拷贝另一个对象. 拷贝构造的名字与类的名字一致,参数一般为引用,若类中为无拷贝构造,编译器会自动生成默认拷贝构造函数,这种默认的拷贝构造函数只能拷贝内容,不…

安装并使用JupyterLab

背景 JupyterLab 是用于笔记本、代码和数据的最新的基于 Web 的交互式开发环境。其灵活的界面允许用户配置和安排数据科学、科学计算、机器学习方面的工作流程。模块化设计邀请扩展来扩展和丰富功能。 部署 要在本机搭建 Jupyter Notebook 平台进行机器学习项目,…

【Python入门篇】——Python基础语法(字符串扩展和格式化的精度控制)

作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: Python入门,本专栏主要内容为Python的基础语法,Python中的选择循环语句…

网络安全之IPSEC路由基本配置

目录 网络安全之IPSEC路由基本配置 IPSEC配置的前提分析 协议分析 传输模式分析​编辑 IPSEC路由中的配置 图谱图 配置公网可达 R1配置IKE SA的安全提议 R1配置 IKE SA 的身份认证信息 R3配置IKE SA的安全提议 R3配置 IKE SA 的身份认证信息 R1配置IPSEC的安全提议…

112-Linux_mysql数据库的安装

文章目录 一.数据库介绍1.数据库2.数据库的分类 二.mysql安装及设置1.安装mysql2.初始化配置(1)设置数据库不进行密码强校验(2)设置root管理员密码(3)设置是否要删除匿名用户,这里不删除(4)设置是否允许root用户远程登录,这里设置允许(5)是否删除test库&…

硬件设计 之 PCIe常用知识

以下是本人在自己在设计PCIe中常遇到的一些知识,对他们进行了简单整理一下,包括基本定义、传输速率、layout要求等。比如作为硬件工程师要了解芯片架构,哪些PCIe接口可以使用,使用这些PCIe要做什么,需要使用PCIe x1还是…

msvc编译opencascade和vtk

文章目录 msvc编译opencascade和vtk下载源码和第三方库开始编译VTK开始编译OCC msvc编译opencascade和vtk 下载源码和第三方库 opencascade源码 我下载的时候最新版本是7.7.0 第三方库文件 这里面标出来的是必须的文件,如果你需要别的,也可以下载其他的…

JNI开发

文件结构(选中的为生成的) CMake构建不需要执行命令,会自动生成so文件打包进apk Android mk构建需要执行命令生成so文件,再打包进apk。命令如下。 # 在jni目录下执行 # 生成com_demo_cppproject_OtherNdkTest.h头文件 javac -h .…

[MySQL / Mariadb] 数据库学习-Linux中二进制方式安装MySQL5.7

Linux中二进制方式安装MySQL5.7 安装安装方式官网下载安装包创建用户组mysql,用户和目录把下载的安装包,放到/home/mysql/将本地文件拷贝到远程: scp 文件名 –用户名计算机IP或者计算机名称:远程路径 验证包解压安装包,移动到/us…

【前端面试题】深拷贝的终极实现

大厂面试题分享 面试题库 前后端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 web前端面试题库 VS java后端面试题库大全 引子 通过本文可以学习到深拷贝的三种写法的实现思路与性能差异 首先,我们要理…

Hystrix 简单聊聊断路器/熔断器

本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注"慕课网"! 作者:风间影月|慕课网讲师 什么是Hystrix Hystrix 在SpringCloud中负责服务熔断服务降级的作用。 Hystrix 存在的目的也是…

从 Elasticsearch 到 Apache Doris,10 倍性价比的新一代日志存储分析平台

作者介绍:肖康,SelectDB 技术副总裁 导语 日志数据的处理与分析是最典型的大数据分析场景之一,过去业内以 Elasticsearch 和 Grafana Loki 为代表的两类架构难以同时兼顾高吞吐实时写入、低成本海量存储、实时文本检索的需求。Apache Doris…

114-Linux_mysql基本操作

文章目录 一.数据库的基本操作1.数据库的登录及退出(1)连接数据库:(2)退出数据库 2.查看所有数据库3.显示时间4.显示数据库版本5.创建数据库6.查看创建数据库的语句7.查看当前使用的数据库8.查看当前用户9.使用某个数据库10.删除数据库 一.数据库的基本操作 1.数据…

训练计划安排(练一休一训练分化+倒金字塔训练法)

目录 练一休一训练分化每次训练的组数12-15组 (4-5个动作)QA 倒金字塔训练法倒金字塔热身正式组常见误区: 训练补剂bcaa咖啡因肌酸蛋白粉 如何降低皮质醇水平如何提升睾酮水平文献出处睡眠8h摄入适量脂肪(0.8g每公斤体重&#xff…

【机器学习】集成学习—Boosting—GBM(Gradient Boosting Machine)解析

【机器学习】集成学习—Boosting—GBM(Gradient Boosting Machine)解析 文章目录 【机器学习】集成学习—Boosting—GBM(Gradient Boosting Machine)解析1. 介绍2. Boosting2.1 1. 强 / 弱学习器2.1.2 AdaBoost 3. GBM3.1 GBM 特例…

如何利用ChatGPT进行论文润色-ChatGPT润色文章怎么样

ChatGPT润色文章怎么样? ChatGPT可以润色文章,使用其润色功能可以为用户提供更加整洁、清晰、文采动人的文本。但需要注意以下几点: 需要保持文本的一致性和完整性。当使用ChatGPT进行润色时,需要注意保持文本的一致性和完整性。…

单调栈的学习

文章目录 单调栈的学习什么是单调栈?单调栈模板暴力解法单调栈解法 单调栈的简单变形1.[496. 下一个更大元素 I](https://leetcode.cn/problems/next-greater-element-i/)2.[739. 每日温度](https://leetcode.cn/problems/daily-temperatures/)3.[503. 下一个更大元…