scipy.sparse.linalg.spsolve Linux 系统上大型稀疏矩阵的令人惊讶的行为

Posted

技术标签:

【中文标题】scipy.sparse.linalg.spsolve Linux 系统上大型稀疏矩阵的令人惊讶的行为【英文标题】:scipy.sparse.linalg.spsolve surprising behaviour for large sparse matrices on Linux systems 【发布时间】:2016-03-31 21:22:01 【问题描述】:

我正在计算一个线性系统 Ax=b 的解,其中 A 是一个大(相关的密集矩阵通常有 200,000 行和列)稀疏矩阵,b 是一个大约 100 列的稀疏矩阵。

当我在 Windows 系统(Python 2.7、scipy 0.14.0)上运行我的代码时,以下命令

from scipy.sparse.linalg import spsolve
...
Temp = spsolve(A.tocsc(),b.tocsc())

运行平稳,需要大约 7 GB 的 RAM 内存。

在 Linux 系统(相同的 CPU,相同数量的 RAM 内存:64 GB,Linux Mint 17.3, python 2.7, scipy 0.13.3) 需要超过 20 GB 的 ram 内存,它会崩溃并显示以下错误消息:

<function umfpack_di_numeric at ...> failed with UMFPACK_ERROR_out_of_memory(见1)

因为这个错误是依赖于操作系统的,我排除了关于矩阵 Ab 的任何问题(与提到的一些解决方案 in this post 相反),我我正在尝试找到特定于 Linux 的修复程序...但我不知道从哪里开始...有没有人知道发生了什么?为什么这样的问题会是 Linux 系统特有的?

请在下面找到完整的错误消息:

Exception in Tkinter callback Traceback (most recent call last): File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1489, in __call__ return self.func(*args) File "...", line 1533, in mmvConstruction ... File "...", line 1555, in modes_cb Temp = spsolve(k[inter][:,inter].tocsc(),k[inter][:,exter].tocsc()) File "/usr/lib/python2.7/dist-packages/scipy/sparse/linalg/dsolve/linsolve.py", line 151, in spsolve Afactsolve = factorized(A) File "/usr/lib/python2.7/dist-packages/scipy/sparse/linalg/dsolve/linsolve.py", line 352, in factorized umf.numeric(A) File "/usr/lib/python2.7/dist-packages/scipy/sparse/linalg/dsolve/umfpack/umfpack.py", line 450, in numeric umfStatus[status])) RuntimeError:<function umfpack_di_numeric at ...> failed with UMFPACK_ERROR_out_of_memory

更新:仍在尝试寻找解决方案... Linux Mint 上的最新版本的 BLAS 似乎很旧:1.8.2。在 Windows 上,我使用 BLAS 1.9.1。使用此处提供的test_numpy.py 文件时:https://gist.github.com/osdf/3842524#file-test_numpy-py 我注意到 Linux 和 Windows 之间存在非常显着的差异:Linux:版本 1.8.2,maxint 9223372036854775807,点:0.76 s - Windows:版本 1.9.1,maxint 2147483647,点:0,037 秒。我正在调查 Linux 上的 OPENBLAS 是否可以解决这个问题...

更新 2: 我意识到问题可能与硬件有关。事实上,在同一个 Linux Mint 发行版(Rosa 17.3)上具有完全相同的库的旧 PC 提供了更令人满意的结果。第一次更新中提到的基准在这台旧 PC 上给出:Linux:版本 1.8.2,maxint 9223372036854775807,点:0,054 秒。

【问题讨论】:

在 Linux 系统上安装 numpy/scipy 时,您针对什么 BLAS 进行了编译?我怀疑这是问题所在...... 屏幕截图难以辨认且无法搜索。请将屏幕输出复制/粘贴到 Q 并使用编辑框左上角的 工具以保持正确的格式。祝你好运。 @我会在我的 Linux Mint 系统上使用以下 BLAS 库吗:apt-get install liblapack-dev。关于 scipy,我只安装了 apt-get install python-scipy 没有任何进一步的重新编译。 因为你已经包含了相关的错误信息,好节目。但请不要养成发布屏幕截图的习惯。它们使专业人士难以搜索他们期望的短语,并且难以复制/粘贴代码以在其本地环境中进行测试,而且阅读起来很麻烦。谢谢,祝你好运。 在 scipy 0.13 之后对稀疏矩阵的内部进行了重新设计——这可能(或可能不会)在最近的 scipy 版本中变得更好。 【参考方案1】:

好吧,经过彻底调查,我现在确信我遇到的问题与 Linux Mint (Rosa 17.3) 可能未针对最新处理器进行优化有关。

我在帖子更新中提到的比较强调了软件安装是正确的。然后我在我的 PC 上安装了 Fedora 23,依次安装:

libblas 蟒蛇 python-scipy

然后我用完全相同的矩阵运行完全相同的代码,没有任何问题:RAM 消耗被限制在大约 7 GB,类似于在 Windows 系统上观察到的情况。

【讨论】:

以上是关于scipy.sparse.linalg.spsolve Linux 系统上大型稀疏矩阵的令人惊讶的行为的主要内容,如果未能解决你的问题,请参考以下文章