世界杯积分榜_世界杯几年一届 - fjmzsy.com

什么是 OOM(Out Of Memory)?如何系统排查和解决?

7509

文章目录

什么是 OOM?主要表现:

常见的 OOM 触发原因(以 PyTorch 训练为例)如何解决 OOM?【实战建议】如何判断是否是 **服务器问题** 导致的 OOM?1. 实时查看 GPU 状态2. 查询当前服务器剩余显存3. 查看当前被谁占用(找 PID)4. 必要时杀掉僵尸进程(谨慎操作)5. 查看整体系统内存 / CPU 占用6. PyTorch 内部显存监测(调试利器)

总结:是否为服务器问题?

在训练深度学习模型时,很多人都会遇到这个令人头疼的报错:

torch.cuda.OutOfMemoryError: CUDA out of memory.

这就是传说中的 OOM,即 “内存溢出(Out Of Memory)”。它既可能发生在 GPU 显存 上,也可能发生在 CPU 内存(RAM) 上。

本文将系统讲解:

OOM 是什么?常见触发原因有哪些?如何定位与解决?是否服务器的问题?如何判断?

什么是 OOM?

OOM(Out of Memory)意为“内存溢出”,指程序运行过程中试图申请的内存超过了系统或设备允许的限制,导致运行失败。

主要表现:

类型说明报错示例GPU OOM显存不足,模型或数据太大torch.cuda.OutOfMemoryErrorCPU OOMRAM 不足,例如数据加载过大Killed、Linux oom-killer 被触发其他设备包括嵌入式平台、移动端等设备内存耗尽程序崩溃、系统卡顿、自动重启等

常见的 OOM 触发原因(以 PyTorch 训练为例)

类别典型原因与举例Batch 设置batch_size 太大,图像数量、分辨率超出负荷模型结构太大使用 ResNet-152、ViT、UNet 等大型模型图像分辨率太高从 256×256 提升到 512×512,显存需求将近 4 倍梯度未释放使用 retain_graph=True,导致计算图保留,显存爆炸多卡不均衡多 GPU 分配不均,某一张卡 OOM,其他卡空闲缓存未清理中间变量、缓存图、DataLoader 内部堆积数据导致内存泄露

如何解决 OOM?【实战建议】

方法效果✅ 减小 batch_size最直接有效,降低单次显存需求✅ 降低输入分辨率显存占用按面积缩小,如 512 → 256 降低 4 倍✅ 使用 AMP 混合精度训练(autocast)显存降低 30% 以上,训练更快✅ 梯度累积(gradient accumulation)模拟大 batch,显存开销小,优化器照常更新✅ 使用轻量模型(如 MobileNet, TinyViT)显存友好,适合资源受限设备✅ 释放显存中间变量del var; torch.cuda.empty_cache()✅ 避免不必要的 retain_graph=True尤其是在循环、GAN 等网络中

如何判断是否是 服务器问题 导致的 OOM?

以下是系统性排查流程:

1. 实时查看 GPU 状态

这是 NVIDIA 官方工具,用于查看 GPU 的使用情况(显存、进程、温度、功耗等)。

watch -n 1 nvidia-smi

其中 -n 1 表示每 1 秒自动刷新一次界面,实现实时监控。

你可以看到:

每张 GPU 的 Memory-UsageProcesses 区域列出每个进程的使用显存情况是否其他用户进程已经占满显卡

2. 查询当前服务器剩余显存

nvidia-smi --query-gpu=memory.total,memory.free,memory.used --format=csv

输出示例:

memory.total [MiB], memory.free [MiB], memory.used [MiB]

16160 MiB, 400 MiB, 15760 MiB

你就知道还剩多少空间。

3. 查看当前被谁占用(找 PID)

nvidia-smi -q -d PIDS

# 或

ps aux | grep python

识别是否你自己有残留进程,或者别人占用了显卡资源。

4. 必要时杀掉僵尸进程(谨慎操作)

kill -9

适用于无响应进程或训练失败后未自动释放资源的情况。

5. 查看整体系统内存 / CPU 占用

htop # 更美观,可交互

top # 基本版本

查看是否有 RAM 过满、CPU 占满等异常。

6. PyTorch 内部显存监测(调试利器)

import torch

print(torch.cuda.memory_allocated() / 1024 ** 2, "MB") # 已分配

print(torch.cuda.memory_reserved() / 1024 ** 2, "MB") # 保留但未用

可帮助你识别某段代码或模型结构是否显存爆炸。

总结:是否为服务器问题?

现象是否服务器问题?GPU 显存几乎满,但不是你占用✅ 是,服务器资源分配问题GPU 几乎空闲,但仍报 OOM❌ 多半是你代码问题你自己的进程显存暴涨(batch/model太大)❌ 是你本地代码问题有显存碎片,无法分配大块显存✅/❌ 看具体释放策略

九鼎韬略
大富翁桌遊dcard有哪些常見問題? - 大撈家Dcard討論區