【问题标题】:Theano (GPU) memory footprint management / debugTheano (GPU) 内存占用管理/调试
【发布时间】:2016-01-12 05:37:15
【问题描述】:

我正在使用 theano 进行一些涉及大型(约 300,000 x 128)矩阵的计算。

theano函数在输出MemoryError后退出,类似于this question

我认为这可能是因为大矩阵是一步一步处理的,每一步都会在内存中留下一个大的GpuArray(虽然形状和第一个相同)。

所以我的问题是:

  1. 对于具有相同形状和 dtype 的临时(非输出)变量,theano 是否会努力重用这些分配的内存?比如,每个数组形状都有一个池吗?

  2. 如果为 1,我可以检查函数图中的哪个节点重用内存吗?

虽然我知道shared 可以进行显式共享,但我怀疑使用它会使(已经很难)计算代码更难理解。

更新

这种情况的简化示例:

import theano
from theano import tensor as T

a0 = T.matrix()  # the initial 

# op1 op2 op3 are valid, complicated operations,
# whose output's shape are identical to a0's
a1 = op1(a0)
a2 = op2(a1)
a3 = op3(a2)

f = theano.function([a0], a3)

如果 op1、op2、op3 都不能就地优化, theano 会尝试重用内存,例如a1a3 可能会“分享” 相同的地址,以减少内存占用,因为a1 不是 op3的时候用的比较久吗?

谢谢!

【问题讨论】:

    标签: python theano


    【解决方案1】:

    您需要尽可能地使用就地操作。在大多数情况下,这不受用户控制(优化器会在情况允许时自动使用它们),但您可以采取一些措施来鼓励它们的使用。

    查看有关此问题的文档:

    不要使用inc_subtensor操作的inplace参数,如documentation所示。用户规范不支持就地运算符的docs also indicate(优化器会在可能的情况下自动应用它们)。

    您可以使用 Theano 的 memory profiler 来帮助追踪哪些操作正在耗尽内存。

    更新

    我不是这方面的专家,但我相信 Theano 使用垃圾收集机制来释放不再需要的内存。这在documentation. 中进行了讨论

    【讨论】:

    • 谢谢,您的回答非常好和详细,现在我知道了另一种选择(进行就地操作):)。我已经更新了我的问题,请你看一下吗?
    • 再次感谢! theano 中提到的 GC 似乎是 inter-call,而不是单个 theano 函数调用。
    猜你喜欢
    • 1970-01-01
    • 2018-11-15
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    相关资源
    最近更新 更多