news 2026/4/17 19:37:01

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/4/15 3:05:54

常用的电路保护元件

电子电路很容易在过压、过流、浪涌等情况发生的时候损坏,随着技术的发展,电子电路的产品日益多样化和复杂化,而电路保护则变得尤为重要。电路保护元件也从简单的玻璃管保险丝,变得种类更多,防护性能更优越。电路保护的…

作者头像 李华
网站建设 2026/4/15 16:31:56

mysql | limit 用法详解及注意事项

mysql 中的 limit 用来限制 select 查询返回的行数,程序中常被用作分页查询。一、limit 用法及示例(一)基础用法及示例语法:select * from 表名 limit [offset,] count参数说明:offset:偏移量,即…

作者头像 李华
网站建设 2026/4/18 8:06:46

读不懂诗歌:钟摆的胎动里倒游的鱼群正在翻译冰层

439、测不准——灵遁者电子在瓶中旋转时樵夫正举起斧头整个森林的寂静蜷缩成一道波函数被一声声鸟鸣测量440、战火沉思——灵遁者战场上,生命如蝼蚁般脆弱,瞬间消逝,不留一丝痕迹。灵魂在枪林弹雨中颤抖,寻找着救赎,却…

作者头像 李华
网站建设 2026/4/18 5:31:57

2个真正能用的免费降AI率的工具,知网AIGC率低于15%!

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

作者头像 李华
网站建设 2026/4/18 3:01:59

别再踩坑了!6款实测有效的降ai工具推荐,保姆级教你降低ai率!

你的论文是不是AI率超高?一查降ai率结果80%以上? 别急,这种情况很多人遇到过。 用AI工具写论文确实快,但“AI味”太浓就容易翻车。 今天我就来分享几款自己用过、真心能打的ai降ai工具,从免费降ai率工具到专业级都涵…

作者头像 李华
网站建设 2026/4/10 0:39:52

【Memory协议栈】AUTOSAR架构下NvM_ReadAll时间优化的实用方案

目录 前言 正文 1.常见的优化办法 2.实用的优化办法 2.1 优化原理 2.2 具体实施步骤 2.3. 验证效果 3.总结 前言 熟悉AUTOSAR架构的工程师应该都知道NvM_ReadAll一般放在ECU的上电Sequence当中,且在NvM_ReadAll之后有一个do while{}循环等到NvM Stack完成ReadAll的处理…

作者头像 李华