DeepSpeed 是微软开源的深度学习训练与推理优化库,核心解决大模型训练中的显存墙与通信瓶颈问题。它通过 ZeRO(零冗余优化器)技术将优化器状态、梯度乃至模型参数分片到多张 GPU 上,使单集群可训练的模型规模提升一个数量级,同时提供 CPU/NVMe 卸载、混合精度训练、梯度压缩和推理加速等能力。截至 2025 年初,DeepSpeed 已发展出覆盖「预训练—微调—推理服务」全链路的工具集,是 LLM 基础设施团队绕不开的选项。本篇按照「工具速览 → 安装配置 → 快速上手 → 核心能力 → 生产部署 → 选型对比 → 应用场景 → 常见误区 → 面试题 → 学习资源」的顺序,带你从零跑通 DeepSpeed 并理解其设计取舍。

岗位关联

掌握 DeepSpeed 意味着你具备搭建与优化大规模分布式训练/推理系统的能力,这是大模型时代 AI 工程化岗位的核心竞争力。

目录
  1. 为什么需要 DeepSpeed:数据并行显存冗余 → 全栈训练/推理优化
  2. 安装与环境配置:4 步就绪
  3. 快速上手:10 分钟跑通第一个 ZeRO-2 训练
  4. 核心能力详解:5 大支柱
  5. 生产部署与监控:从上线到运维
  6. 版本迭代
  7. AI 应用场景
  8. 常见误区
  9. 面试题
工具类型
大规模分布式训练与推理优化库(开源)
开发商
Microsoft(微软)
开源协议
Apache 2.0(可商用)
GitHub Stars
无
主要语言
Python / C++(CUDA 内核)
当前版本
0.14.x(2024-12)
安装方式
pip install deepspeed
官方文档
上手难度
★★★★☆(较难,配置项多)
适合人群
LLM 训练/推理工程师、分布式系统工程师
同类工具
PyTorch FSDP、Megatron-LM、ColossalAI
托管服务
无

速览卡是工具类内容的固定首屏模块:30 秒判断「这工具是什么、能不能商用、适不适合我」。

为什么需要 DeepSpeed:数据并行显存冗余 → 全栈训练/推理优化

传统分布式数据并行(DDP)训练中,每张 GPU 都保存一份完整的模型参数、梯度和优化器状态。以 Adam 优化器训练 7B 参数模型为例,仅优化器状态就需要 7B × 4 字节 × 2(一阶矩+二阶矩)≈ 56GB 显存,远超单卡容量。这意味着数据并行无法扩展到超大模型,团队不得不引入复杂的模型并行策略,开发成本极高。

DeepSpeed 的 ZeRO 技术从根上消除这份冗余:ZeRO-1 分片优化器状态,ZeRO-2 进一步分片梯度,ZeRO-3 连模型参数一并分片。显存占用随 GPU 数量近似线性下降,使「数据并行就能训练超大模型」成为可能。在此基础上,ZeRO-Offload 把优化器状态和梯度卸载到 CPU 内存甚至 NVMe 固态盘,让单张消费级显卡也能微调数十亿参数模型;DeepSpeed-Inference 则将同一套并行能力复用到推理阶段,配合连续批处理(continuous batching)技术提升在线服务吞吐。

与 PyTorch 原生 FSDP 相比,DeepSpeed 的控制面更细、功能更全(Offload、梯度压缩、自动调优、推理引擎),但配置复杂度也更高;与 Megatron-LM 相比,DeepSpeed 更偏「数据并行 + 内存优化」路线,两者在实际千亿级项目中常组合使用而非互斥。

安装与环境配置:4 步就绪

第 1 步创建 Python 环境。DeepSpeed 要求 Python 3.8+,推荐 3.10,建议用 conda 隔离:conda create -n deepspeed python=3.10 -y。第 2 步安装 PyTorch。版本需与 GPU 驱动匹配,CUDA 12.1 驱动环境可用 PyTorch 官方 cu121 源。第 3 步安装 DeepSpeed 本体:pip install deepspeed 默认安装预编译 wheel,CUDA 算子(如 FusedAdam)会在首次训练时自动 JIT 编译,本机需具备 C++ 编译器与匹配的 CUDA 工具链;需要强制预编译算子时设置环境变量 DS_BUILD_OPS=1 再安装。第 4 步验证:deepspeed --version 查看版本,ds_report 输出 torch、CUDA、NCCL 版本及 JIT 编译环境是否就绪。

