nvidia-smi如果看到:
import torch
print(torch.cuda.memory_allocated())
print(torch.cuda.memory_reserved())PyTorch 不会立刻把显存还给 GPU,而是缓存起来复用。
torch.cuda.empty_cache()⚠️ 注意:
outputs = model(x)如果 outputs 还活着,显存不会释放。
with torch.no_grad():
outputs = model(x)
del outputs
torch.cuda.empty_cache()model.eval() + no_grad() 没开(推理必做)model.eval()
with torch.no_grad():
result = model(input)GeneFace++ 常见显存大户:
| 模块 | 显存来源 |
|---|---|
| NeRF / 3D rendering | 高分辨率 tensor |
| audio encoder | 长序列 |
| motion decoder | 中间特征 |
| data loader | pin_memory |
# 降低 batch size
batch_size = 1
# 降低图像分辨率
img_size = 256 # 或 128
# 减少 audio window
audio_len = 40 # 原来是 80+for epoch in epochs:
for data in dataloader:
loss = model(data)
loss.backward()
optimizer.step()
optimizer.zero_grad()
# 显存释放
del loss
torch.cuda.empty_cache()with torch.cuda.amp.autocast() 时with torch.cuda.amp.autocast():
output = model(x)@torch.no_grad()
def infer(model, x):
model.eval()
x = x.cuda()
y = model(x)
del x, y
torch.cuda.empty_cache()DataLoader(..., pin_memory=True)DataLoader(..., pin_memory=False)import gc
gc.collect()
torch.cuda.empty_cache()kill -9 PIDpython inference.py \
--img_size 256 \
--batch_size 1 \
--audio_len 30--batch_size 1
--accum_grad 4✅ 有没有 del 无用变量
✅ 有没有 empty_cache()
✅ model.eval() + no_grad()
✅ batch size 是否过大
✅ DataLoader 是否 pin_memory
你可以直接贴:
nvidia-smi 截图