news 2026/7/14 22:49:09

DeepSpeed解读

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSpeed解读

DeepSpeed的Zero优化策略

DeepSpeed 详解

什么是 DeepSpeed?

DeepSpeed 是由微软开发的一个深度学习优化库,专门用于加速大规模模型的训练。它通过多种优化技术,使得在有限的硬件资源上训练超大规模模型成为可能。

DeepSpeed 的核心创新是ZeRO (Zero Redundancy Optimizer)技术,它通过消除数据并行训练中的内存冗余,大幅降低了训练大模型所需的显存。

ZeRO 的三个 Stage

在传统的数据并行训练中,每个 GPU 都会保存模型的完整副本,包括:

  • 模型参数 (Parameters)
  • 梯度 (Gradients)
  • 优化器状态 (Optimizer States),如 Adam 优化器的动量和方差

ZeRO 通过三个递进的 Stage 来分割这些内容:

Stage 1: 优化器状态分片 (Optimizer State Partitioning)

  • 将优化器状态分散到所有 GPU 上
  • 每个 GPU 只保存一部分参数的优化器状态
  • 内存节省约 4 倍(对于 Adam 优化器)

Stage 2: 梯度分片 (Gradient Partitioning)

  • 在 Stage 1 基础上,还将梯度分散到所有 GPU
  • 每个 GPU 只保存对应参数分片的梯度
  • 内存节省约 8 倍

Stage 3: 参数分片 (Parameter Partitioning)

  • 连模型参数本身也分散到所有 GPU
  • 每个 GPU 只永久保存一部分参数
  • 前向和反向传播时动态获取需要的参数
  • 内存节省与 GPU 数量成正比(N 个 GPU 节省 N 倍)

实际例子

假设我们有一个简单的模型,4 个 GPU,来看看不同 Stage 的区别:

场景设定

  • 模型参数量: 1B (10亿参数)
  • 每个参数: 4 字节 (fp32)
  • GPU 数量: 4 个
  • 优化器: Adam (需要 2 份额外状态: momentum 和 variance)

传统数据并行 (无 ZeRO)

每个 GPU 的内存占用: - 参数: 1B × 4 字节 = 4GB - 梯度: 1B × 4 字节 = 4GB - 优化器状态: 1B × 4 × 2 = 8GB (momentum + variance) 总计: 16GB × 4 个 GPU = 64GB 所有数据在每个 GPU 上都是完整的副本!

ZeRO Stage 1

每个 GPU 的内存占用: - 参数: 4GB (完整副本) - 梯度: 4GB (完整副本) - 优化器状态: 8GB ÷ 4 = 2GB (分片!) 总计: 10GB × 4 个 GPU = 40GB 节省: 37.5%

ZeRO Stage 2

每个 GPU 的内存占用: - 参数: 4GB (完整副本) - 梯度: 4GB ÷ 4 = 1GB (分片!) - 优化器状态: 2GB (分片) 总计: 7GB × 4 个 GPU = 28GB 节省: 56.25%

ZeRO Stage 3

每个 GPU 的内存占用: - 参数: 4GB ÷ 4 = 1GB (分片!) - 梯度: 1GB (分片) - 优化器状态: 2GB (分片) 总计: 4GB × 4 个 GPU = 16GB 节省: 75%

PyTorch 代码示例

importtorchfromtransformersimportAutoModelForCausalLMimportdeepspeed# 1. 准备模型model=AutoModelForCausalLM.from_pretrained("gpt2")# 2. DeepSpeed 配置 - Stage 1config_stage1={"train_batch_size":16,"gradient_accumulation_steps":1,"optimizer":{"type":"Adam","params":{"lr":1e-5}},"zero_optimization":{"stage":1# 只分片优化器状态}}# 3. DeepSpeed 配置 - Stage 2config_stage2={"train_batch_size":16,"gradient_accumulation_steps":1,"optimizer":{"type":"Adam","params":{"lr":1e-5}},"zero_optimization":{"stage":2,# 分片优化器状态 + 梯度"allgather_bucket_size":2e8,"reduce_bucket_size":2e8}}# 4. DeepSpeed 配置 - Stage 3config_stage3={"train_batch_size":16,"gradient_accumulation_steps":1,"optimizer":{"type":"Adam","params":{"lr":1e-5}},"zero_optimization":{"stage":3,# 分片所有内容"offload_optimizer":{"device":"cpu"# 可选: 卸载到CPU进一步节省显存},"offload_param":{"device":"cpu"}}}# 5. 初始化 DeepSpeedmodel_engine,optimizer,_,_=deepspeed.initialize(model=model,config=config_stage2# 使用 Stage 2)# 6. 训练循环forbatchindataloader:loss=model_engine(batch)model_engine.backward(loss)model_engine.step()