bash13 行
# 1. 创建环境conda create -n deepspeed python=3.10 -yconda activate deepspeed # 2. 安装 PyTorch(按驱动选择 cu121/cu118/cu124 等)pip install torch --index-url https://download.pytorch.org/whl/cu121 # 3. 安装 DeepSpeedpip install deepspeed # 4. 验证deepspeed --versionds_report

快速上手:10 分钟跑通第一个 ZeRO-2 训练

核心思路:在普通 PyTorch 训练脚本中,用 deepspeed.initialize 替换原始的优化器构造,再通过 ds_config.json 声明训练批大小、ZeRO 分片阶段和混合精度策略,最后用 deepspeed 命令代替 python 启动。具体分 4 步:

1. 创建项目目录 mkdir ds-demo && cd ds-demo,写入训练脚本 train.py(见下方代码)。

2. 在同目录创建 ds_config.json,配置总批大小 64、单卡微批 16、梯度累积 2 步、ZeRO-2 分片、FP16 混合精度。三者关系满足公式:总批大小 = 微批 × 累积步数 × GPU 数。

3. 使用 deepspeed --num_gpus=2 train.py 启动训练。启动器会自动设置分布式环境变量,与单卡脚本逻辑兼容。

4. 观察终端输出:日志会显示 rank 编号、每步 loss 和吞吐。也可以打开 TensorBoard 查看 zeRO 相关的显存曲线。

进阶技巧:训练中定期调用 model_engine.save_checkpoint("ckpt", step) 保存断点,恢复时用 model_engine.load_checkpoint("ckpt", step);在支持 BF16 的硬件(A100/H100)上将 fp16 换成 bf16 可获得更好的数值稳定性。

python25 行
# train.pyimport torchimport deepspeed class MyModel(torch.nn.Module):    def __init__(self):        super().__init__()        self.linear = torch.nn.Linear(1024, 1024)    def forward(self, x):        return self.linear(x) model = MyModel()model_engine, optimizer, _, _ = deepspeed.initialize(    model=model,    model_parameters=model.parameters(),    config="ds_config.json") x = torch.randn(16, 1024, device=model_engine.device)for step in range(100):    loss = model_engine(x).sum()    model_engine.backward(loss)    model_engine.step()    if step % 10 == 0:        print(f"step {step}, loss {loss.item():.4f}")
json7 行
{  "train_batch_size": 64,  "train_micro_batch_size_per_gpu": 16,  "gradient_accumulation_steps": 2,  "zero_optimization": { "stage": 2 },  "fp16": { "enabled": true }}
bash1 行
deepspeed --num_gpus=2 train.py

核心能力详解:5 大支柱

支柱一:ZeRO 分片(stage 1/2/3)。 ZeRO 是 DeepSpeed 的基石。stage 1 分片优化器状态,显存降为原来的约 1/4;stage 2 叠加梯度分片,显存降为原来的约 1/8;stage 3 将模型参数也分片,显存随卡数近似线性下降。stage 3 在每层前向/反向计算前通过 all-gather 动态聚合参数,算完即释放,因此单卡可容纳的参数量大幅提升,但通信量也增加,实际性能需实测权衡。

支柱二:ZeRO-Offload 与 ZeRO-Infinity。 将优化器状态和梯度卸载到 CPU 内存,GPU 只保留参数和计算图,使单张 24GB 显存的消费级显卡即可微调 7B 级模型。ZeRO-Infinity 进一步支持卸载到 NVMe 固态盘,理论上可训练无限规模模型,代价是 CPU/NVMe 带宽成为新瓶颈,适合训练吞吐要求不高的微调场景。

支柱三:混合精度与梯度压缩。 内置 FP16/BF16 混合精度引擎(AMP),自动完成 loss 缩放、梯度裁剪与主权重保存;提供 1-bit Adam、TopK 梯度压缩等通信优化,可降低跨节点训练的带宽占用,在低带宽环境下显著提升吞吐。

