Torch:将张量从 GPU 移动到 CPU 后无法释放 GPU 内存

在 jcjohnson 的建议下,为了在内存受限的环境下生成神经风格中的大图像,我正在尝试在 updateOutput 和 updateGradInput 中将层激活在 GPU 和 CPU 之间来回移动,例如

 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 内存最初限制的更大的图像。

在这里,我错了吗?

点赞
用户4687565
用户4687565

我不确定它应该以这种方式工作。网络应该在运行时保持不变。

cudnn这个 函数,说明它执行了转换,但没有明确说明当模块从 GPU 移动时内存会发生什么。(似乎奇怪的是, CPU 运行函数可以在存储在 GPU 上的数据上工作)

标准的 cunn 模块根本没有网络的向后转换。

您的代码执行以下操作:

如果 currentModule 是 cuda,则将其输出转换为 float。
previousModule = currentModule
如果 previousModule 是 cuda,则将其输出转换为 cuda

最后,如果您的 GPU 代码速度较慢,且不断地将数据来回传输,您确定使用 CPU 不会更容易吗?

2018-03-28 18:35:25