如何选择 Stage?

  • Stage 1: 适合中等大小模型,内存压力不大时
  • Stage 2: 最常用,性能和内存平衡较好
  • Stage 3: 训练超大模型(如 175B GPT-3),显存非常紧张时

Stage 越高,内存效率越好,但通信开销也越大。实际使用时需要根据模型大小、GPU 数量和带宽来权衡。

希望这个解释能帮你理解 DeepSpeed 和 ZeRO 的工作原理!

DeepSpeed ZeRO-Offload 技术解析

ZeRO-Offload是 DeepSpeed 中的一项内存优化技术,它是 ZeRO(Zero Redundancy Optimizer)的扩展。其核心思想是将部分训练状态(如优化器状态、梯度等)从 GPU 卸载到 CPU 内存,从而在有限的 GPU 内存下训练更大的模型。

工作原理

ZeRO-Offload 通过以下方式节省 GPU 内存:

  1. 优化器状态卸载到 CPU:将 Adam 等优化器的动量和方差状态存储在 CPU 内存中
  2. 在 CPU 上执行优化器更新:参数更新计算在 CPU 上进行
  3. 梯度计算仍在 GPU:保持前向和反向传播的高效性
  4. 异步数据传输:GPU 和 CPU 之间的数据传输与计算重叠

实际例子

例子 1:基本配置

importdeepspeed# DeepSpeed 配置文件ds_config={"train_batch_size":16,"zero_optimization":{"stage":2,# 使用 ZeRO-2"offload_optimizer":{"device":"cpu",# 将优化器状态卸载到 CPU"pin_memory":True# 使用锁页内存加速传输}},"fp16":{"enabled":True}}# 初始化 DeepSpeedmodel_engine,optimizer,_,_=deepspeed.initialize(model=model,config=ds_config)

例子 2:同时卸载优化器和梯度

ds_config={"zero_optimization":{"stage":2,"offload_optimizer":{"device":"cpu","pin_memory":True},"offload_param":{"device":"cpu",# 将参数也卸载到 CPU"pin_memory":True}}}

实际效果对比

假设训练一个 10B 参数的模型:

方案GPU 内存需求训练速度
标准训练~80GB100%
ZeRO-2~40GB95%
ZeRO-2 + Offload~20GB70-80%

适用场景

  • GPU 内存有限:单卡训练大模型
  • 成本优化:用较便宜的 GPU(如 RTX 3090)训练中大型模型
  • 原型开发:快速实验而无需多卡集群

ZeRO-Offload 巧妙地平衡了内存和速度,让更多研究者和开发者能够训练大规模模型。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 7:21:41

Function Calling

文章目录Function Calling在大模型中的作用Function Calling在大模型中的作用 扩展模型能力 大模型本身无法直接操作外部系统(如数据库、计算工具),但通过调用预设函数,可以完成: 实时数据获取(天气、股价…

作者头像 李华
网站建设 2026/7/14 4:11:15

mysql | 环境变量问题及其配置方法详解

前言 当安装 mysql 环境时,没有选择配置环境变量情况下: 直接打开命令提示符(cmd)窗口运行 mysql 命令,会出现以下报错: ‘mysql’不是内部或外部命令,也不是可运行的程序或批处理文件。如下…

作者头像 李华
网站建设 2026/7/14 12:47:19

能省一点是一点!这2个免费降AI率的工具,降AI效果也很好!

3个实测免费的降AIGC率工具,顺利通过ai率查重! AI 检测本身就没有公开算法,降 AI 工具更像黑箱。如果降AI率连一次免费试用都不给,那风险太大了。万一AI率没有降下来,又不能退,少则几元多则几十。 对于学…

作者头像 李华
网站建设 2026/7/10 5:21:23

基于java的SpringBoot/SSM+Vue+uniapp的心理咨询预约管理的详细设计和实现(源码+lw+部署文档+讲解等)

文章目录 前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus 系统测试系统测试目的系统功能测试系统测试结论 为什么选择我代码参考数据库参考源码获取 前言 🌞博主介绍:✌全网粉丝15W,CSDN特邀作者、211毕业、高…

作者头像 李华
网站建设 2026/7/13 13:21:17

【2025终极测评】10款常见降AI率工具大汇总(含0元免费降AI版本)

💡写论文最怕什么? 不是查重,而是那句——“AI率过高”。 现在越来越多学校查论文降aigc报告。 我当时AI率高达98%,整个人快崩溃。 为了把那篇论文救回来,我实测了10款热门降ai率工具, 有免费的&#xff0c…

作者头像 李华