【问题标题】:memory exhaust on big matrix operation using dask使用 dask 进行大矩阵运算的内存耗尽
【发布时间】:2016-06-20 04:46:58
【问题描述】:

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

简而言之,当我需要学习由整数组成的大小为 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 内存的裸机服务器。就算我这样做,也够了吗?

【问题讨论】:

  • 您需要完整的 SVD,还是只对 N 个最大奇异值/向量感兴趣?
  • 我需要 SVD,因为我还想进行美白转换,并使用 PCA 获得该结果。顺便说一句,@mrocklin 让我相信,在更大的规格上做事非常值得。还是谢谢
  • 您可以从 N 最大的奇异值和向量生成秩 N 的白化矩阵。根据 N 的大小,这可能比计算完整的 SVD 效率高出许多数量级。
  • 任何参考或教程如何获得?
  • 如果U, s, Vt = svd(X)U[:, :n] 的列和Vt[:n, :] 的行将包含正交向量。假设您在计算 SVD 之前减去了平均值,那么U[:, :n].dot(Vt[:n]) 将是X 的白化版本。那时您基本上已经完成了 PCA(请参阅我之前的回答 here)。 da.linalg.svd_compressed 使用 Halko 等人的巧妙随机算法来有效地计算部分 SVD。

标签: python numpy linear-algebra svd dask


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,您的回答保证我立即租用服务器
猜你喜欢
  • 1970-01-01
  • 2020-05-08
  • 2011-11-25
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 2021-02-10
  • 2015-08-01
  • 1970-01-01
相关资源
最近更新 更多