Chapter 01

项目背景与定位

📌 本章基于 deepspeedai/DeepSpeed · commit 510ebe58e4e4 (2026-05-25)。

1.1 一句话定位

DeepSpeed 是微软研究院开源的、用"内存优化"做差异化竞争的分布式深度学习框架。它的招牌技术 ZeRO(Zero Redundancy Optimizer) 通过把优化器状态、梯度、参数依次切分到不同 GPU 上,让"原本必须 8 张 A100 才能塞下的模型,现在 2 张就够"成为可能。

如果你近几年用过 HuggingFace Transformers 训过模型,那十有八九你已经在间接用 DeepSpeed:HF Trainer 的 --deepspeed 启动参数走的就是它。

1.2 为什么会有 DeepSpeed

2019-2020 年那个时间点,业界面对的问题非常具体:

微软的 Samyam Rajbhandari 等人在 ZeRO 论文(2019)里给出的洞察非常朴素:这种"全卡都存一份"的模式,里面有 $N-1$ 份是重复的,可以切。Adam 优化器一份参数需要保存的额外状态约 4 倍参数量(fp32 master weights + 一阶矩 $m$ + 二阶矩 $v$),所以单卡显存占用(DP 设备数 $N$)大致为:

$$M_\text{DDP} = \underbrace{2\Psi}_{\text{参数}} + \underbrace{2\Psi}_{\text{梯度}} + \underbrace{12\Psi}_{\text{Adam 状态(fp32)}} = 16\Psi$$

其中 $\Psi$ 是参数量。ZeRO 把这 $16\Psi$ 中越来越多的部分切到 $N$ 张卡:

$$M_{\text{ZeRO-1}} = 4\Psi + \frac{12\Psi}{N}, \quad M_{\text{ZeRO-2}} = 2\Psi + \frac{14\Psi}{N}, \quad M_{\text{ZeRO-3}} = \frac{16\Psi}{N}$$

ZeRO-3 是真正的"线性可扩展"——卡越多每张占用越小。

阶段切分对象说明
ZeRO-1优化器状态Adam 的 $m/v$ 切到 $N$ 张卡
ZeRO-2+ 梯度 反向 reduce-scatter 而不是 all-reduce
ZeRO-3+ 参数本身 每次 forward / backward 再 all-gather

DeepSpeed 就是把这套"渐进式分片"工程化的产物。后来项目继续向外延伸:DeepSpeed-Inference、DeepSpeed-MoE、DeepSpeed-Chat、ZeRO-Offload / ZeRO-Infinity 等。

1.3 它和 PyTorch FSDP、Megatron-LM 是什么关系

维度DeepSpeedPyTorch FSDPMegatron-LM
主战场 ZeRO 分片 + 一切扩展PyTorch 原生 ZeRO-3 等价物TP/PP/SP 模型并行
切分对象 优化器/梯度/参数参数 + 优化器张量本身(按权重矩阵切)
集成方式 包一个 DeepSpeedEngine包一个 FullyShardedDataParallel重写模型代码
配置形式 JSONPython API + auto_wrapargparse / yaml
易用性 中(JSON 字段多)高(PyTorch 原生)低(强工程化)

经验法则

它们不互斥——Megatron-DeepSpeed 就是把 DeepSpeed 的 ZeRO 引擎嵌进 Megatron 的并行框架里。

1.4 设计哲学:JSON 即一切

DeepSpeed 最让初学者又爱又恨的设计是:绝大多数关键参数都通过一个 JSON 文件配置,而不是 Python API。比如这样的一份典型 config:

{
  "train_batch_size": 256,
  "gradient_accumulation_steps": 4,
  "bf16": { "enabled": true },
  "zero_optimization": {
    "stage": 3,
    "offload_optimizer": { "device": "cpu" },
    "overlap_comm": true
  }
}

好处是非常直观;坏处是这份 JSON 一旦超过 30 行,字段之间的相互约束就开始让人头疼——zero stage 3 不能和某些 fused optimizer 同用,offload 不能和某些 dtype 同用等等。第 7 章会给一份完整的"字段地图"。

1.5 它适合用来做什么、不适合做什么

判断典型场景
✅ 适合显存不够、想训得动比硬件理论上能塞下的更大的模型
已经在用 HF Trainer,希望最小代价获得分布式能力
大规模 SFT、继续预训练、RLHF(DeepSpeed-Chat)
想在普通服务器 + NVMe 上挑战训练超大模型(ZeRO-Infinity)
❌ 不适合极致 throughput 优先、有完整 NVIDIA H100 集群的预训练 —— Megatron-LM / NeMo 通常更快
想用消费级 4090 / 单卡微调 —— Unsloth / LoRA 更轻
不想碰 JSON,想全 Python API 控制 —— FSDP / Accelerate 更顺手

1.6 本书将怎么带你走完这趟旅程

1.7 DeepSpeed 在 2024–2026 引入了什么

DeepSpeed 不是一个停下来的项目。打开 repos/deepspeed/README.md 的 "Latest News" 一段,几乎每个季度都有新东西落地。下面这张倒序时间线是本书基线 commit 510ebe58e4e4(2026-05-25)当时已经合入 master 的特性 —— 全部能在源码里找到,本书后续章节会逐一对应到 file:line。

月份特性是什么本书章节
2026-05Muon 优化器 + SDMA for ZeRO-3新接入的二阶 LLM 优化器;SDMA 直传通道用于 stage 3 通信加速ch05.14 / ch07.15 / ch12.13
2026-03SuperOffload(ASPLOS Honorable Mention)不止 offload 内存,把"优化器计算"也搬到 CPU worker 进程,重叠率更高ch05.15 / ch06.10
2025-12Core API 现代化支持 PyTorch 风格 backward、low-precision master weightch04.12
2025-10ZenFlow 选择性梯度更新top-k 重要梯度立刻 GPU 更新,其余在 CPU 异步累积,stall-free offloadch05.14 / ch07.15 / ch12.12
2025-06Arctic Long Sequence Training + DeepNVMe百万级 token 上下文训练;NVMe 直读直写优化ch09.14 / ch06.11
2025-04DeepCompiletorch.compile 和 DS 的 ZeRO / offload / activation 管理打通ch11.12
2025-03AutoTP for HuggingFace不需要用户写 policy,自动扫 HF 模型并做张量并行切分ch09.13
2024-12Ulysses-OffloadUlysses 序列并行 + offload 组合ch09.14
2024-11Domino 异步 TP列/行并行 Linear 的 allreduce 推迟到 backward,藏通信ch09.15

读完这张表,应该建立一个心智模型:DS 的"经典 ZeRO"还在演进,但很多 2024 后的新工作不是替换 ZeRO,而是在 ZeRO 的 hook / offload / 通信路径上加挂新功能。本书 ch05、ch06、ch09 的"进阶"小节就是逐个拆开这些挂件。