Python Theano(GPU)内存占用管理/调试

Python Theano(GPU)内存占用管理/调试,python,theano,Python,Theano,我用theano做了一些计算,涉及到一个大的(大约300000 x 128)矩阵 theano函数在输出内存错误后退出,类似于 我认为这可能是因为大矩阵被一步一步地处理,每一步都会在内存中留下一个大的GpuArray(尽管形状与第一步相同) 所以我的问题是: 对于具有相同形状和数据类型的临时(非输出)变量,theano是否会努力重用这些分配的内存?例如,是否存在每个阵列形状的池 如果为1,我可以检查函数图中的哪个节点重用内存吗 虽然我知道有一些方法可以实现显式共享,但我怀疑使用它会使(已经很难的

我用theano做了一些计算,涉及到一个大的(大约300000 x 128)矩阵

theano函数在输出
内存错误后退出,类似于

我认为这可能是因为大矩阵被一步一步地处理,每一步都会在内存中留下一个大的
GpuArray
(尽管形状与第一步相同)

所以我的问题是:

  • 对于具有相同形状和数据类型的临时(非输出)变量,theano是否会努力重用这些分配的内存?例如,是否存在每个阵列形状的池

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

  • 虽然我知道有一些方法可以实现显式共享,但我怀疑使用它会使(已经很难的)计算代码更难理解

    更新

    这种情况的一个简化示例:

    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是否会尝试重用内存,例如
    a1
    a3
    可能会“共享” 相同的地址,以减少内存占用,因为
    a1
    不是 在执行
    op3
    时使用时间更长


    谢谢

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

    请查看有关此问题的文档:

    请勿使用
    inc_子传感器
    操作的
    就地
    参数,如中所示。用户规范不支持就地运算符(优化器将在可能时自动应用它们)

    您可以使用Theano帮助跟踪哪些操作正在使用内存

    更新


    我不是这方面的专家,但我相信Theano使用垃圾收集机制来释放不再需要的内存。这将在

    中讨论,谢谢,您的回答非常好且详细,现在我知道了另一个选项(进行就地操作):)。我已经更新了我的问题,请你看一下好吗?再次感谢!theano中提到的GC似乎是内部调用,而不是单个theano函数调用。