首页/AI/大模型部署与运维速查/CUDA OOM 排查:从止损到根因
运维监控与排障50 条

CUDA OOM 排查:从止损到根因

推理服务报显存不足的排查顺序:先读报错原文分辨物理占用还是分配器缓存,再核对该卡是否被其他进程占用,最后按并发、序列长度、量化三个方向收敛修复。

显存不足的排查顺序

推理服务报显存不足时,先分清是物理占用真的不够,还是分配器缓存把空间占着:两者处理方式不同。读报错原文能看到申请大小、卡容量、已分配与已保留的完整账单。第二步确认这张卡上是否有其他进程占用,第三步才从并发、序列长度与精度三个方向收敛修复,避免一上来就重启。

取证

取证
# 卡的容量与占用
nvidia-smi --query-gpu=index,memory.used,memory.total --format=csv
# 谁是占用方
nvidia-smi --query-compute-apps=pid,process_name,used_memory --format=csv
# 报错原文:注意申请大小与已保留两项
grep -i -m5 'out of memory' server.log

三步动作

  • 先止损:限制在途请求数与显存预算比例,或临时调低上下文上限后重启
  • 再核对:确认同卡是否还有训练任务、调试脚本等进程占着显存
  • 后根治:按量化降精度、张量并行扩卡、限制输入输出长度三条路选一条落地

报错文本怎么读

信息项含义判断
申请大小本次尝试分配的显存明显偏大多与长输入或大批次有关
卡容量设备总显存与采购规格核对,确认没有看错卡
已分配张量实际占用持续接近容量说明业务本身偏重
已保留分配器持有的总量保留远高于分配时缓存占着空间
空闲但分配失败总量够但没有连续大块典型碎片特征,需要调整分配策略
重启回收的是碎片与缓存:如果同一个配置在运行一段时间后周期性失败,说明根因在于长度分布或并发上限,而不是服务本身不稳定。
把显存预算比例调到接近上限来「榨干」显卡会让问题更早出现:短上下文压测看不出异常,长上下文并发时会比之前更早失败。

易错点

  • 只把显存比例调低就收工:若是别的进程占卡,等待再久也不会缓解
  • 不看报错原文:申请大小与已保留两项能直接区分物理不足与缓存占用
  • 重启了事:周期性复发说明根因未处理,故障会按业务高峰的节奏回来
  • 只调一个方向:并发、长度与精度三条路要按成本排序,单改一项可能事倍功半
  • 忽略长度分布:按平均长度配置的容量在高水位请求扎堆时必然不够

数据来源与参考

  • PyTorch 官方文档:CUDA semantics 与显存管理(docs.pytorch.org)
  • vLLM 官方文档:Conserving Memory(docs.vllm.ai)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