2. DeepSpeed基础回顾
在进入全链路监控与系统级调优之前,有必要先把 DeepSpeed 的四个核心能力重新梳理一遍:ZeRO 显存分片、Offload 卸载、混合精度训练与通信优化。它们共同决定了训练能否“跑得起来”,而监控与调优则决定训练能否“跑得快、跑得稳、跑得省”。理解这四者的作用边界与相互制约,是后续定位瓶颈、解读监控指标的前提。
一、ZeRO:把模型状态切开来放
数据并行(DP)的经典问题是每张卡都保存一份完整的模型状态,包括优化器状态、梯度和参数。以 Adam 为例,混合精度下每个参数大约需要 16 字节以上的状态开销,7B 模型仅状态就超过 100GB,单卡根本无法容纳。ZeRO(Zero Redundancy Optimizer)的核心思想是消除冗余,把这三类状态按 GPU 数量切分,需要时再通过通信临时聚合。
- ZeRO-1:只切分优化器状态,显存收益最大、通信代价最小,是性价比最高的一档。
- ZeRO-2:在 Stage 1 基础上再切分梯度,进一步降低显存,通信量小幅增加。
- ZeRO-3:参数也切分,显存占用最低,可训练超大模型,但前向/反向中需要频繁 All-Gather 参数,通信显著上升。
Stage 越高,显存越省,但通信与调度开销越大。因此“选哪个 Stage”本质上是显存与通信的权衡,而不是越高越好。
二、Offload:把状态搬到 CPU 或 NVMe
当 ZeRO 切分后单卡显存仍然不够时,Offload 会把优化器状态、梯度甚至参数卸载到 CPU 内存或 NVMe 磁盘。它让“单卡训练超大模型”成为可能,但代价是数据在 PCIe 上反复搬运。
{
"zero_optimization": {
"stage": 3,
"offload_optimizer": { "device": "cpu", "pin_memory": true },
"offload_param": { "device": "cpu", "pin_memory": true },
"overlap_comm": true,
"contiguous_gradients": true,
"stage3_gather_16bit_weights_on_model_save": true
}
}
其中 pin_memory 使用锁页内存加速 H2D/D2H 拷贝,overlap_comm 让通信与计算重叠。Offload 的典型症状是 GPU 利用率周期性掉坑,因为计算单元在等待数据从 CPU 搬来。是否开启 Offload,要看“显存是否真的不够”,而不是默认打开。
三、混合精度:FP16/BF16 与 Loss Scaling
混合精度让前向/反向用 FP16 或 BF16 计算,同时保留 FP32 主权重用于更新。它同时带来三重收益:显存减半、带宽压力降低、Tensor Core 算力释放。BF16 动态范围与 FP32 接近,通常无需 Loss Scaling;FP16 则需要动态损失缩放来防止梯度下溢。
"fp16": {"enabled": true} 或 "bf16": {"enabled": true} 开启。若出现 loss 突然变为 NaN 或 inf,优先检查 Loss Scaling 与梯度裁剪配置,而不是怀疑模型结构。四、通信优化:让集合通信不再是瓶颈
ZeRO 的切分必然引入 All-Gather、Reduce-Scatter 等集合通信。DeepSpeed 提供了多种优化手段:
- 通信与计算重叠:
overlap_comm让梯度规约与反向计算并行。 - 梯度压缩:如 1-bit Adam、1-bit LAMB,把通信量压缩一个数量级。
- 通信桶(bucket)调优:
reduce_bucket_size、allgather_bucket_size影响通信粒度与显存峰值。 - 拓扑感知:结合 NCCL 的 NVLink/IB 拓扑,减少跨节点通信。
下图展示了四个核心组件在训练迭代中的协作关系与相互制约:
五、为什么必须监控与调优
上述四个组件彼此耦合:开 ZeRO-3 会推高通信,开 Offload 会引入 PCIe 等待,混合精度配置不当会引发 NaN,通信桶设置不合理会造成显存尖峰。任何一个参数改动,都会在显存、带宽、算力、通信四个维度上产生连锁反应。没有监控,调优就是盲人摸象。
| 组件 | 主要收益 | 主要代价 | 关键监控指标 |
|---|---|---|---|
| ZeRO-1/2/3 | 显存占用大幅下降 | 集合通信量上升 | 显存峰值、All-Gather 耗时 |
| Offload | 突破单卡显存上限 | PCIe 拷贝、GPU 空转 | H2D/D2H 带宽、GPU 利用率 |
| 混合精度 | 显存减半、算力释放 | 数值稳定性风险 | loss 曲线、梯度范数、溢出计数 |
| 通信优化 | 扩展性提升 | 配置复杂度上升 | NCCL 耗时、通信/计算占比 |
六、典型场景与常见误区
场景:某团队用 8 卡 A100 训练 13B 模型,最初直接开 ZeRO-3 + Offload,结果 GPU 利用率长期在 40% 以下,吞吐远低于预期。通过监控发现瓶颈在 PCIe 拷贝与 All-Gather,改为 ZeRO-2 并关闭参数 Offload 后,显存刚好够用,吞吐提升近一倍。
常见误区一:“Stage 越高越好”。实际上 Stage 3 的通信开销可能吃掉显存收益,显存够用时应优先选低 Stage。
常见误区二:“Offload 是免费的显存”。Offload 只是把显存压力转移为 PCIe 带宽压力,GPU 利用率往往因此下降。
常见误区三:“开了混合精度就不用管数值”。FP16 下 Loss Scaling 与梯度裁剪必须配合监控,否则 NaN 难以定位。