按照jcjohnson提出的想法,为了在受限制的内存环境中以神经方式生成大图像,我试图在updateOutput和updateGradInput中将图层激活从gpu反复移动到cpu。 e.g。
if (torch.type(previousModule) == 'cudnn.ReLU' or torch.type(previousModule) == 'cudnn.SpatialConvolution') then
previousModule.output = previousModule.output:cuda()
collectgarbage('collect')
end
....
if (torch.type(currentModule) == 'cudnn.ReLU' or torch.type(currentModule) == 'cudnn.SpatialConvolution') then
currentModule.output = currentModule.output:float()
collectgarbage('collect')
end
从功能上讲,它适用于较小的图像,生成的图像虽然很慢。然而,即使在将输出张量转换为来自cuda的float之后,它仍然不会释放gpu中的内存,尽管显式调用了collectgarbage()例程并且我无法生成比最初受gpu内存约束的图像更大的图像。
我在这里出错的任何想法?
答案 0 :(得分:0)
我不确定它应该以这种方式工作。预计网络在运行时不会受到影响。
cudnn
具有this函数,表示它执行转换,当模块从gpu移出时,对内存发生的情况没有明确的答案。 (CPU运行功能可能对GPU存储的数据起作用似乎很奇怪)
标准cunn
模块根本没有网络的后向转换。
您的代码执行以下操作:
if currentModule is cuda, then convert its output to float.
previousModule = currentModule
if previousModule is cuda then convert its output to cuda
最后,如果您的gpu代码很慢并且您经常来回移动数据,您确定使用cpu会更容易。