温馨提示×

linux pytorch为何报内存错

小樊
55
2026-10-07 08:48:03
栏目: 智能运维

在 Linux 上使用 PyTorch 报“内存错”(通常是 CUDA out of memory 或 RuntimeError: unable to allocate memory),原因一般可以归为以下几类。我按最常见 → 较少见给你梳理,并给出对应解决办法。


一、最常见原因

1️⃣ GPU 显存不足(CUDA OOM)

报错类似:

RuntimeError: CUDA out of memory. Tried to allocate ...

原因

  • batch size 太大
  • 模型太大(如大模型、深网络)
  • 中间变量未释放
  • 同时跑了多个 PyTorch / 训练进程

解决办法

# 1. 减小 batch size
batch_size = 8  # 改成 4 / 2

# 2. 及时释放显存
del x, y
torch.cuda.empty_cache()

# 3. 使用混合精度
from torch.cuda.amp import autocast, GradScaler
scaler = GradScaler()

with autocast():
    output = model(input)

2️⃣ 模型或数据在 CPU / GPU 之间搞混

报错类似:

RuntimeError: Expected all tensors to be on the same device

原因

  • 模型在 GPU,数据在 CPU(或反过来)
  • .cuda() 和 .to(device) 混用

正确写法

device = "cuda" if torch.cuda.is_available() else "cpu"
model = model.to(device)
x = x.to(device)

3️⃣ 用了 .cuda() 但机器没有 GPU

报错:

AssertionError / CUDA error / no CUDA-capable device

检查

nvidia-smi
python -c "import torch; print(torch.cuda.is_available())"

二、Linux 特有原因

4️⃣ 系统内存(RAM)不足(不是显存)

报错:

MemoryError
Bus error
Killed

原因

  • 数据加载太多(DataLoader num_workers 太大)
  • 系统内存被其他进程吃光

解决

DataLoader(..., num_workers=4)  # 减少
free -h
top

5️⃣ ulimit 限制

Linux 默认可能限制内存或线程数。

ulimit -a

可临时解除:

ulimit -s unlimited

三、PyTorch 自身问题

6️⃣ PyTorch / CUDA 版本不匹配

nvcc --version
python -c "import torch; print(torch.version.cuda)"

不匹配会导致奇怪的内存/设备错误。


7️⃣ 内存碎片(显存碎片)

即使显存“看着够”,也可能分配失败。

解决

  • 减少临时 tensor
  • 使用 torch.cuda.memory_summary() 查看

四、快速自查清单 ✅

你可以照着一步步来:

  1. nvidia-smi 看显存占用
  2. torch.cuda.is_available()
  3. 模型和数据是否同 device
  4. batch size 是否过大
  5. 是否有其他进程占 GPU
  6. 是否是系统内存不足(非 GPU)

五、如果你愿意

你可以把完整报错信息贴出来(红字那段),我可以精准判断是显存 / 内存 / 设备 / 代码问题,甚至帮你改代码。

0 踩