支柱四:DeepSpeed-Inference 推理引擎。 复用 ZeRO 分片与模型并行能力,配合算子融合(kernel fusion)减少显存读写,将大模型部署到多卡。DeepSpeed-FastGen 引入连续批处理,允许不同请求动态进入/离开批次,解决在线推理中请求到达不均导致的 GPU 空闲问题。

支柱五:MoE 支持与自动调优。 原生支持混合专家模型(Mixture-of-Experts)的稀疏训练与推理,对 expert 路由和负载均衡做了调度优化;Autotuning 模块会自动搜索 batch size、ZeRO stage 等参数组合,避免手工试错。

生产部署与监控:从上线到运维

单机多卡训练。 直接使用 deepspeed --num_gpus=8 train.py,启动器自动分配 GPU。生产环境建议配合 Slurm 等调度器,以容器镜像固定 CUDA 版本,首次运行前用 ds_report 确认算子编译条件。

多节点训练。 编写 hostfile 文件,每行一个节点:worker-1 slots=8,然后执行 deepspeed --hostfile=hostfile --num_nodes=2 --num_gpus=8 train.py。需要保证节点间 SSH 免密、NCCL 网络互通;跨节点通信瓶颈通常用 NCCL_DEBUG=INFO 打开 NCCL 日志定位。

推理服务部署。 安装 pip install deepspeed-mii,通过 MII 的 mii.serve 接口加载 Hugging Face 模型并暴露 OpenAI 兼容的 HTTP 服务,内部自动启用 ZeRO-Inference 与连续批处理。服务进程需独立于训练集群,避免显存争抢。

可观测性。 DeepSpeed 将训练指标(吞吐、显存、各阶段耗时)输出到 TensorBoard;开启 wall_clock_breakdown: true 可细粒度查看前向/反向/通信耗时占比,这是定位训练瓶颈的第一步。用官方 Flops Profiler 可统计每层 FLOPs 和算子耗时,判断计算密度是否合理。

<p class="para-label">避坑清单:</p>

<ul class="dash-list"><li>梯度累积配置前后矛盾:train_batch_size 必须等于 micro_batch × accumulation_steps × world_size,否则 DeepSpeed 启动时报错或训练步数与预期不符,先核对公式。</li><li>ZeRO-3 大模型初始化可能因参数分片而超时或 OOM:应在 zero_optimization 中开启 zero3_init_context 或使用 from_pretrained 的延迟初始化机制,避免在进程内一次性构造完整模型。</li><li>升级版本后 ds_config 字段被移除:如旧版 fp16 相关字段在后续版本中移动到了 bf16 或 amp 配置下,升级前先阅读 Changelog 并做配置迁移。</li><li>与 Hugging Face Trainer 集成时重复定义优化器:官方文档明确 Trainer 的 optimizer 参数与 ds_config 中 optimizer 配置冲突,优化器只应在 ds_config 中声明。</li></ul>

维度DeepSpeedPyTorch FSDPMegatron-LMColossalAI
定位全栈训练+推理优化库PyTorch 官方分片训练方案超大模型预训练框架(NVIDIA)分布式训练/推理一体化框架
分片策略ZeRO-1/2/3 + CPU/NVMe OffloadFSDP 参数/梯度/优化器分片张量并行 + 流水线并行Gemini 内存管理 + 多种并行
推理支持DeepSpeed-Inference + FastGen无内置推理引擎需配合 TensorRT-LLM支持 vLLM 等集成
学习曲线高(配置项丰富)中(与 PyTorch 深度集成)高(需改造模型代码)中高(API 抽象较全)
生态集成Hugging Face、Lightning、AzurePyTorch 原生生态NVIDIA GPU 深度绑定社区活跃、文档全
生产部署训练推理一体,成熟案例多需自建推理链路大厂预训练为主企业落地持续增长
LicenseApache 2.0BSD-3自定义开源协议Apache 2.0
适合谁LLM 训练/推理基建团队快速上手分片训练的 PyTorch 用户千亿级预训练专项团队需要一体化方案的团队

