GPU显存不够会怎样?大模型训练和推理的显存估算方法

在常规 PyTorch CUDA 训练或推理路径中,GPU 显存不足通常会触发 CUDA out of memory 并中断;只有显式启用 CPU offload、分片或其他内存迁移策略时,任务才可能避免即时 OOM,但通常以明显性能下降为代价。估算方法:推理显存 ≈ 权重 + KV Cache + 运行开销;训练显存还要再加梯度与优化器状态(混合精度 Adam 训练约每参数 16 字节),需按精度、上下文与并发留足余量。

一、GPU显存不够时会怎样?

在常规 PyTorch CUDA 训练或推理路径中,显存不够通常会触发 CUDA out of memory 并中断,而不是"跑得慢一点"。报错信息通常形如"CUDA out of memory. Tried to allocate X GiB, Y GiB free"——告诉你要分配多少、还剩多少。若显式启用了 CPU offload、分片或内存迁移策略,任务可能避免即时 OOM,但通常伴随明显的性能下降。因此,显存仍是常规部署路径下的硬性容量约束。

显存不够可能在三个时机暴露:

  • 启动/加载阶段:权重本身就放不下。典型如 70B FP16 裸权重约 140GB,单张 80GB 卡直接装不下,加载阶段就会失败。

  • 训练中途:激活值占用随 batch size、序列长度波动,常在 batch 增大、动态长度批次出现更长序列,或评估、保存等阶段的峰值显存上升时暴露。

  • 推理高并发时:KV Cache 随并发数线性叠加,单请求测试正常、流量上来后 OOM。

另一个常见因素是缓存分配器与显存碎片:当 PyTorch 保留但未分配的显存较大时,可能影响后续分配。可结合报错中的 allocated、reserved 等信息排查,并尝试重开进程或调整分配器配置;是否属于碎片仍需结合实际负载判断。无论如何,事先估算都比事后报错便宜——这正是本文要给的方法。

二、推理显存怎么估算?

推理显存 ≈ 权重 + KV Cache + 激活值 + 运行时开销

第一项:权重,按精度换算。常用估算:FP16/BF16 每参数约 2 字节,INT8 约 1 字节,INT4 约 0.5 字节(weight-only 量化,量化元数据另计)。以 70B 模型为例:FP16 约 140GB、INT8 约 70GB、INT4 约 35GB。

第二项:KV Cache,随上下文和并发线性增长。估算公式:每 token KV Cache ≈ 2 × 层数 × KV 头数 × 头维度 × 每元素字节数。以 Llama 2 70B(80 层、8 KV 头、头维度 128,GQA 结构)FP16 推理为例:约 0.31 MB/token,32K 上下文单请求约 10.7GB,10 路并发约 107GB。注意力结构不同(MHA/GQA/MLA)差异很大,应以具体模型为准。

第三、四项:激活值与运行时开销。批处理激活值随 batch 增大;CUDA 上下文、框架缓冲、通信缓冲等运行时开销难以用公式估算。本文不给固定预留值,建议部署后以实际占用监控为准,投产前用目标负载压测。

组合示例:70B INT8 推理、单请求 32K 上下文:权重约 70GB + KV Cache 约 10.7GB ≈ 80.7GB,再加运行时开销,单张 80GB 卡非常勉强,96GB 卡余量也不宽裕——这就是"裸权重装得下"与"能稳定服务"的差距。更详细的推理规模判断可参考《H20显存多大?适合跑什么规模的大模型推理》

三、训练显存怎么估算?

训练显存 ≈ 权重 + 梯度 + 优化器状态 + 激活值(+ 运行开销),显著高于推理。以业界通用的 ZeRO 论文口径估算:混合精度训练 + Adam 优化器,不做任何显存优化时,每参数约 16 字节,构成为 FP16 权重 2 + FP16 梯度 2 + FP32 主权重 4 + FP32 动量 4 + FP32 方差 4 字节。

据此估算常见模型训练的静态显存(未含激活值,也未做任何显存优化):

模型规模 静态显存(16 字节/参数) 说明
7B 约 112GB 未优化口径下超出单张 80GB 卡
14B 约 224GB 同上
32B 约 512GB 需多卡
70B 约 1,120GB 需多卡集群或显存优化

