0

目前我正在实施这篇论文,但我只使用马氏度量学习(如果你好奇的话)。

简而言之,当我需要学习一个由整数组成的大小为 67K*67K 的矩阵时,我遇到了一个问题,numpy.dot(A.T,A)其中 A 是一个大小为 (1,67K) 的随机向量。当我这样做时,它只是抛出 MemoryError,因为我的 PC 只有 8gb 内存,并且所需内存的原始计算是 16gb 来初始化。比我寻找替代品并发现dask

所以我继续处理这个问题dask.array.dot(A.T,A)并完成了。但是,我需要对该矩阵进行白化转换,并且在 dask 中,我可以通过获取SVD来实现它。但是每次我执行 SVD 时,ipython 内核都会死掉(我认为是因为内存不足)。

这就是我从 init 到内核死亡为止所做的事情:

fv_length=512*2*66
W = da.random.randint(10,20,(fv_length),(1000,1000))  
W = da.reshape(W,(1,fv_length))
W_T = W.T
Wt = da.dot(W_T,W); del W,W_T
Wt = da.reshape(Wt,(fv_length*fv_length/2,2))
U,S,Vt = da.linalg.svd(Wt); del Wt

我还没有得到 U、S 和 Vt。

即使我使用 dask,我的记忆力是否还不足以做这些事情?或者实际上这不是规范问题,而是我糟糕的内存管理?或者是其他东西?

在这一点上,我正在拼命尝试其他更大规格的 PC,所以我打算租用 32gb 内存的裸机服务器。就算我这样做,也够了吗?

4

1 回答 1

0

一般来说, dask.array 不保证所有计算的核外操作。方阵 - 矩阵乘法(或任何 L3 BLAS 操作)或多或少不可能在小内存中有效地完成。

可以要求 Dask 使用磁盘缓存来存储中间值。请参阅问题下的常见问题解答我的计算填充内存,我如何溢出到磁盘?. 然而,这将受到磁盘写入速度的限制,通常相当慢。

大内存机器和 NumPy 可能是解决此问题的最简单方法。或者,您可以尝试找到问题的不同表述。

于 2016-06-19T20:43:47.333 回答