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 则需要动态损失缩放来防止梯度下溢。

DeepSpeed 中通过 "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 拓扑,减少跨节点通信。

下图展示了四个核心组件在训练迭代中的协作关系与相互制约:

DeepSpeed 核心组件协作与监控切入点 训练迭代 前向 → 反向 → 规约 → 更新 ZeRO 显存分片 Stage1 优化器状态 Stage2 +梯度 Stage3 +参数 省显存 ↑ 通信 ↑ Offload 卸载 优化器状态 → CPU 参数 → CPU / NVMe pin_memory 加速拷贝 显存 ↓ PCIe 压力 ↑ 混合精度 FP16 / BF16 计算 FP32 主权重更新 Loss Scaling 防下溢 显存 ↓ 算力 ↑ 通信优化 overlap_comm 重叠 梯度压缩 1-bit Adam bucket 尺寸调优 通信 ↓ 扩展性 ↑ 监控与调优切入点 显存 / 带宽 / 通信 / 利用率 / 吞吐

五、为什么必须监控与调优

上述四个组件彼此耦合:开 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 难以定位。