在 Ubuntu + PyTorch 场景下,显存(GPU memory)不足是非常常见的问题。下面按由易到难、由训练到推理的方式,系统总结节省显存的方法,并给出可直接用的示例。
最直接:
train_loader = DataLoader(dataset, batch_size=8) # 从 32 → 8
torch.cuda.empty_cache()释放未被引用的缓存显存(不是魔法,但有用):
import torch
torch.cuda.empty_cache()
确保不需要反向传播的地方加:
with torch.no_grad():
output = model(input)
可节省 30%~50% 显存,还能加速:
from torch.cuda.amp import autocast, GradScaler
scaler = GradScaler()
for x, y in loader:
optimizer.zero_grad()
with autocast():
loss = model(x, y)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()
torch.utils.checkpoint(梯度检查点)用时间换显存,适合 Transformer / 大模型:
from torch.utils.checkpoint import checkpoint
def forward(x):
return checkpoint(model.layer, x)
或:
model.layers = torch.nn.Sequential(*[
checkpoint(layer) for layer in model.layers
])
bert-base → bert-smalldistilbert, tinyllama, mobilenetmodel = torch.nn.DataParallel(model)
# 或
model = model.to('cuda:0')
model.eval()
with torch.no_grad():
out = model(x)
torch.inference_mode()(比 no_grad 更省)with torch.inference_mode():
out = model(x)
model.half() # FP16
# 或
model = torch.quantization.quantize_dynamic(
model, {nn.Linear}, dtype=torch.qint8
)
nvidia-smi
或实时监控:
watch -n 1 nvidia-smi
nvidia-smi | grep python
kill -9 <PID>
export CUDA_VISIBLE_DEVICES=0
| 方法 | 说明 |
|---|---|
| ZeRO (DeepSpeed) | 分布式显存优化 |
| FSDP | PyTorch 原生 |
| CPU offload | 把参数放 CPU |
| LoRA / PEFT | 只训练少量参数 |
示例(FSDP):
from torch.distributed.fsdp import FSDP
model = FSDP(model)
训练:
empty_cache推理:
inference_mode如果你愿意,可以告诉我:
我可以给你针对性的显存优化方案。