在 Linux 下使用 PyTorch 训练或推理时,**省内存(显存 / RAM)**通常从以下几个方面入手。下面按「实用程度 + 常见场景」给你一个清单。
torch.cuda.empty_cache()import torch
torch.cuda.empty_cache()
⚠️ 只能释放未被引用的缓存,不能凭空省钱,但能避免碎片。
最直接有效:
batch_size = 8 # 从 32 降到 8
如果 batch 太小影响效果,可用 梯度累积。
accum_steps = 4
for i, (x, y) in enumerate(dataloader):
loss = model(x).loss / accum_steps
loss.backward()
if (i + 1) % accum_steps == 0:
optimizer.step()
optimizer.zero_grad()
✅ 小 batch 模拟大 batch
torch.no_grad()(推理 / 验证)with torch.no_grad():
output = model(x)
避免保存计算图,省大量显存。
scaler = torch.cuda.amp.GradScaler()
with torch.cuda.amp.autocast():
loss = model(x).loss
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()
✅ 显存 ↓ 30%~50%
model.half() # FP16
# 或
model = model.to(torch.float32) # 避免默认 float64
del x, y, loss
torch.cuda.empty_cache()
model.eval()(验证时)model.eval()
关闭 dropout / batch norm 更新。
DataLoader 的 num_workersDataLoader(..., num_workers=4, pin_memory=True)
⚠️ 太多反而吃内存
❌ 错误:
data = [load(i) for i in range(100000)]
✅ 正确:
Datasetyieldnp.memmap, lmdb, webdataset)del + gc.collect()import gc
del large_var
gc.collect()
model.gradient_checkpointing_enable()
✅ 用时间换显存
适合:
# HuggingFace
model = AutoModel.from_pretrained(..., device_map="auto")
或:
model.cpu()
nvidia-smi
free -h
htop
ulimit -v 20000000
✅ 训练时:
empty_cache✅ 推理时:
torch.no_grad()model.eval()如果你愿意,可以告诉我:
我可以直接给你针对性的省内存方案。