三点说明:

  • 该口径是上限参照,不是必须准备这么多。实际工程几乎都会做显存优化:gradient checkpointing(激活值重算)、ZeRO 分片与 CPU offload、LoRA 等参数高效微调(只训练少量参数,优化器状态随之大幅减少)都会显著降低实际占用。

  • 激活值另算,且波动大。取决于 batch、序列长度与模型结构,无法给出通用公式;用目标配置实测是唯一可靠办法。

  • 同一模型,训练比推理吃显存得多。仅按静态口径对比,混合精度训练的 16 字节/参数约为 FP16 推理权重 2 字节/参数的 8 倍,还没算训练中通常更大的激活值——所以"这张卡能推理"不代表"这张卡能微调"。

四、显存不够时有哪些应对方法?

按"先降需求、再上手段、最后换资源"的顺序考虑:

  • 推理侧:降低量化精度(INT8/INT4 weight-only 量化)→ 限制上下文长度与并发数 → KV Cache 量化 → 仍不够则换更大显存 GPU 或多卡张量并行。

  • 训练侧:先减小 batch size、开启 gradient checkpointing(用约一次前向重算的代价换激活显存,PyTorch 对应 torch.utils.checkpoint)→ 多卡场景用 ZeRO 分片优化器状态、梯度乃至参数,或 CPU offload → 只调少量参数的任务改用 LoRA 等参数高效微调 → 仍不够则升级显存或多卡。

  • 认清代价:量化可能影响精度,checkpointing 和 offload 会拉长训练时间,LoRA 的效果范围与全参数微调不同。这些手段都是"以别的资源换显存",选择前应按任务要求评估。

五、在立方云上怎么选?

按显存需求分档(以下为页面展示信息,具体规格、价格与可用库存以控制台实时展示为准):

  • 7B–14B 推理、轻量微调实验RTX 5090 32GB 单卡(按小时计费,页面标价 ¥2.98/时,页面标注带宽 1.79 TB/s)。7B FP16 裸权重约 14GB,余量可支撑中等上下文;14B 需按量化与上下文评估。多卡可评估 RTX 5090 8 卡整机(页面标价 ¥13,200/月)。

  • 32B–70B 量化推理、更大并发PRO 6000 96GB 单卡(按小时计费,页面标价 ¥7.90/时,页面标注带宽 1.57 TB/s)。96GB 相对 32GB 的价值区间正是"权重大、需要余量装 KV Cache"的场景。

  • 更大规模训练与推理:页面展示的 H200 141GB、H100 80G SXM5、A100 80G SXM 8 卡整机(均为获取报价模式)。上文 70B 级训练按未优化口径需约 1,120GB 静态显存,单机 8 卡合计也需配合 ZeRO 等显存优化手段评估。


本文首发于立方云技术博客。立方云是网鼎科技旗下专注 GPU 算力租赁的边缘算力服务平台,提供裸金属与容器实例服务。如需了解当前可用 GPU 规格与计费方式,可前往 lifangyun.com 查看。

六、常见问题

1. GPU显存不够会变慢吗?

常规 PyTorch CUDA 路径下通常会直接报 CUDA out of memory 错误中断,不存在"自动降速继续跑"。只有在显式启用 CPU offload、分片或内存迁移策略时,任务才可能避免即时 OOM,但通常伴随明显的性能下降。变慢通常是算力或带宽瓶颈,与显存容量不够是两类问题。

2. 同一模型,训练和推理哪个更吃显存?

训练。仅静态口径,混合精度 Adam 训练约每参数 16 字节,约为 FP16 推理权重(2 字节/参数)的 8 倍,训练激活值通常也更大。所以能推理的卡不一定能微调。

3. 7B模型推理需要多少显存?

FP16 裸权重约 14GB。16GB 卡仅剩约 2GB 给 KV Cache 与开销,只适合短上下文低并发;24GB 较稳;32GB 从容。若用 INT8/INT4 量化,占用约 7GB/3.5GB,压力大幅缓解。

4. gradient checkpointing是什么?

一种以计算换显存的技术:反向传播时不保存部分中间激活,需要时重新前向计算,从而显著降低训练激活显存,代价是训练时间增加。PyTorch 中对应 torch.utils.checkpoint 模块。

5. 怎么查看GPU显存占用?

系统层面用 nvidia-smi 命令实时查看各卡显存占用与进程;PyTorch 训练脚本中可结合 torch.cuda.memory_allocated 查看当前张量占用,并用 torch.cuda.max_memory_allocated 记录峰值。nvidia-smi 适合观察持续占用,可能错过短暂峰值,短时峰值应以框架统计和目标负载压测为准。