大语言模型基础之‘显存优化‘
上一篇可扩展的训练技术(二)中,我们介绍了零冗余优化器(Zero Redundancy Optimizer, Zero),该技术由DeepSpeed代码库提出,主要用于解决数据并行中的模型冗余技术,即在数据并行训练中,每个GPU上都会存储一份完整的模型参数,这会占用大量的显存。
而Zero技术通过将模型参数分布在多个GPU上,从而减少了显存的使用。
🔍ZeRO有三种逐步细化模型参数和优化器参数的方案:
- ZeRo-1:仅优化器参数在所有GPU上平摊,模型参数和模型梯度在每张GPU上独立存储。
- ZeRo-2:优化器参数和模型梯度在所有 GPU 上平摊,模型参数在每张GPU上独立存储。
- ZeRo-3:优化器参数、模型梯度和模型参数在所有 GPU 上平摊。
下面我们举一个实际的例子来解释下各方案之间的区别。
常识:1字节(bytes)= 8位(bits)
LLaMa 7B模型,参数量为70亿,也就是70亿个参数。
模型参数常用的数据类型是FP32和FP16。
FP32:每个参数用32位(bit)浮点数存储,即4字节(Bytes)。
FP16:每个参数用16位(bit)浮点数存储,即2字节(Bytes)。
假设我们使用FP32的数据类型,将7B的权重加载到GPU中,那么需要70亿*4字节=280亿字节=28GB的显存。
假设我们使用FP16的数据类型,将7B的权重加载到GPU中,那么需要70亿*2字节=140亿字节=14GB的显存。
一般模型训练时使用混合精度训练,混合精度训练使用FP16和FP32两种数据类型,FP16用于计算,FP32用于存储,这样既能提高计算速度,又能减少显存占用。(混合精度训练的原理可以参考大语言模型基础之‘可扩展的训练技术‘(二)-混合精度训练)
优化器状态:一般训练时使用Adam优化器,Adam优化器需要维护一份fp32的模型参数(4 bytes * 7B = 28 GB)、fp32的动量参数(4 bytes * 7B = 28 GB)以及fp32的动量二阶矩参数(4 bytes * 7B = 28 GB)。
大模型训练过程中的显存占用情况如下:(由大到小)
-
优化器参数占用。
– fp32 模型参数:4 bytes * 7B = 28 GB
– fp32 动量参数:4 bytes * 7B = 28 GB
– fp32 动量二阶矩参数:4 bytes * 7B = 28 GB -
模型参数占用。
–fp 16存储,2 bytes * 7B = 14 GB -
模型梯度占用。
– fp 16存储,2 bytes * 7B = 14 GB -
激活值占用及其他。
与batch_size和序列长度有关,与上述三个参数相比,占用的显存较少。
因此,训练:
使用FP16的数据类型,不考虑训练过程中的激活值占用和其他占用的情况下,将7B的权重加载到GPU中,需要28GB(fp32 模型参数)+ 28GB(fp32 动量参数)+ 28GB(fp32 动量二阶矩参数)+ 14GB(fp16 模型参数)+ 14GB(fp16 模型梯度)= 112GB的显存。
推理大约需要14GB的显存。
下面我们来看下DeepSpeed ZeRO三个阶段ZeRO-1、ZeRO-2、ZeRO-3三种方案在显存占用上是如何节省显存的。

