如何用 DeepSpeed ZeRO-3 估算 175B 模型在 128 卡 A100 下的最小显存占用?
解读
面试官问的是“最小显存占用”,而不是“能不能跑”。
在国内一线厂的真实面试里,这题考察三层能力:
- 对 ZeRO-3 切分粒度的量化直觉——参数、梯度、优化器状态各自被切成多少份;
- 对 A100 80 GB 实际可用显存的经验折扣——框架、通信缓冲、激活 checkpoint、CUDA kernel 预留;
- 能否在 30 秒内给出可落地的估算公式,并指出风险点,体现“LLMOps 工程化”思维。
知识点
- ZeRO-3 把参数、梯度、优化器状态全部按层切分到所有数据并行 rank,每张卡只存 1/N。
- 175 B 参数以FP16 存储,单参数 2 byte;优化器状态用AdamW,需保存 FP32 的 momentum 与 variance,共 12 byte/参数。
- 激活值在activation checkpointing开启时,显存与序列长度、batch size 成正比,可暂时按“固定 4 GB/卡”经验值预留。
- A100 80 GB 在 DeepSpeed 下实际可用约 72 GB——PyTorch 框架、NCCL buffer、CUDA context 会吃掉 6~8 GB。
- 最小显存占用 = 模型状态显存 + 激活显存 + 通信缓冲显存,其中模型状态显存 = (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。
拓展思考
- 如果换成ZeRO-3 + CPU Offload,可把优化器状态卸载到内存,显存瞬间降到 6.5 GB/卡,但训练速度下降 30 %~50 %,需评估业务对吞吐的容忍度。
- 国内大厂常把序列长度拉到 8 k 以上,激活显存会平方级增长,此时 27 GB 预算会被迅速击穿,必须打开序列并行或TP+PP混合并行。
- 面试时若再追问“如何验证”,可答:用
deepspeed.profiling.flops_profiler实测,配合nvidia-smi dmon看峰值,再用DeepSpeed 的 memory profiler 打印Model States | Activations | Unaccounted三项,误差可控制在 1 GB 以内,体现可观测性意识。