在 Linux 上跑 PyTorch 时,“省内存”主要从模型、数据、训练策略、系统层面几个方向入手。下面按实用程度给你总结一套可操作的方法。
torch.float16 / bfloat16model.half() # float16
# 或
model.to(torch.bfloat16)
训练/推理都可用(推理最明显)。
torch.nn.Linear 替代大矩阵torch.compile(PyTorch 2.x)model = torch.compile(model)
可减少中间变量,加速+省显存。
from torch.utils.checkpoint import checkpoint
out = checkpoint(model.layer, x)
或 HuggingFace:
model.gradient_checkpointing_enable()
✅ 用时间换显存,非常有效
accumulation_steps = 4
for i, (x, y) in enumerate(dataloader):
loss = model(x, y) / accumulation
loss.backward()
if (i+1) % accumulation_steps == 0:
optimizer.step()
optimizer.zero_grad()
✅ 等效大 batch,但省内存
optimizer.zero_grad(set_to_none=True)optimizer.zero_grad(set_to_none=True)
比默认更省内存。
del x, y, loss
torch.cuda.empty_cache()
⚠️ empty_cache() 不要频繁调用,训练循环外用。
with torch.no_grad():
out = model(x)
for p in model.encoder.parameters():
p.requires_grad = False
DataLoader 正确配置DataLoader(
dataset,
batch_size=8,
num_workers=4,
pin_memory=True,
prefetch_factor=2
)
num_workers 不要太多(吃 RAM)np.load("data.npy", mmap_mode="r")
torch.nn.DataParallel(简单但不推荐)torch.nn.parallel.DistributedDataParallel(推荐)nvidia-smi
free -h
htop
ulimit -v 20000000
swap(临时救急)sudo fallocate -l 16G /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
✅ 推理
float16 + torch.compile + 小 batch
✅ 训练
gradient checkpointing + 梯度累积 + zero_grad(set_to_none=True)
✅ 大模型
DeepSpeed / FSDP + CPU offload
如果你愿意,可以告诉我:
我可以直接给你可抄的配置。