我正在使用 theano 进行一些涉及大型(约 300,000 x 128)矩阵的计算。
theano函数在输出MemoryError
后退出,类似于this question .
我认为这可能是因为大矩阵是一步一步处理的,每一步都会在内存中留下一个大的GpuArray
(尽管形状与第一个相同)。
所以我的问题是:
对于具有相同形状和数据类型的临时(非输出)变量,theano 是否会努力重用此类分配的内存?比如,每个数组形状都有一个池?
如果为 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 会尝试重用内存吗? a1
和 a3
可能会“共享”
相同的地址,以减少内存占用,因为 a1
不是
op3
时使用时间更长?
谢谢!
最佳答案
您需要尽可能使用就地操作。在大多数情况下,这不受用户控制(在情况允许的情况下,优化器会自动使用它们),但您可以采取一些措施来鼓励它们的使用。
查看有关此问题的文档:
- memory profiler
- Information on the optimizations that enable in-place operation
- How to create custom operations that can work in-place
不要使用 inc_subtensor
操作的 inplace
参数,如 documentation 中所示。 。 docs also indicate用户规范不支持就地运算符(优化器将在可能的情况下自动应用它们)。
您可以使用 Theano 的 memory profiler帮助追踪哪些操作正在耗尽内存。
更新
我不是这方面的专家,但我相信 Theano 使用垃圾收集机制来释放不再需要的内存。 documentation. 对此进行了讨论。
关于python - Theano (GPU) 内存占用管理/调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33120123/