为什么在将Ubuntu从12.04升级到14.04后,Python的Numpy矩阵乘法变得如此缓慢?
我之前用的是Ubuntu 12.04,最近我重新安装了Ubuntu 14.04。我现在做的工作涉及到大矩阵的乘法(大约2000 X 2000),我用的是numpy库。问题是,现在计算的时间比之前慢了10到15倍。
从Ubuntu 12.04升级到14.04,意味着我从Python 2.7.3升级到了2.7.6,numpy也从1.6.1升级到了1.8.1。不过,我觉得问题可能出在numpy所链接的线性代数库上。我发现我只能找到libblas.so.3和liblapack.so.3,而不是libblas.so.3gf和liblapack.so.3gf。
我还安装了libopenblas和libatlas:
$ sudo apt-get install libopenblas-base libatlas3-base
并尝试过这些库,但速度依然没有改善。所以,我有几个问题:
- 带有“gf”的包和没有“gf”的包有什么区别?
- 这可能是导致矩阵乘法变慢的原因吗?
- 如果是的话,我该如何回到libblas.so.3gf和liblapack.so.3gf?在Ubuntu 14.04中似乎已经不再提供这些了。
非常感谢!
2 个回答
你是在通过包管理器安装numpy吗?
如果是的话,我建议你用pip来安装,这样你可以清楚地看到在安装过程中哪些东西成功链接了。
- 先删除apt版本的numpy(运行
sudo apt-get purge python-numpy
) - 安装一些构建所需的头文件和静态库(运行
sudo apt-get install libblas-dev liblapack-dev gfortran
),可能还有其他的,但这些是我记得的。 - 然后运行
pip install numpy
来安装numpy。
wim说得对,问题可能是因为numpy链接到了一个比较慢的BLAS库(比如说参考的CBLAS库,而不是ATLAS)。
你可以通过在numpy的一个编译好的共享库上运行ldd
这个工具,来检查在运行时链接的是哪个BLAS库。
例如,如果你是通过apt-get
在标准位置安装的numpy:
~$ ldd /usr/lib/python2.7/dist-packages/numpy/core/_dotblas.so
...
libblas.so.3 => /usr/lib/libblas.so.3 (0x00007f01f0188000)
...
这个输出告诉我,numpy链接的是/usr/lib/libblas.so.3
。这通常是指向参考CBLAS库的一个符号链接,而这个库是比较慢的。
你可以像wim建议的那样,删除通过apt-get
安装的numpy,然后自己编译一个,可以使用pip
或者直接下载源代码。不过,我强烈不建议你使用sudo pip install ...
来全局安装Python模块。这是一个不好的习惯,因为这样可能会破坏你系统中Python环境的依赖关系。
更安全的做法是使用pip install --user ...
安装到你的~/.local/
目录,或者更好的是,安装到一个完全独立的virtualenv
中。
另一个选择是使用update-alternatives
来强制你的系统全局numpy链接到一个不同的BLAS库。我之前写过一个回答,里面有说明怎么做。