2、深度学习训练基础:模型训练流程、显存瓶颈、计算瓶颈与分布式训练必要性
在进入 DeepSpeed 的具体机制之前,必须先回到一个更基础的问题:一次深度学习训练,究竟在机器内部发生了什么?只有把训练流程、显存占用和计算瓶颈看清楚,才能理解为什么单卡训练会撞墙,以及分布式训练为什么不是“可选优化”,而是规模化的必经之路。
一、模型训练流程:一次迭代的完整闭环
深度学习训练的本质,是不断调整模型参数,使预测结果与真实标签之间的损失越来越小。一次完整的训练迭代通常包含以下步骤:
- 前向传播(Forward):将一批数据输入模型,逐层计算,得到预测输出。
- 损失计算(Loss):用损失函数衡量预测值与真实标签的差距。
- 反向传播(Backward):从损失出发,沿计算图反向求每个参数的梯度。
- 梯度同步(可选):多卡或多机场景下,聚合各设备上的梯度。
- 参数更新(Optimizer Step):优化器根据梯度更新权重,如 SGD、Adam。
- 梯度清零:清空上一轮梯度,准备下一次迭代。
这六步循环往复,直到模型收敛。看似简单,但每一步都伴随着大量的张量运算和内存读写。训练速度不仅取决于 GPU 的算力,还取决于数据能否及时供给、显存能否容纳中间结果、通信能否跟上计算节奏。
二、显存瓶颈:为什么大模型“装不下”
训练时,显存并不是只存模型参数。以 Adam 优化器为例,单卡显存通常由以下几部分组成:
- 模型参数:FP16 下每个参数占 2 字节,FP32 下占 4 字节。
- 梯度:与参数同量级,通常也是 FP16 或 FP32。
- 优化器状态:Adam 需要保存一阶矩和二阶矩,FP32 下每个参数额外占 8 字节。
- 激活值:前向传播中保存的中间结果,用于反向传播,与批次大小和序列长度强相关。
- 临时缓冲区:通信、算子融合、CUDA 内核等临时占用。
一个 10B 参数的模型,仅参数、梯度和 Adam 状态在混合精度下就可能超过 100GB,远超单张 GPU 的 80GB 显存。这就是显存瓶颈:不是算不动,而是根本放不下。
三、计算瓶颈:算力、带宽与通信的三重约束
即使显存足够,训练速度也未必理想。计算瓶颈通常来自三个层面:
| 瓶颈类型 | 典型表现 | 关键指标 | 缓解方向 |
|---|---|---|---|
| 算力瓶颈 | GPU 利用率高但吞吐低 | FLOPS、MFU | 混合精度、算子优化、更大批次 |
| 显存带宽瓶颈 | 计算单元等待数据 | HBM 带宽 | 算子融合、减少中间读写 |
| 通信瓶颈 | 多卡扩展效率低 | AllReduce 耗时、NCCL 带宽 | 梯度压缩、通信重叠、拓扑优化 |
| 数据供给瓶颈 | GPU 空转等数据 | DataLoader 吞吐 | 预取、多进程、数据缓存 |
其中,通信瓶颈在分布式训练中尤为突出。数据并行下,每次迭代都要做一次全局梯度 AllReduce,通信量与参数量成正比。当模型达到百亿、千亿参数时,通信时间可能超过计算时间,扩展效率急剧下降。
四、分布式训练的必要性:从“能跑”到“跑得动”
分布式训练要解决的核心问题可以归纳为两个:显存不够和速度不够。对应地,主流策略分为三类:
- 数据并行(Data Parallelism):每张卡持有完整模型副本,切分数据。适合模型能单卡放下、但训练速度慢的场景。
- 模型并行(Model Parallelism):把模型切分到多张卡上,包括张量并行和流水线并行。适合单卡放不下的大模型。
- 混合并行:数据并行、张量并行、流水线并行组合使用,是当前大模型训练的主流方案。
但分布式训练并不是“免费加速”。引入多卡后,会带来梯度同步、通信开销、负载均衡、故障恢复等一系列新问题。DeepSpeed 的价值,正是在这些复杂约束下,提供一套系统化的显存优化与通信优化能力,让大模型训练从“理论可行”变成“工程可落地”。
五、案例复盘:一个 7B 模型单卡训练的典型困境
假设有一个 7B 参数的 Transformer 模型,使用 Adam 优化器和 FP16 混合精度训练。单卡显存占用大致如下:
模型参数(FP16):7B × 2B = 14GB
梯度(FP16): 7B × 2B = 14GB
优化器状态(FP32):7B × 8B = 56GB
激活值(batch=8):约 10~20GB
临时缓冲: 约 2~4GB
--------------------------------
合计: 约 96~108GB
而一张 A100 80GB 显卡只有 80GB 显存,结果就是 OOM。即使把 batch size 降到 1,激活值减少,参数、梯度和优化器状态仍然占 84GB,依然放不下。这就是典型的显存瓶颈。
如果强行用多卡数据并行,每张卡仍然要存完整模型和优化器状态,显存问题没有解决,只是增加了通信开销。此时,真正有效的方向是:使用 ZeRO 把优化器状态、梯度、参数分片到多张卡上,或者使用模型并行把模型本身切开。这正是 DeepSpeed 后续章节要展开的核心内容。
理解训练流程、显存构成和计算瓶颈,是理解 DeepSpeed 所有优化技术的前提。只有知道“卡在哪里”,才能明白“为什么这样优化”。