在 Linux 上使用 PyTorch 时出现显存不足(CUDA out of memory),通常不是 Linux 本身的问题,而是GPU 显存被占满或模型/数据过大导致的。下面按常见原因和对应解决办法系统说明。
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()
Linux 上可能有:
✅ 查看显存占用:
nvidia-smi
✅ 杀掉占用进程:
kill -9 PID
或:
fuser -k -v /dev/nvidia*
常见错误:
loss.backward()
# 忘记
optimizer.zero_grad()
或:
a = model(x) # 一直被引用
✅ 正确写法:
optimizer.zero_grad()
loss.backward()
optimizer.step()
✅ 手动释放:
del x, y, output
torch.cuda.empty_cache()
例如:
outputs = []
for x in data:
outputs.append(model(x))
✅ 改法:
with torch.no_grad():
outputs.append(model(x).cpu())
.cuda() / .to(device)device = "cuda"
model = model.to(device)
x = x.to(device)
否则可能在 CPU + GPU 混合,导致异常显存增长。
✅ 使用混合精度(强烈推荐):
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% 显存
torch.no_grad()在验证/测试时:
with torch.no_grad():
output = model(x)
解决方案:
torch.float16 / bfloat16accelerate / DeepSpeedPyTorch 缓存机制问题
✅ 解决:
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 截图我可以直接帮你算显存该怎么调。