第 1 章 课程导入:分布式训练的必要性、DeepSpeed 简介、学习目标与整体框架
当你第一次尝试把一个大语言模型塞进单张 GPU 时,往往会遇到一个非常直接的报错:CUDA out of memory。这不是代码写错了,而是模型规模、数据规模与单卡显存之间出现了根本性的矛盾。分布式训练正是为了解决这一矛盾而诞生的工程体系,而 DeepSpeed 则是其中最具代表性的训练加速框架之一。
一、为什么单卡训练会走到尽头
训练一个神经网络,显存主要被四部分占用:模型参数、梯度、优化器状态以及前向传播中的激活值。以混合精度训练为例,若模型有 Φ 个参数,仅参数本身(FP16)就需要 2Φ 字节,梯度再占 2Φ 字节;而 Adam 优化器还需要保存 FP32 的动量与方差,合计约 12Φ 字节。也就是说,一个 10B 参数的模型,光模型状态就可能超过 160GB,远超单张 80GB 显卡的容量。
除了显存,计算时间也是瓶颈。单卡算力有限,训练一个百亿参数模型可能需要数月,这在工程上不可接受。因此,分布式训练要同时解决两个问题:把放不下的模型状态分散到多张卡上,以及把算力聚合起来缩短训练时间。
二、DeepSpeed 是什么
DeepSpeed 是微软开源的一个深度学习优化库,最初为大规模语言模型训练设计,现已支持 PyTorch 生态中的主流模型。它的核心价值可以概括为三点:
- 显存效率:通过 ZeRO(Zero Redundancy Optimizer)系列技术,把参数、梯度、优化器状态分片到多张卡上,显著降低单卡显存占用。
- 计算效率:提供混合精度训练、梯度累积、通信压缩、算子融合等能力,提升吞吐量。
- 易用性:以配置文件驱动,用户只需少量代码改动,就能把单卡训练脚本迁移到多卡、多机环境。
一个典型的 DeepSpeed 训练入口如下所示:
deepspeed --num_gpus=8 train.py \
--deepspeed ds_config.json \
--model_name_or_path ./model \
--per_device_train_batch_size 4
其中 ds_config.json 是 DeepSpeed 的核心配置文件,决定了是否启用 ZeRO、使用哪一级 ZeRO、混合精度策略、通信后端等关键行为。
三、学习目标与整体框架
本课程的目标不是让你死记 API,而是建立一套“从问题到配置”的工程判断力。学完之后,你应该能够:
- 判断一个训练任务是否需要分布式,以及需要哪种并行策略。
- 读懂并编写 DeepSpeed 配置文件,理解 ZeRO 各级别的取舍。
- 在多卡、多机环境下启动训练,并定位常见的通信与显存问题。
- 对训练吞吐、显存占用和扩展效率进行基本评估与调优。
课程整体分为四个阶段,如下表所示:
| 阶段 | 核心内容 | 关键产出 |
|---|---|---|
| 基础认知 | 分布式必要性、并行策略分类、DeepSpeed 定位 | 能说清 DP/TP/PP/ZeRO 的区别 |
| 核心机制 | ZeRO 三级分片、混合精度、梯度累积、通信原语 | 能解释显存为什么降下来 |
| 工程实操 | 配置文件、启动脚本、多机部署、日志与监控 | 能独立跑通一个多卡训练任务 |
| 调优与排障 | 吞吐调优、显存分析、通信瓶颈、常见报错 | 能定位并解决典型训练故障 |
四、一个典型场景与常见误区
假设你要微调一个 7B 参数的模型,单卡 24GB 显存。直接全量微调几乎必然 OOM。此时可以走两条路:一是使用 LoRA 等参数高效微调方法,只训练少量适配器参数;二是使用 DeepSpeed ZeRO-2 或 ZeRO-3,把优化器状态和参数分片到多张卡上。前者降低可训练参数量,后者降低每卡的状态冗余,两者也可以叠加使用。
常见误区:很多初学者认为“加了 DeepSpeed 就一定更快”。实际上,如果模型本身很小、单卡就能放下,引入分布式反而会增加通信开销,导致吞吐下降。分布式不是万能加速器,而是在显存或算力成为硬约束时的必要手段。
学习建议:每学一个概念,都问自己三个问题——它解决的是什么瓶颈?代价是什么?在什么规模下才值得用?带着这三个问题往下学,你会比单纯记配置项走得更远。
分布式训练的本质,是在显存、算力、通信三者之间做权衡。DeepSpeed 把这些权衡封装成可配置的选项,而理解这些选项背后的原理,才是本课程真正要交付给你的能力。