GPU显存占用分析与计算
一句话总结
GPU显存占用由模型参数、优化器状态、梯度和激活值四部分组成,精确估算显存是LLM训练配置的基础。
核心概念
以7B模型BF16训练为例:(1)模型参数:7B×2字节=14GB;(2)梯度:与参数同大=14GB;(3)优化器状态(AdamW):FP32主权重7B×4=28GB + 一阶矩7B×4=28GB + 二阶矩7B×4=28GB = 84GB;(4)激活值(Activations):取决于序列长度、batch size和层数,通常是最大的变量。激活值可通过Gradient Checkpointing(激活重计算)用时间换空间——只保存部分层的激活值,反向传播时重新计算,显存降低约60%但训练慢30%。总计:参数14+梯度14+优化器84≈112GB(不含激活值)。这就是为什么7B模型至少需要2张80GB A100来训练。
为什么重要
显存不足是LLM训练最常遇到的问题(CUDA OOM)。准确估算显存可以帮助选择合适的硬件配置、确定最大可用Batch Size、决定是否需要梯度累积或模型并行。显存估算错误可能导致训练中途崩溃,浪费大量时间和成本。
实践要点
ZeRO Stage 1/2/3分别将优化器状态/梯度/参数分片到多张GPU上;Gradient Checkpointing是空间不足时的首选方案;推理时只需模型参数的显存(7B FP16≈14GB);torch.cuda.memory_summary()可查看详细显存分配情况;显存碎片也是一个隐性问题,实际可用显存小于物理显存。
常见误区
误区一:模型参数就是全部显存——优化器状态通常占显存的大头(占比约60%)。误区二:推理和训练的显存需求相同——训练需要额外存储梯度、优化器状态和激活值,通常是推理的4-8倍。误区三:batch size减到1就不会OOM——即使batch size为1,模型参数+优化器状态已经是固定开销。