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)
因为这个错误是依赖于操作系统的,我排除了关于矩阵 A 和 b 的任何问题(与提到的一些解决方案 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 系统上大型稀疏矩阵的令人惊讶的行为的主要内容,如果未能解决你的问题,请参考以下文章