温馨提示×

linux pytorch为何显存不足

小樊
57
2026-10-07 08:55:06
栏目: 智能运维

在 Linux 上使用 PyTorch 时出现显存不足(CUDA out of memory),通常不是 Linux 本身的问题,而是GPU 显存被占满或模型/数据过大导致的。下面按常见原因和对应解决办法系统说明。


一、最常见原因

1️⃣ 模型或 batch size 太大

  • 模型参数量大(如 LLM、大模型)
  • batch_size 设置过大
  • 输入尺寸过大(图像、序列长度)

✅ 解决办法:

# 减小 batch size
train_loader = DataLoader(..., batch_size=8)  # 改小

# 使用梯度累积(等效大 batch)
accumulation_steps = 4
loss = loss / accumulation_steps
loss.backward()
if step % accumulation_steps == 0:
    optimizer.step()
    optimizer.zero_grad()

2️⃣ 显存被其他进程占用(非常常见)

Linux 上可能有:

  • 之前的 Python 进程没退出
  • Jupyter / notebook 残留
  • 多人共用 GPU 服务器

✅ 查看显存占用:

nvidia-smi

✅ 杀掉占用进程:

kill -9 PID

或:

fuser -k -v /dev/nvidia*

3️⃣ 没有及时释放显存

常见错误:

loss.backward()
# 忘记
optimizer.zero_grad()

或:

a = model(x)  # 一直被引用

✅ 正确写法:

optimizer.zero_grad()
loss.backward()
optimizer.step()

✅ 手动释放:

del x, y, output
torch.cuda.empty_cache()

4️⃣ 在训练时保存了过多中间变量

例如:

outputs = []
for x in data:
    outputs.append(model(x))

✅ 改法:

with torch.no_grad():
    outputs.append(model(x).cpu())

二、PyTorch 特有原因

5️⃣ 没使用 .cuda() / .to(device)

device = "cuda"
model = model.to(device)
x = x.to(device)

否则可能在 CPU + GPU 混合,导致异常显存增长。


6️⃣ 使用了不必要的高精度

✅ 使用混合精度(强烈推荐):

from torch.cuda.amp import autocast, GradScaler

scaler = GradScaler()
with autocast():
    output = model(x)
    loss = criterion(output, y)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()

可节省 30%~50% 显存


7️⃣ 没用 torch.no_grad()

在验证/测试时:

with torch.no_grad():
    output = model(x)

三、进阶原因(大模型必看)

8️⃣ 模型太大(LLM / diffusion)

解决方案:

  • ✅ 使用 torch.float16 / bfloat16
  • ✅ 模型并行
  • ✅ 使用 accelerate / DeepSpeed
  • ✅ LoRA / 冻结参数

9️⃣ 显存碎片(OOM 但 nvidia-smi 显示没满)

PyTorch 缓存机制问题

✅ 解决:

export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True

或:

torch.cuda.empty_cache()

四、快速自检清单 ✅

训练前检查:

  • [ ] nvidia-smi 是否有其他进程
  • [ ] batch_size 是否过大
  • [ ] 是否 model.to('cuda')
  • [ ] 是否使用 torch.no_grad()
  • [ ] 是否使用混合精度
  • [ ] 是否及时 zero_grad()

五、最小可运行建议配置(省显存)

model.half().cuda()
x = x.half().cuda()

with torch.no_grad():
    y = model(x)

如果你愿意,可以贴出:

  • 报错信息
  • nvidia-smi 截图
  • 模型类型(CNN / Transformer / LLM)
  • batch size

我可以直接帮你算显存该怎么调。

0 踩