来自ZeRO: Memory Optimizations Toward Training Trillion Parameter Models
由上图可以看出,在训练大语言模型时,优化器参数占据了显存的大部分,因此,优化器参数的优化是显存优化的重要方向。
ZeRO-1:切分优化器参数。Pos — 将内存使用量减少 4 倍.
优化器参数在所有GPU上平摊,模型参数和模型梯度在每张GPU上独立存储。
每个GPU运行模型的整个前向和反向传播时,它会从其他GPU的参数广播中访问参数以进行更新。
优点:优化器参数的显存占用减少。
缺点:模型参数和模型梯度在每张GPU上独立存储,需要频繁的通信,通信开销大。
ZeRO-2:切分优化器参数和模型梯度。Pos+g — 将内存使用量减少 8 倍。
优化器参数和模型梯度在所有 GPU 上平摊,模型参数在每张GPU上独立存储。
优点:优化器参数和模型梯度的显存占用减少。
缺点:模型参数在每张GPU上独立存储,需要频繁的通信,通信开销大。
ZeRO-3:切分优化器参数、模型梯度和模型参数。Pos+g+p — 将内存使用量减少 Nd (GPU数量)倍。
优化器参数、模型梯度和模型参数在所有 GPU 上平摊。
优点:优化器参数、模型梯度和模型参数的显存占用减少。
缺点:通信开销大。
因此,在训练大语言模型时,我们一般使用ZeRO-3方案,该方案在显存占用上具有较好的优化效果。
以上就是关于Deepspeed库中的ZeRO-1、ZeRO-2、ZeRO-3介绍,也希望给有需要的同学一点点帮助。
后边的文章,我将会继续讲些大语言模型的相关基础知识,请各位多多支持。
📢 📢 📢
感谢各位阅读,大家的点赞👍- 关注🔥- 收藏⭐ - 评论📝 四连,都是博主坚持协作、更新高质量博文的最大动力!
相关文章:
大语言模型基础之‘显存优化‘
上一篇可扩展的训练技术(二)中,我们介绍了零冗余优化器(Zero Redundancy Optimizer, Zero),该技术由DeepSpeed代码库提出,主要用于解决数据并行中的模型冗余技术,即在数据并行训练中,每个GPU上都…...
【Nexus】Maven 私服搭建以及上传自己的Jar包
Nexus 安装 docker run -d -uroot --name nexus3 --restartalways -p 8081:8081 -v /data/nexus-data/blobs:/nexus-data/blobs -v /etc/localtime:/etc/localtime sonatype/nexus3这里也提供一下docker-composer的方法 .env 文件 VERSIONlatest CONTAINER_NAMECONTAINER_N…...
css模拟雷达扫描动画
<div class"radar-scan"><div class"radar-container" /></div> 样式: .radar-scan {background-image: linear-gradient(0deg,transparent 24%,rgba(32, 255, 77, 0.15) 25%,rgba(32, 255, 77, 0.15) 26%,transparent 27%,…...
冠珠瓷砖×郭培“惟质致美”品质主题片上映,讲述高定艺术背后的致美品质故事
168年前,一位英国服装设计师,开创了「高级定制」的先河。时至今日,从服装到各行各业「高级定制」始终代表着对完美的极致追求,成为了行业至高境界的象征。 被誉为“中国高定第一人”,高级定制服装设计师郭培࿰…...
【Java 基础(人话版)】进制转换
进制的简单介绍 整数可以使用四种不同的进制表示方式: 二进制 (Binary):由 0 和 1 组成,满 2 进 1,以 0b 或 0B 开头表示。十进制 (Decimal):由 0-9 组成,满 10 进 1,是最常用的数值表示方式。…...
3DS模拟器使用(pc+安卓)+金手指+存档互传
1、引言 3ds模拟器已经能够在手机端近乎完美模拟了,那么多的3ds游戏,比玩手机游戏舒服多了。 本人是精灵宝可梦的老玩家,从第一世代就一直在玩,刚耍完NDS的第五世代,黑白系列。现在到宝可梦XY了,需要在3d…...
SpaceClaim二次开发(4)
目录 第五章 Storing Custom Data (存储自定义数据) 5.1 文档属性 5.2 自定义属性 5.3 属性传播 第六章 Identifying Objects in ACIS and Parasolid Files(识别ACIS和Parasolid文件中的对象) 6.1 导出期间的标识符 6.2 导入和…...
Leetcode3340:检查平衡字符串
题目描述: 给你一个仅由数字 0 - 9 组成的字符串 num。如果偶数下标处的数字之和等于奇数下标处的数字之和,则认为该数字字符串是一个 平衡字符串。 如果 num 是一个 平衡字符串,则返回 true;否则,返回 false。 代码…...
Java多线程基石—内存模型
Java Memory Model Java内存模型(JMM),定义了线程如何与内存交互及线程间的可见性、有序性和原子性。 JMM屏蔽了各种硬件和操作系统的访问差异,保证Java程序在各种平台下对内存的访问都能保证一致效果。 1 JMM 可见性 一个线程…...
ArcGIS助力水文分析:数据处理、地图制作与流域特征提取
在水文水环境保护中,对于信息的采集、处理和分析是关键步骤。水文水环境及其相关数据均具有空间分布特征,传统的方法难以发挥作用。地理信息系统(GIS)强大的空间数据管理和分析功能,在空间信息处理上有独到的优势&…...
从以太网 II 到 VLAN 和 Jumbo Frame:数据帧格式解读
以太网数据帧是计算机网络通信的基本单位,在不同的应用场景中,它的格式有所不同。根据协议标准和用途,以太网数据帧主要包括以太网 II 帧、IEEE 802.3 帧、IEEE 802.1Q VLAN 帧等七种主要类型。为了更好地理解以太网的通信机制,我…...
X86 RouterOS 7.18 设置笔记六:端口映射(IPv4、IPv6)及回流问题
X86 j4125 4网口小主机折腾笔记五:PVE安装ROS RouterOS X86 RouterOS 7.18 设置笔记一:基础设置 X86 RouterOS 7.18 设置笔记二:网络基础设置(IPV4) X86 RouterOS 7.18 设置笔记三:防火墙设置(IPV4) X86 RouterOS 7.18 设置笔记四…...
将 IPoIB 驱动修改为仅使用 RC 模式
摘要 本文档详细介绍了将 Linux 内核中的 IPoIB(IP over InfiniBand)驱动修改为仅使用 RC(Reliable Connection,可靠连接)模式,并移除所有与 TCP/IP 和以太网相关部分的方法。通过这些修改,可以优化 IPoIB 驱动以适应特定的高性能计算场景,提高数据传输的可靠性和效率…...
热修复框架Tinker与Robust原理剖析
热修复框架Tinker与Robust原理剖析 一、热修复技术概述 1.1 什么是热修复 热修复(Hot Fix)是Android平台上的一种动态修复机制,它允许应用在不重新发布版本的情况下,动态修复线上bug。这种技术对于快速修复线上问题、降低用户流…...
69.Harmonyos NEXT图片预览组件应用实践(二):电商、内容与办公场景
温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! Harmonyos NEXT图片预览组件应用实践(二):电商、内容与办公场景 文章目录 Harmonyos NEXT图片预览组件应用实践…...
C题库-判断水仙花数
【数据判断】 问题1:判断水仙花数,水仙花数是指一个三位数,其各位数字的立方和等于该数本身。 方法一: #include<stdio.h>int main(void){int num,Bit,Ten,Hundred;printf("Input a number:");scanf("%d&q…...
31.Harmonyos Next仿uv-ui 组件NumberBox 步进器组件异步操作处理
Harmonyos Next仿uv-ui 组件NumberBox 步进器组件异步操作处理 文章目录 Harmonyos Next仿uv-ui 组件NumberBox 步进器组件异步操作处理1. 组件介绍2. 效果展示3. 异步操作处理3.1 异步初始化3.2 异步值更新 4. 完整示例代码5. 知识点讲解5.1 异步操作基础5.2 异步操作中的状态…...
MIPI电平标准详解
一、MIPI电平的定义与核心特性 MIPI(Mobile Industry Processor Interface) 是由 MIPI联盟 制定的移动设备接口标准,涵盖摄像头(CSI)、显示屏(DSI)、射频(RFFE)等多个领…...
使用位运算实现加法、减法、乘法和除法
使用位运算实现加法、减法、乘法和除法是一个经典的计算机科学问题。位运算通常用于低级程序设计和性能优化中,以下是如何用位运算实现这些基本数学运算。 加法 加法可以通过以下步骤实现: def add(a, b):while b ! 0:# 使用异或得到不考虑进位的加法…...
深入解析Go语言Channel:源码剖析与并发读写机制
文章目录 Channel的内部结构Channel的创建过程有缓冲Channel的并发读写机制同时读写的可能性发送操作的实现接收操作的实现 并发读写的核心机制解析互斥锁保护环形缓冲区等待队列直接传递优化Goroutine调度 实例分析:有缓冲Channel的并发读写性能优化与最佳实践缓冲…...
mac安装python没有环境变量怎么办?zsh: command not found: python
在mac电脑上,下载Python安装包进行安装之后,在终端中,输入python提示: zsh: command not found: python 一、原因分析 首先,这个问题不是因为python没有安装成功的原因,是因为python安装的时候,没有为我们添加环境变量导致的,所以我们只需要,在.zshrc配置文件中加上环…...
使用DeepSeek制作可视化图表和流程图
用DeepSeek来制作可视化图表,搭配python、mermaid、html来实现可视化,我已经测试过好几种场景,都能实现自动化的代码生成,效果还是不错的,流程如下。 统计图表 (搭配Matplotlib来做) Python中的…...
jmeter-sample
jmeter-sample http request:接口测试常用请求参数ParametersBody DataFiles Upload jdbc request配置JDBC Connection Configuration创建JDBC Requst请求 http request:接口测试常用 请求参数 Parameters 常见于get请求,与拼在接口后面是一样的效果:如…...
C++之文字修仙小游戏
1 效果 1.1 截图 游戏运行: 存档: 1.2 游玩警告 注意!不要修改装备概率,装备的概率都是凑好的数字。如果想要速升,修改灵石数量 2 代码 2.1 代码大纲 1. 游戏框架与初始化 控制台操作:通过 gotoxy() …...
C++ vector 核心知识:常用操作与示例详解
在C编程中,vector 是标准模板库(STL)中最常用的容器之一。它以其动态数组的特性、高效的尾部操作和便捷的随机访问能力,成为处理动态数据的首选工具。无论是初学者还是经验丰富的开发者,掌握 vector 的使用方法和性能优…...
结构型模式之适配器模式:让不兼容的接口兼容
在软件开发中,经常会遇到这样一种情况:系统的不同部分需要进行交互,但由于接口不兼容,导致无法直接使用。这时,适配器模式(Adapter Pattern)就能派上用场。适配器模式是设计模式中的结构型模式&…...
从零开始探索C++游戏开发:性能、控制与无限可能
一、为何选择C开发游戏? 在虚幻引擎5渲染的次世代画面背后,在《巫师3》的庞大开放世界中,在《毁灭战士》的丝滑60帧战斗里,C始终扮演着核心技术角色。这门诞生于1983年的语言,至今仍占据着游戏引擎开发语言使用率榜首…...
使用mvn archetype命令,构建自定义springboot archetype脚手架创建工程的方法
使用mvn archetype命令,构建自定义springboot archetype脚手架创建工程的方法 文章目录 使用mvn archetype命令,构建自定义springboot archetype脚手架创建工程的方法一、背景二、环境三、archetype插件配置四、基于项目构建脚手架archetype包五、检查模…...
Hutool RedisDS:Java开发中的Redis极简集成与高阶应用
在Java开发中,Redis作为高性能内存数据库,广泛应用于缓存、分布式锁等场景。然而原生的客户端操作涉及连接管理、序列化等繁琐细节。Hutool工具包提供的RedisDS模块,通过高度封装显著简化了这一过程。本文从实战角度解析其核心特性与使用技巧…...
MacOS 15.3.1 安装 GPG 提示Error: unknown or unsupported macOS version: :dunno
目录 1. 问题锁定 2. 更新 Homebrew 3. 切换到新的 Homebrew 源 4. 安装 GPG 5. 检查 macOS 版本兼容性 6. 使用 MacPorts 或其他包管理器 7. 创建密钥(生成 GPG 签名) 往期推荐 1. 问题锁定 通常是因为你的 Homebrew 版本较旧,或者你…...
