在 CentOS 上运行 PyTorch 时占用内存(RAM)过高,通常和模型大小、数据加载方式、PyTorch 自身配置有关。下面按「常见原因 → 对应解决办法」给你一套实用排查清单。
很多人会混淆:
free -h 看得到nvidia-smi 看得到你说是 CentOS + PyTorch 占用内存高,下面默认指 系统内存(RAM)。
num_workers 开太大这是最常见原因。
loader = DataLoader(..., num_workers=16)
每个 worker 会复制一份数据集对象(尤其是数据集在内存里)。
✅ 解决:
num_workerspersistent_workers=True(PyTorch ≥1.7)DataLoader(..., num_workers=4, persistent_workers=True)
例如:
data = [load(x) for x in files] # 几百万张图
✅ 解决:
mmap、HDF5、LMDB、WebDataset尤其是:
✅ 缓解:
torch.cuda.ampoptimizer.zero_grad(set_to_none=True)常见于:
.append() 到 list✅ 排查:
pip install memory_profiler
from memory_profiler import profile
@profile
def train():
...
overcommit 问题CentOS 默认内存策略可能让 PyTorch 更容易“吃爆”。
查看:
cat /proc/sys/vm/overcommit_memory
✅ 建议:
# 临时
sysctl vm.overcommit_memory=1
# 永久
echo "vm.overcommit_memory=1" >> /etc/sysctl.conf
sysctl -p
PyTorch CPU 版会开很多线程。
查看:
nproc
限制线程:
export OMP_NUM_THREADS=4
export MKL_NUM_THREADS=4
或在代码里:
torch.set_num_threads(4)
# 看内存
free -h
# 看进程
top
# 或
ps aux --sort=-%mem | head
# 看某个 Python 进程
cat /proc/<pid>/status | grep VmRSS
大概率是:
✅ 典型错误:
losses.append(loss) # loss 是 tensor
✅ 正确:
losses.append(loss.item())
你可以补充:
free -h 截图或数值nvidia-smi)我可以直接帮你定位到“哪一行代码在吃内存”。