选型建议:如果你的项目以 PyTorch 为主、追求低改造成本,先用原生 FSDP 验证分片训练;需要 CPU/NVMe Offload、推理服务或精细通信控制时,选 DeepSpeed;千亿级稠密模型预训练往往需要 Megatron 的张量/流水线并行与 DeepSpeed 的 ZeRO 组合使用。

版本迭代

DeepSpeed 自 2020 年开源以来,主线是从「ZeRO 显存优化」演进为「训练 + 推理全栈」方案:2020—2022 年围绕 ZeRO 系列与 Offload 能力完善,2023 年 v0.9 引入 FastGen 推理、v0.10 引入 Hybrid Engine,2024 年转向模型生态适配与稳定性打磨。(截至训练数据 2025 年初,可能已有更新版本)

版本时间变化提升
v0.8.02023-01PyTorch 2.0 兼容与 MoE 训练增强支持 torch.compile 图模式,MoE 训练更稳定
v0.9.02023-04DeepSpeed-FastGen 发布引入连续批处理,LLM 在线推理吞吐大幅提升
v0.10.02023-12引入 Hybrid Engine训练与推理共享内核路径,减少算子重复开发
v0.11.02024-04主流开源模型适配增强扩展 ZeRO-3 下大模型初始化稳定性与兼容性
v0.13.02024-10推理路径迭代与稳定性修复完善 FastGen 调度逻辑,修复多 CUDA 版本兼容问题
v0.14.02024-12性能与依赖更新优化算子执行效率,更新底层依赖版本
结论

DeepSpeed 的迭代方向清晰——训练侧持续降低显存门槛与通信开销,推理侧从零补齐全栈能力。选型上若只需训练,可先评估原生 FSDP;需要 Offload 或训练推理一体时,DeepSpeed 是更完整的选择。评测数据未随版本逐项公开,性能差异以官方 Benchmark 脚本复现为准。

AI 应用场景

大规模 LLM 预训练

阶段:分布式训练 / 模型预训练

解决的问题:百亿参数模型在数据并行下每卡需完整保存优化器状态,显存不足且扩展性差。ZeRO-3 将参数、梯度、优化器状态分片到集群,显存随卡数近似线性扩展。

具体案例:在 64 卡 A100 集群上训练 13B 参数模型,使用 ZeRO-2 即可满足显存需求并保持接近线性的吞吐扩展;官方 ZeRO 论文报告显示,相比传统 DDP,可训练的模型规模提升约 8 倍,训练吞吐在千亿参数规模下达到 15 PFLOPS 级。

低资源微调大型模型

阶段:模型微调 / 参数高效训练

解决的问题:小型团队只有单张消费级显卡,无法加载 7B 级模型。ZeRO-Offload 将优化器状态和梯度卸载到 CPU 内存,GPU 只保留参数与计算图。

具体案例:单张 RTX 3090(24GB)微调 Llama-2-7B,开启 ZeRO-Offload 后 batch size 可设为 4~8,训练完整 epoch 耗时较云上多卡方案增加但成本降低一个数量级,是个人开发者与小型团队的可落地路径。

LLM 在线推理服务

阶段:推理服务 / 模型部署

解决的问题:大模型推理时 GPU 显存受限且请求到达不均导致利用率低。DeepSpeed-FastGen 的连续批处理让不同请求动态进出批次,配合算子融合提升单卡吞吐。

具体案例:将 Llama-2-70B 部署在 4 卡 A100 上,官方对比评测显示 FastGen 在同等硬件下吞吐约为传统静态批处理的两倍,且首个令牌延迟更稳定;吞吐数据可参考官方仓库 Benchmark 脚本复现。

常见误区

误区ZeRO-3 已经把参数分片到所有卡上了,所以不需要再学 Megatron 的张量并行,安装 DeepSpeed 就够了。

正解ZeRO-3 解决的是数据并行下的显存冗余问题,但每次前向/反向都需要 all-gather 聚合参数,跨节点通信开销很大。百亿级稠密模型通常需要「ZeRO + 张量并行/流水线并行」组合:张量并行先降低单层参数规模,ZeRO 再消除优化器状态冗余,二者互补而非替代。主流大模型训练方案(如 Meta 的 LLaMA、Google 的 PaLM)都是组合使用。

