在 Linux 上用 PyTorch 训练或推理时,节省内存(显存 + 内存)通常从模型、数据、计算方式、系统配置几个层面入手。下面按实用程度整理:
from torch.cuda.amp import autocast, GradScaler
scaler = GradScaler()
with autocast():
out = model(x)
loss = crit(out, y)
scaler.scale(loss).backward()
scaler.step(opt)
scaler.update()
✅ 显存可节省 30%~50%
accum_steps = 4
for i, (x, y) in enumerate(dataloader):
loss = model(x, y) / accum_steps
loss.backward()
if (i+1) % accum_steps == 0:
opt.step()
opt.zero_grad()
✅ 小显存跑大 batch
del x, y, out
torch.cuda.empty_cache()
⚠️ empty_cache() 只释放未用显存,不解决根本问题
torch.no_grad()推理或不需要梯度时:
with torch.no_grad():
out = model(x)
model.half() # FP16
# 或
model.to(torch.float16)
from torch.utils.checkpoint import checkpoint
out = checkpoint(model, x)
✅ 显存显著降低,训练稍慢
for p in model.backbone.parameters():
p.requires_grad = False
pin_memory=FalseDataLoader(..., pin_memory=False)
num_workersDataLoader(..., num_workers=2)
⚠️ worker 过多会复制多份数据
np.memmaplist 存全部 tensordel 和 gcimport gc
del big_var
gc.collect()
ulimit -v 8000000 # 8GB
watch -n 1 nvidia-smi观察显存峰值
nvidia-smi
kill -9 PID
no_graddel + empty_cachenum_workers 合理如果你能说明:
我可以给你针对性的最小改动方案。