使用 dask 进行大矩阵运算时内存耗尽

memory exhaust on big matrix operation using dask

目前我正在为我的本科论文 python 实现这个 paper,但我只使用马哈拉诺比斯度量学习(如果你好奇的话)。

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

所以我开始研究这个 dask.array.dot(A.T,A) 并且完成了。但是我需要对该矩阵进行白化转换,并且很快我可以通过获取 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 ram 的裸机服务器。就算我这样做了,够了吗?

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

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

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