Torch:将张量移动到cpu

时间:2018-03-26 04:44:08

标签: lua garbage-collection torch

按照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内存约束的图像更大的图像。

我在这里出错的任何想法?

1 个答案:

答案 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会更容易。