Ubuntu下PyTorch内存管理优化策略
torch.cuda.amp模块实现自动混合精度(AMP)训练,将计算从float32转为float16,显存占用可减少约50%,同时保持模型精度(需GPU支持Tensor Cores,如NVIDIA Volta及以上架构)。del关键字删除不再使用的张量(如中间变量、全局列表中的张量),并调用torch.cuda.empty_cache()释放PyTorch缓存池中未使用的显存(注意:此操作会触发同步,建议在调试阶段使用)。for i, (data, label) in enumerate(dataloader):
output = model(data)
loss = criterion(output, label)
loss = loss / accumulation_steps # 损失归一化
loss.backward() # 累积梯度
if (i + 1) % accumulation_steps == 0:
optimizer.step()
optimizer.zero_grad()
这种方法可在不增加显存的情况下,提升有效批次大小。with torch.no_grad()上下文管理器,避免意外保存计算图(如model.eval()仅关闭dropout和BN层,不关闭计算图);对不需要反向传播的张量调用.detach()断开与计算图的关联。num_workers>0开启多进程数据加载时,确保数据预处理(如numpy切片)不保留对原始数据的引用(用.copy()或.tolist()断开联系);避免在Dataset类中缓存大量数据到内存。del删除不再使用的对象,配合gc.collect()手动触发垃圾回收(如循环中创建的大量临时变量)。sudo echo 3 | sudo tee /proc/sys/vm/drop_caches,释放页缓存、目录项和inode缓存(不影响正在运行的程序)。sudo dd if=/dev/zero of=/swapfile bs=64M count=16 # 创建16GB Swap文件
sudo mkswap /swapfile
sudo swapon /swapfile
# 永久生效:将`/swapfile none swap sw 0 0`添加到/etc/fstab
torch.nn.parallel.DistributedDataParallel(DDP)将模型分布到多个GPU或多台机器,分散显存负载(每个GPU仅需加载模型的一部分参数)。需注意:DDP的性能优于DataParallel(DP),因DP存在主GPU瓶颈。torch.utils.checkpoint在前向传播中丢弃中间激活,仅在反向传播时重新计算,减少显存占用(适用于超大型模型,如GPT-3)。例如:from torch.utils.checkpoint import checkpoint
def forward_with_checkpoint(segments, x):
return checkpoint(segments, x) # segments为模型分段函数
这种方法可将显存占用降低至原来的1/3~1/2,但会增加计算时间。torch.cuda.memory_summary()打印当前显存分配详情(如已用显存、预留显存、张量数量);使用nvidia-smi命令实时监控GPU显存占用(Ubuntu下可直接在终端运行)。torch.profiler启用内存分析模式,定位内存泄漏点(如某段代码持续分配显存但未释放):with torch.profiler.profile(
activities=[torch.profiler.ProfilerActivity.CUDA],
schedule=torch.profiler.schedule(wait=1, warmup=1, active=3),
on_trace_ready=lambda prof: prof.export_chrome_trace("trace.json"),
record_shapes=True,
profile_memory=True
) as prof:
# 训练代码
prof.export_chrome_trace("trace.json") # 导出分析报告
用Chrome打开trace.json,可查看每个操作的显存分配与释放情况。