Chapter 02

安装与版本矩阵

📌 本章基于 deepspeedai/DeepSpeed · master · commit 510ebe58e4e4 ,仓库自报版本 0.19.1 (见 version.txt )。

2.1 装之前要先承认的事

DeepSpeed 的依赖关系比 LLaMA-Factory 更挑剔,原因有两点:

不会编译 C++ 也能用 DeepSpeed,但装不好就只能用 fallback 实现,性能差一截。本章把"怎么装得对"讲清楚。

2.2 硬性依赖

仓库 requirements/requirements.txt 列出的核心依赖:

einops
hjson
msgpack
ninja
numpy
packaging>=20.0
psutil
py-cpuinfo
pydantic>=2.0.0
torch>=2.0.0
tqdm

除此之外,编译 CUDA 扩展时还需要

条件原因
CUDA toolkit(含 nvcc op_builder 调 nvcc 编译 .cu 文件
g++ ≥ 9(或 MSVC 兼容) C++17 特性
CUDA toolkit 主版本 = PyTorch 编译时版本否则会编译报错;CUDA 12.4 + PyTorch 2.4+ 是当前推荐
libaio-dev(NVMe Offload 才需要) 异步 IO,apt install libaio-dev

2.3 三条安装路线

路线 A:纯 pip 安装(JIT 编译)

# 最简单:装到 site-packages,等用到时按需编译 CUDA op
pip install deepspeed

# 看版本
ds_report

ds_report 会输出长长一段,告诉你:

这条路线第一次跑训练会卡几分钟编译 CUDA,之后会缓存。

路线 B:提前编译指定 op(pre-built)

跑生产任务前一次性把所有 op 编完,避免训练时被编译时间打扰:

# 编译全部 op
DS_BUILD_OPS=1 pip install deepspeed

# 只编 ZeRO 必要 op,省 60% 编译时间
DS_BUILD_CPU_ADAM=1 DS_BUILD_FUSED_ADAM=1 DS_BUILD_UTILS=1 \
  pip install deepspeed

# 看支持的环境变量列表
python -c "from op_builder import ALL_OPS; print(list(ALL_OPS.keys()))"

仓库 op_builder/ 下每个文件对应一个 op。常用的几个环境变量:

变量作用
DS_BUILD_OPS=1 编译所有 op
DS_BUILD_CPU_ADAM=1 CPU Offload 的 Adam,用 offload 必须有
DS_BUILD_FUSED_ADAM=1 GPU 上 fused Adam,比 PyTorch 自带快
DS_BUILD_UTILS=1 通用 CUDA 工具函数
DS_BUILD_AIO=1 NVMe Offload(要先装 libaio-dev)
DS_BUILD_LAMB=1 FusedLamb 优化器(大 batch 训练)
DS_BUILD_LION=1 FusedLion 优化器
DS_BUILD_QUANTIZER=1 量化 op(int8 / fp8 推理与训练)
DS_BUILD_TRANSFORMER=1 DS 自己写的 fused transformer(推理用)
DS_BUILD_SPARSE_ATTN=0 明确禁用,sparse attn 编译慢且偶尔报错
DS_BUILD_GDS=1 GPU-Direct Storage(搭 ZeRO-Infinity 时直跳 CPU)
DS_SKIP_CUDA_CHECK=1 跳过 PyTorch vs nvcc CUDA 版本检查(不安全,调试用)
TORCH_CUDA_ARCH_LIST="8.0;9.0"只为 A100/H100 编 cuda kernel,省时间

完整可枚举的 op 列表在 op_builder/all_ops.py(第 30 行的 ALL_OPS = {op.name: op for op in __op_builders__})。任何时候想知道"这个版本支持哪些 op",跑:

python -c "from op_builder import ALL_OPS; print(sorted(ALL_OPS.keys()))"

路线 C:用 NGC / 官方 Docker

仓库自带 docker/Dockerfile,但更常见做法是直接用 NVIDIA NGC 镜像或 HuggingFace 的镜像(里面已经装好 DeepSpeed):

# NGC PyTorch 容器(已含 DS)
docker run --gpus all -it --rm nvcr.io/nvidia/pytorch:24.10-py3 bash

# 进容器后确认
ds_report

2.4 版本对应矩阵

DeepSpeed × PyTorch × CUDA 不能乱配。本基线 commit 时的推荐组合:

DeepSpeedPyTorchCUDAPython说明
0.19.x(本基线) 2.4 / 2.5 / 2.612.1 / 12.43.10–3.12当前推荐
0.17.x 2.3 / 2.4 12.1 3.10–3.11稳定旧版
0.14.x 2.1 / 2.2 11.8 / 12.1 3.9–3.10 HF 早期 Trainer 默认
0.10.x 及更早 1.13 / 2.0 11.x 3.8–3.10 不建议新项目用
陷阱 PyTorch 编译时的 CUDA 主版本必须和你本机 nvcc --version 主版本一致。 例如装的 PyTorch 是 cu121 wheel,本机 nvcc 是 cu124,编译 DS op 会失败。 解决:要么换 PyTorch wheel,要么本机装匹配版 CUDA toolkit。

2.5 验证安装

ds_report 是最权威的一招,但还有几个快速检查:

# 1. import 不报错
python -c "import deepspeed; print(deepspeed.__version__)"

# 2. 看哪些 op 已编译
python -c "from deepspeed.ops.adam import FusedAdam; print('FusedAdam OK')"
python -c "from deepspeed.ops.adam import DeepSpeedCPUAdam; print('CPUAdam OK')"

# 3. 看 launcher 可用
deepspeed --help

# 4. 跑最小训练(torchrun 风格)
deepspeed --num_gpus 1 -- examples/sdma_allgather/test.py
# 或仓库自带的 tests/unit/runtime/zero/test_zero.py

如果 FusedAdam import 报错但训练能跑,那说明你正在用 fallback PyTorch Adam——能用,但慢。DS_BUILD_FUSED_ADAM=1 pip install --force-reinstall deepspeed --no-build-isolation 重新装一次。

2.5.1 一份典型的 ds_report 输出该长啥样

真实输出会很长(几十行),关键是看下面这几块。本节的"应有形态"对照可以帮你迅速定位"我哪儿少装了":

--------------------------------------------------
DeepSpeed C++/CUDA extension op report
--------------------------------------------------
JIT compiled ops requires ninja
ninja .................. [OKAY]
--------------------------------------------------
op name ................ installed .. compatible
--------------------------------------------------
async_io ............... [YES] ...... [OKAY]      ← NVMe offload 必须 [OKAY]
cpu_adam ............... [YES] ...... [OKAY]      ← CPU offload 必须 [OKAY]
cpu_adagrad ............ [NO] ....... [OKAY]
fused_adam ............. [YES] ...... [OKAY]      ← GPU 训练强烈建议 [OKAY]
fused_lamb ............. [NO] ....... [OKAY]      ← 不用 Lamb 可以 [NO]
quantizer .............. [NO] ....... [OKAY]      ← 不做量化可以 [NO]
random_ltd ............. [NO] ....... [OKAY]
sparse_attn ............ [NO] ....... [NO]        ← 已弃用,不用管
spatial_inference ...... [NO] ....... [OKAY]
transformer ............ [NO] ....... [OKAY]      ← v1 推理用;不推理可 [NO]
stochastic_transformer . [NO] ....... [OKAY]
transformer_inference .. [NO] ....... [OKAY]      ← DS-Inference v1 要 [OKAY]
--------------------------------------------------
DeepSpeed general environment info:
torch install path ............... ['...']
torch version .................... 2.5.1
deepspeed install path ........... ['...']
deepspeed info ................... 0.19.1, ...

判读规则:

2.6 三个最常踩的安装坑

报错 / 现象原因修复
fatal error: cuda_runtime.h: No such file or directory没装 CUDA toolkit / 路径不对cuda-toolkit-12-4;或 export CUDA_HOME=/usr/local/cuda
RuntimeError: aio.h not found libaio-dev 没装 apt install libaio-dev;或 DS_BUILD_AIO=0 关掉
编译慢得离谱(30+ 分钟) 没限定 GPU arch,给全 arch 都编 export TORCH_CUDA_ARCH_LIST="8.0;9.0"
OSError: libcuda.so.1: cannot open shared object file 容器没挂 NVIDIA driver docker run --gpus=all
JIT 编译 + 多卡:每张卡都重编一次 缓存目录冲突 预先 DS_BUILD_OPS=1 编一次,或用共享缓存路径
Windows 装失败 DS 对 Windows 支持差 用 WSL2 + Ubuntu;或换 FSDP
macOS 装失败 无 CUDA DeepSpeed 不支持 macOS GPU 训练

2.7 装好后该读哪几个文件

装完别急着跑业务训练,先扫一眼这些文件,省后续大量调试时间:

文件看什么
deepspeed/__init__.py initialize() 函数签名 → 第 3 章会用
deepspeed/runtime/config.py 所有 JSON 字段的 Python 表示 → 第 7 章字典
deepspeed/runtime/zero/config.pyZeRO 专属字段
op_builder/builder.py 编译机制;想加自己的 op 必读
ds_report 输出 实际编译了哪些 op,未编译的会标 [NO]
提示 ds_report 是 DeepSpeed 项目里一个非常体贴的设计,出 issue 时把它输出贴上去, 90% 的安装问题维护者一眼就能定位。报 bug 前先跑这个