Pytorch常见问题、PyTorch 0.4新版本升级指南no_grad、cuda(async=True)

https://blog.csdn.net/yutingzhaomeng/article/details/79084405
升级指南:https://blog.csdn.net/jacke121/article/details/80597759
cuda语义:cuda(async=True):https://blog.csdn.net/amds123/article/details/70144995

1、模型训练时提示 RuntimeError: tensors are on different GPUs
这个问题出现的原因在于训练数据data或者模型model其中有一个是*.cuda(),而另一个不是。全都改为data.cuda()和model.cuda()即可
解决办法:

data = data.cuda()
model = model.cuda()

2、模型训练时提示 TypeError: argument 0 is not a Variable
原因在于输入data不是Variable,需转化成Variable格式。
解决办法:

from torch.autograd import Variable
data = Variable(data).cuda()

3、训练过程没有问题,验证是提示CUDA Error:Out of Memory
提示是Memory的问题,第一反应是降低batch size大小,据说是有用的,但试着将batch size降为1,仍然不行。再考虑其他办法,发现在定义Variable时,没有限制不求梯度(比如输入的input和target并不需要求梯度),根据搜索,有两种方法:一是采用requires_grad=False,另一种是使用volatile=True,一般推荐使用第二种。但用的是Pytorch的0.4版本,volatile不再支持。
解决方法:用with torch.no_grad()替代volition。即如果源代码为

target_var = torch.autograd.Variable(target.cuda(async=True))

如果用0.4之前的版本可采用

target_var = torch.autograd.Variable(target.cuda(async=True),volatile=True)

如果0.4之后的版本,可采用

   with torch.no_grad()
       target_var = torch.autograd.Variable(target.cuda(async=True),volatile=True)

问题基本解决。如果还有问题,那可能出在代码中可能出现了反复叠加的操作,比如acc的叠加,或者loss 的叠加,将loss中的data提取出,并且记得用完之后del即可。

你可能感兴趣的:(pytorch)