Python 培训期间GPU内存使用量的增加

Python 培训期间GPU内存使用量的增加,python,pytorch,gpu,Python,Pytorch,Gpu,我在通常的MNIST数据集上训练网络,遇到了下一个问题: 当我开始将valid\u metrics添加到loss\u列表和accurity\u列表时,所使用的GPU内存量开始每1或2个历元增加一次。 这是列车循环的代码: def系列型号(型号:torch.nn.Module、, 列车数据集:torch.utils.data.dataset, 有效的_数据集:torch.utils.data.dataset, 丢失函数:torch.nn.Module=torch.nn.CrossEntropyLo

我在通常的MNIST数据集上训练网络,遇到了下一个问题:
当我开始将
valid\u metrics
添加到loss\u列表和accurity\u列表时,所使用的GPU内存量开始每1或2个历元增加一次。 这是
列车循环的代码

def系列型号(型号:torch.nn.Module、, 列车数据集:torch.utils.data.dataset, 有效的_数据集:torch.utils.data.dataset, 丢失函数:torch.nn.Module=torch.nn.CrossEntropyLoss(), 优化器_类:类型[torch.optim.optimizer]=torch.optim, 优化器_参数:Dict={}, 初始值=0.01, lr_调度程序_类:Any=torch.optim.lr_调度程序.reducelRon, lr_调度程序_参数:Dict={}, 批次大小=64, 最大纪元=1000, 提前停止(耐心=20): optimizer=torch.optim.Adam(model.parameters(),lr=initial\u lr,**optimizer\u params) lr_调度程序=lr_调度程序_类(优化器,**lr_调度程序_参数) train\u loader=torch.utils.data.DataLoader(train\u数据集,shuffle=True,batch\u size=batch\u size) 有效的\u加载程序=torch.utils.data.DataLoader(有效的\u数据集,批大小=批大小) 最佳有效损失=无 最佳纪元=无 损失清单=清单() 准确度\列表=列表() 对于范围内的历元(最大历元): 打印(f'Epoch{Epoch}) 开始=计时器() 列车单历元(模型、优化器、损失函数、列车装载机) 有效度量=验证单个历元(模型、丢失函数、有效加载程序) loss_list.append(有效的_度量['loss']) 准确度列表。追加(有效的准确度度量['accurity']) 打印('time:',timer()-start) 打印(f'Validation metrics:\n{valid_metrics}') lr_调度程序.step(有效的_度量['loss']) 如果最佳有效损失为无或最佳有效损失>有效度量['loss']: 打印(f“迄今为止最好的型号,正在保存”) 最佳有效损失=有效指标['loss'] 最佳纪元 火炬保存(型号“./best_型号.pth”) 如果历元-最佳历元>提前停止耐心: 打印('提前停止已触发') 退货损失清单、准确度清单 以及
验证单历元的代码

def验证单历元(型号:torch.nn.Module、,
失去功能:torch.nn.Module,
数据加载器:torch.utils.data.DataLoader):
总损失=0
总精度=0
对于数据加载器中的数据:
十、 y=数据
十、 y=X.视图(-1784),y.到(设备)
X=X.to(设备)
输出=型号(X)
损耗=损耗函数(输出,y)
损失总额+=损失
y_pred=output.argmax(dim=1,keepdim=True).to(设备)
精度合计+=y预测等式(y.view\U as(y\U预测)).sum().item()
损耗平均值=损耗总量/长度(数据加载程序.dataset)
精度平均值=100.0*精度总计/长度(数据加载器数据集)
返回{'loss':loss_avg,'accurity':accurity_avg}

我使用
GeForce MX250
作为GPU

问题可能是因为梯度正在计算并存储在验证循环中。要解决这个问题,最简单的方法可能是将验证调用包装在
no\u grad
上下文中:

带火炬的
。无梯度()
有效度量=验证单个历元(模型、丢失函数、有效加载程序)
如果您愿意,还可以使用
@torch.no\u grad()
装饰
validate\u single\u epoch(…)

@torch.no_grad()
def验证单历元(…):
# ...

与您的问题无关,但请注意,在验证期间,您正在以培训模式使用模型,这可能不是您想要的。验证函数中可能缺少对
model.eval()
的调用。

如果我做的一切都正确,这会有帮助,非常感谢
python@torch.no_grad()def validate\u single\u(model:torch.nn.Module,loss_function:torch.nn.Module,data_loader:torch.utils.data.DataLoader):model.eval()…
请注意,离开验证时必须将其更改回训练模式。也就是说,使用
model.train()
valid\u metrics=validate\u single\u epoch(…)
行之后,或者在
train\u single\u epoch(…)
行之前,如果它不在那里。