为何常见:ZeRO-3 让单卡看似能装下超大模型,容易让人误以为并行策略可以互相替换,忽略了通信代价与单层计算负载的差异。

误区stage 3 显存占用最低,再加上 Offload 肯定最稳。我直接在所有训练任务里都开 stage 3 + 全量 Offload。

正解stage 3 与 Offload 都会引入额外开销:stage 3 增加 all-gather 通信,Offload 增加 CPU 内存拷贝与 PCIe 传输。小模型或节点内卡数较少时,stage 2 甚至 stage 1 的吞吐明显更优。正确的选择顺序是:先从 stage 1 开始,显存不足升 stage 2,仍不足再上 stage 3;Offload 只作为显存硬瓶颈的兜底手段,且优先只卸载优化器状态。

为何常见:网上教程普遍强调 stage 3 能训练最大规模模型,把「能力上限」误当成「默认最优配置」,忽略了性能随配置变化的真实规律。

误区pip install deepspeed 成功 = 环境 OK。结果第一次训练时 CUDA 算子编译报错,或者训练走的是慢速 Fallback 实现。

正解DeepSpeed 的 CUDA 算子(如 FusedAdam、SparseAttn)依赖 torch 的 CUDA 版本匹配。pip 包安装成功不代表算子可用,首次运行触发 JIT 编译时才暴露问题。必须用 ds_report 查看 JIT 编译条件(g++、CUDA 工具链、ninja 是否就绪),并在容器镜像中固化这些依赖,避免生产环境编译失败。

为何常见:Python 包安装与编译型算子分离的设计让「安装成功」与「可用」之间出现空档,训练前缺少环境自检习惯。

误区Hugging Face Trainer 里已经配了 AdamW,DeepSpeed 的 ds_config 里也写了 optimizer,两个都能生效,或者以 Trainer 为准。

正解官方文档明确说明这两处配置会冲突。Trainer 传入的 optimizer 会绕开 DeepSpeed 的优化器分片逻辑,ZeRO 的显存收益直接失效。正确做法是:只在 ds_config 的 optimizer 字段中定义优化器类型与学习率,Trainer 侧不传 optimizer。同理 learning rate scheduler 也应只在单侧配置。

为何常见:两套框架都提供优化器配置入口,用户容易按「就近原则」重复填写,而框架之间不弹警告而是静默生效,问题在显存曲线异常时才暴露。

误区DeepSpeed 名字里全是训练,推理我无脑用 vLLM,没必要了解 DeepSpeed-Inference。

正解DeepSpeed-Inference 提供 kernel 融合、模型并行推理与 ZeRO-Inference 显存优化,FastGen 的连续批处理在官方基准中与 vLLM 同级别。如果团队已有一套 DeepSpeed 训练链路,复用同一套分片与算子体系部署推理可以显著降低运维成本;vLLM 的优势在于生态与易用性,两者按团队现状选择。

为何常见:DeepSpeed 大量训练相关的宣传(ZeRO、Offload)掩盖了其推理能力,用户容易从名字推测能力边界。

面试题

Q1. DeepSpeed 最核心的显存优化技术是?

单选题 · easy

  • A.ZeRO 零冗余优化器← 正确答案
  • B.KV Cache 缓存机制
  • C.NVIDIA TensorRT
  • D.ONNX Runtime 推理

答案:A。ZeRO 是 DeepSpeed 的标志性技术,通过分片优化器状态/梯度/参数消除数据并行下的显存冗余。KV Cache 是推理阶段的 KV 缓存优化,TensorRT 是 NVIDIA 的推理加速器,ONNX Runtime 是模型推理引擎,均非 DeepSpeed 核心。

Q2. ZeRO-2 相对 ZeRO-1 额外分片了什么?

单选题 · mid

  • A.全部优化器状态
  • B.反向传播的梯度← 正确答案
  • C.全部模型参数
  • D.学习率调度器

答案:B。ZeRO 三阶段递进:stage 1 只分片优化器状态,stage 2 额外分片梯度,stage 3 才分片模型参数。因此 ZeRO-2 相对 ZeRO-1 的新增内容是梯度分片,学习率调度器不在分片范围内。

Q3. 使用 DeepSpeed 启动双卡训练的正确方式是?

