如何用 DeepSpeed ZeRO-3 估算 175B 模型在 128 卡 A100 下的最小显存占用?

解读

面试官问的是“最小显存占用”,而不是“能不能跑”。
在国内一线厂的真实面试里,这题考察三层能力:

  1. 对 ZeRO-3 切分粒度的量化直觉——参数、梯度、优化器状态各自被切成多少份;
  2. 对 A100 80 GB 实际可用显存的经验折扣——框架、通信缓冲、激活 checkpoint、CUDA kernel 预留;
  3. 能否在 30 秒内给出可落地的估算公式,并指出风险点,体现“LLMOps 工程化”思维。

知识点

  1. ZeRO-3 把参数、梯度、优化器状态全部按层切分到所有数据并行 rank,每张卡只存 1/N。
  2. 175 B 参数以FP16 存储,单参数 2 byte;优化器状态用AdamW,需保存 FP32 的 momentum 与 variance,共 12 byte/参数。
  3. 激活值在activation checkpointing开启时,显存与序列长度、batch size 成正比,可暂时按“固定 4 GB/卡”经验值预留。
  4. A100 80 GB 在 DeepSpeed 下实际可用约 72 GB——PyTorch 框架、NCCL buffer、CUDA context 会吃掉 6~8 GB。
  5. 最小显存占用 = 模型状态显存 + 激活显存 + 通信缓冲显存,其中模型状态显存 = (2 + 2 + 12) byte × 175 B ÷ 128 ≈ 21.9 GB

答案

步骤一:计算每张卡分到的模型状态

  • 参数 FP16:175 B × 2 byte ÷ 128 = 2.73 GB
  • 梯度 FP16:同上,2.73 GB
  • 优化器状态 FP32:175 B × 12 byte ÷ 128 = 16.4 GB
    模型状态合计 ≈ 21.9 GB

步骤二:加激活与通信缓冲

  • activation checkpointing 下经验预留 4 GB
  • DeepSpeed ZeRO-3 的**“参数预取”缓冲**默认 1 GB/卡
    总需求 ≈ 21.9 + 4 + 1 = 26.9 GB

步骤三:对比可用显存
A100 80 GB 实测可用 72 GB,26.9 GB 仅占 37 %,因此128 卡可以安全跑下 175 B 模型,且最小显存占用为 27 GB 左右;若继续压测,可把激活压缩到 2 GB、关闭冗余日志,理论下限可逼近 24 GB

拓展思考

  1. 如果换成ZeRO-3 + CPU Offload,可把优化器状态卸载到内存,显存瞬间降到 6.5 GB/卡,但训练速度下降 30 %~50 %,需评估业务对吞吐的容忍度。
  2. 国内大厂常把序列长度拉到 8 k 以上,激活显存会平方级增长,此时 27 GB 预算会被迅速击穿,必须打开序列并行TP+PP混合并行。
  3. 面试时若再追问“如何验证”,可答:用 deepspeed.profiling.flops_profiler 实测,配合 nvidia-smi dmon 看峰值,再用DeepSpeed 的 memory profiler 打印 Model States | Activations | Unaccounted 三项,误差可控制在 1 GB 以内,体现可观测性意识。