大语言模型基础之‘显存优化‘

news2025/3/15 17:20:41

上一篇可扩展的训练技术(二)中,我们介绍了零冗余优化器(Zero Redundancy Optimizer, Zero),该技术由DeepSpeed代码库提出,主要用于解决数据并行中的模型冗余技术,即在数据并行训练中,每个GPU上都会存储一份完整的模型参数,这会占用大量的显存。
而Zero技术通过将模型参数分布在多个GPU上,从而减少了显存的使用。

🔍ZeRO有三种逐步细化模型参数和优化器参数的方案:

  1. ZeRo-1:仅优化器参数在所有GPU上平摊,模型参数和模型梯度在每张GPU上独立存储。
  2. ZeRo-2:优化器参数和模型梯度在所有 GPU 上平摊,模型参数在每张GPU上独立存储。
  3. 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)。

大模型训练过程中的显存占用情况如下:(由大到小)

  1. 优化器参数占用
    – fp32 模型参数:4 bytes * 7B = 28 GB
    – fp32 动量参数:4 bytes * 7B = 28 GB
    – fp32 动量二阶矩参数:4 bytes * 7B = 28 GB

  2. 模型参数占用
    –fp 16存储,2 bytes * 7B = 14 GB

  3. 模型梯度占用
    – fp 16存储,2 bytes * 7B = 14 GB

  4. 激活值占用及其他
    与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介绍,也希望给有需要的同学一点点帮助。

后边的文章,我将会继续讲些大语言模型的相关基础知识,请各位多多支持。

📢 📢 📢
感谢各位阅读,大家的点赞👍- 关注🔥- 收藏⭐ - 评论📝 四连,都是博主坚持协作、更新高质量博文的最大动力!

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

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

相关文章

【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…

冠珠瓷砖×郭培“惟质致美”品质主题片上映,讲述高定艺术背后的致美品质故事

168年前,一位英国服装设计师,开创了「高级定制」的先河。时至今日,从服装到各行各业「高级定制」始终代表着对完美的极致追求,成为了行业至高境界的象征。 被誉为“中国高定第一人”,高级定制服装设计师郭培&#xff0…

3DS模拟器使用(pc+安卓)+金手指+存档互传

1、引言 3ds模拟器已经能够在手机端近乎完美模拟了,那么多的3ds游戏,比玩手机游戏舒服多了。 本人是精灵宝可梦的老玩家,从第一世代就一直在玩,刚耍完NDS的第五世代,黑白系列。现在到宝可梦XY了,需要在3d…

从以太网 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 设置笔记四…

69.Harmonyos NEXT图片预览组件应用实践(二):电商、内容与办公场景

温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! Harmonyos NEXT图片预览组件应用实践(二):电商、内容与办公场景 文章目录 Harmonyos NEXT图片预览组件应用实践…

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 异步操作中的状态…

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() …

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 版本较旧,或者你…

硬件驱动——51单片机:独立按键、中断、定时器/计数器

目录 一、独立按键 1.原理 2.封装函数 3.按键控制点灯 数码管 二、中断 1.原理 2.步骤 3.中断寄存器IE 4.控制寄存器TCON 5.打开外部中断0和1 三、定时器/计数器 1.原理 2.控制寄存器TCON 3.工作模式寄存器TMOD 4.按键控制频率的动态闪烁 一、独立按键 1…

P1259 黑白棋子的移动【java】【AC代码】

有 2n 个棋子排成一行,开始为位置白子全部在左边,黑子全部在右边,如下图为 n5 的情况: 移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但…

67.Harmonyos NEXT 图片预览组件之性能优化策略

温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! Harmonyos NEXT 图片预览组件之性能优化策略 文章目录 Harmonyos NEXT 图片预览组件之性能优化策略效果预览一、性能优化概述1. 性能优化的关键指标…

Windows下安装Git客户端

① 官网地址:https://git-scm.com/。 ② Git的优势 大部分操作在本地完成,不需要联网;完整性保证;尽可能添加数据而不是删除或修改数据;分支操作非常快捷流畅;与Linux 命令全面兼容。 ③ Git的安装 从官网…

SAP IBP for Supply Chain Certification Guide (Parag Bakde, Rishabh Gupta)

SAP IBP for Supply Chain Certification Guide (Parag Bakde, Rishabh Gupta)

如何处理PHP中的日期和时间问题

如何处理PHP中的日期和时间问题 在PHP开发中,日期和时间的处理是一个常见且重要的任务。无论是记录用户操作时间、生成时间戳,还是进行日期计算,PHP提供了丰富的函数和类来帮助开发者高效处理这些需求。本文将详细介绍如何在PHP中处理日期和…

TDengine 使用最佳实践

简介 阅读本文档需要具备的基础知识: Linux系统的基础知识,及基本命令网络基础知识:TCP/UDP、http、RESTful、域名解析、FQDN/hostname、hosts、防火墙、四层/七层负载均衡 本文档的阅读对象有:架构师、研发工程师,…

Spring、Spring Boot、Spring Cloud 的区别与联系

1. Spring 框架 定位:轻量级的企业级应用开发框架,核心是 IoC(控制反转) 和 AOP(面向切面编程)。 核心功能: 依赖注入(DI):通过 Autowired、Component 等注解…