单选题 · mid

  • A.python 单卡直接运行
  • B.deepspeed 指定卡数启动← 正确答案
  • C.torchrun 指定进程数启动
  • D.accelerate 指定卡数启动

答案:B。DeepSpeed 自带启动器,标准命令形如 deepspeed --num_gpus=2 train.py。torchrun 需要额外配合 deepspeed.initialize 的分布式参数,accelerate 是另一套独立方案,均非 DeepSpeed 原生的最短路径。

Q4. ds_config 中总批大小、单卡微批、梯度累积步数、GPU 数的关系是?

单选题 · mid

  • A.微批 × 卡数 ÷ 累积步数
  • B.微批 × 累积步数 × 卡数← 正确答案
  • C.微批 × 累积步数 ÷ 卡数
  • D.三者之间不存在确定关系

答案:B。官方公式 train_batch_size = train_micro_batch_size_per_gpu × gradient_accumulation_steps × world_size。配置错误时 DeepSpeed 会因参数不一致而报错,或导致训练步数与日志预期不符。

Q5. ZeRO-3 下模型参数在何时被分片存储?

单选题 · hard

  • A.只在加载模型阶段分片
  • B.只在反向传播阶段分片
  • C.按需聚合计算后重新分片← 正确答案
  • D.只在迭代结束阶段分片

答案:C。ZeRO-3 对参数本身分片,每个 transformer 层在计算前通过 all-gather 临时聚合所需参数,计算完成后立即释放,仅保留本地分片。因此前向与反向都需要动态聚合,而非只在某个阶段分片一次。

Q6. DeepSpeed 的正确安装命令是?

单选题 · easy

  • A.pip install zro
  • B.pip install ms-deepspeed
  • C.apt install deepspeed
  • D.pip install deepspeed← 正确答案

答案:D。DeepSpeed 在 PyPI 上的正式包名为 deepspeed。zro 是其他项目,ms-deepspeed 不是官方包名,apt 源中也没有 DeepSpeed。

Q7. 多节点训练时,DeepSpeed 启动器默认读取的节点配置文件是?

单选题 · mid

  • A.hosts.conf
  • B.默认名为 hostfile← 正确答案
  • C.nodes.config
  • D.cluster.yml

答案:B。DeepSpeed 默认读取名为 hostfile 的文件,每行一个节点并指定可用的 GPU 槽位数,例如 worker-1 slots=8,也可用 --hostfile 参数指定其他路径。

Q8. 以下哪些属于 DeepSpeed 的核心功能?

多选题 · mid

  • A.ZeRO 显存优化← 正确答案
  • B.推理加速引擎← 正确答案
  • C.自动生成数据集
  • D.梯度压缩通信← 正确答案

答案:ABD。ZeRO(A)、DeepSpeed-Inference(B)、梯度压缩(D)均为官方功能。自动生成数据集(C)不是 DeepSpeed 的能力范围,数据准备需由其他工具完成。

Q9. 关于 DeepSpeed 与 Hugging Face Trainer 的集成,正确的说法是?

多选题 · extreme

  • A.Trainer 支持 deepspeed 参数← 正确答案
  • B.集成无需安装 deepspeed
  • C.ZeRO-3 需配置延迟初始化← 正确答案
  • D.优化器配置可同时存在于两侧

答案:AC。Trainer 的 deepspeed 参数可接收 ds_config 路径(A 对);ZeRO-3 下大模型应在 zero3_init_context 中延迟初始化以避免 RAM 峰值(C 对)。不使用 deepspeed 则集成无从谈起(B 错);优化器在 Trainer 与 ds_config 两侧同时配置会冲突(D 错)。

Q10. 查看 DeepSpeed 环境诊断信息应运行哪个命令?

单选题 · easy

  • A.运行 deepspeed --info
  • B.运行 ds_report 命令← 正确答案
  • C.运行 deepspeed env
  • D.运行 dsconfig list

答案:B。ds_report 是官方环境诊断命令,输出 torch、CUDA、NCCL 版本及 JIT 编译条件,用于排查算子编译问题。deepspeed --version 只显示版本号,--info、env、dsconfig list 均非标准诊断命令。