赞
踩
最近的程序总会在运行了几个epoch之后CUDA out of memory,除了常见的几种解决方法以外,还有一种是在train loss合并的时候,没有选择detach,或者item,导致反向梯度在合并的时候进行了累计。
import torch, gc
gc.collect()
torch.cuda.empty_cache()
但这种方法会让梯度下降的速度变慢,同时在训练的时候也会遇到显存的一些问题,不建议使用。
def test(model,dataloader):
model.eval()
with torch.no_grad()
for batch in tqdm(dataloader):
……
在创建dataloader的时候,如果使用的是他人的代码,可以检查一下dataloader的pin_memory是否为True,默认值为False。
如果batch_size = 1之后,仍然会遇到OOM的问题,则需要查看是否是loss的梯度一直在累积,在合并loss的时候需要使用detach或者item进行对标量的提取。
import os import torch from torch.autograd import Variable os.environ["CUDA_VISIBLE_DEVICES"]="4,5,6,7" cuda = True if torch.cuda.is_available() else False Tensor = torch.cuda.FloatTensor if cuda else torch.Tensor a = Variable(torch.tensor([1,2,3]).type(Tensor),requires_grad=True) b = Variable(torch.tensor([1,3,2]).type(Tensor),requires_grad=True) criterion = torch.nn.MSELoss() criterion.cuda() loss = criterion(a,b) print('loss = ', loss) print('loss.data = ', loss.data) print('loss.item() = ', loss.item()) print('loss.detach() = ', loss.detach()) print('loss.detach().item() = ', loss.detach().item())
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。