在 CentOS 上遇到 PyTorch 占用内存(RAM)过高 的问题,通常可以从代码层面、环境配置、系统层面三个方向来排查和优化。下面给你一份实用清单。
在 CentOS 上先确认:
free -h
top
# 或
htop
重点看:
如果是 GPU 显存高,那是另一回事(可用 nvidia-smi 看)。
❌ 常见问题:
a = torch.randn(10000, 10000)
b = a.cpu()
# a 和 b 同时存在
✅ 优化:
del a
torch.cuda.empty_cache() # GPU 情况
❌ 问题:
num_workers 太大.detach() / .cpu()✅ 建议:
DataLoader(..., num_workers=4, pin_memory=True)
并且:
list(dataset)mmap 或 torch.load(..., mmap=True)❌ 问题:
outputs = model(inputs)
loss = outputs.sum()
# outputs 一直存在
✅ 优化:
with torch.no_grad():
outputs = model(inputs)
.item() 而不是 Python 数值❌ 错误:
loss_list.append(loss)
✅ 正确:
loss_list.append(loss.item())
否则会保留整个计算图。
torch.cuda.empty_cache()
⚠️ 注意:只在 GPU 场景有效,且不能“减少 Python 内存”。
model.half() # FP16
# 或
torch.set_grad_enabled(False)
torch.utils.checkpoint适合大模型:
from torch.utils.checkpoint import checkpoint
ulimit -v 8G
或在 systemd 中:
MemoryLimit=8G
swapon -s
# 如没有:
fallocate -l 8G /swapfile
mkswap /swapfile
swapon /swapfile
⚠️ swap 只是应急,不是根本解决。
ps -o pid,rss,cmd -p <PID>
多次观察 RSS 是否只增不减。
top 看是哪个进程del 和 no_grad你可以补充:
我可以直接帮你定位是哪一行代码吃内存。