我正在研究一个最近由管理员升级的科学集群,现在我的代码是超级的,而它曾经是体面的。我正在使用python 3.4
这种事情的工作方式如下:我必须猜测管理员可能已经改变了什么,然后让他做出适当的改变,因为如果我问他一个直接的问题,我们就不会做出任何结论。
所以,我用一个分析器运行我的代码,我发现有一些例程被多次调用,这些例程是:
我的猜测是,其中一些库在以前安装的python版本中进行了并行化,例如链接到mpi-parallelized或多线程数学内核库。
我想知道我的猜测是否正确,或者我是否需要考虑其他因素,因为我的代码本身并没有改变。
我在这里引用的例程是最相关的,因为它们占总时间的85%。特别是,如果总时间,数组占55%。我的代码效率降低了10倍。在与系统管理员交谈之前,我想确认这些例程确实有并行版本。
当然,我无法在群集的新旧配置上测试我的代码,因为旧的配置已经消失。但是我可以看到在这个集群上numpy.array
需要8分钟,而在另一个集群上我需要2秒。从top
我可以看到所使用的内存总是非常低(~0.1%),而单个CPU的使用率为100%。
In [3]: numpy.__config__.show()
lapack_info:
libraries = ['lapack']
library_dirs = ['/usr/lib64']
language = f77
atlas_threads_info:
libraries = ['satlas']
library_dirs = ['/usr/lib64/atlas']
define_macros = [('ATLAS_WITHOUT_LAPACK', None)]
language = c
include_dirs = ['/usr/include']
blas_opt_info:
libraries = ['satlas']
library_dirs = ['/usr/lib64/atlas']
define_macros = [('ATLAS_INFO', '"\\"3.10.1\\""')]
language = c
include_dirs = ['/usr/include']
atlas_blas_threads_info:
libraries = ['satlas']
library_dirs = ['/usr/lib64/atlas']
define_macros = [('ATLAS_INFO', '"\\"3.10.1\\""')]
language = c
include_dirs = ['/usr/include']
openblas_info:
NOT AVAILABLE
lapack_opt_info:
libraries = ['satlas', 'lapack']
library_dirs = ['/usr/lib64/atlas', '/usr/lib64']
define_macros = [('ATLAS_WITHOUT_LAPACK', None)]
language = f77
include_dirs = ['/usr/include']
lapack_mkl_info:
NOT AVAILABLE
blas_mkl_info:
NOT AVAILABLE
mkl_info:
NOT AVAILABLE
ldd /usr/lib64/python3.4/site-packages/numpy/core/_dotblas.cpython-34m.so
linux-vdso.so.1 => (0x00007fff46172000)
libsatlas.so.3 => /usr/lib64/atlas/libsatlas.so.3 (0x00007f0d941a0000)
libpython3.4m.so.1.0 => /lib64/libpython3.4m.so.1.0 (0x00007f0d93d08000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f0d93ae8000)
libc.so.6 => /lib64/libc.so.6 (0x00007f0d93728000)
libgfortran.so.3 => /lib64/libgfortran.so.3 (0x00007f0d93400000)
libm.so.6 => /lib64/libm.so.6 (0x00007f0d930f8000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f0d92ef0000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007f0d92ce8000)
/lib64/ld-linux-x86-64.so.2 (0x00007f0d950e0000)
libquadmath.so.0 => /lib64/libquadmath.so.0 (0x00007f0d92aa8000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f0d92890000)
Numpy已经链接到地图册,我看到了一个到libpthread.so的链接(所以我认为它已经被多处理,是吗?)。
另一方面,我将numpy的版本从1.8.2更新到1.9.2,现在array
方法只需要5秒而不是300秒。我想这可能是我的代码放慢速度的原因(也许是系统管理员降级了numpy版本?谁知道呢!)
答案 0 :(得分:1)
并行BLAS仅对有限数量的numpy / scipy函数有帮助(参见这些test scripts);
numpy.dot
scipy.linalg.cholesky
scipy.linalg.svd
如果可以运行
import numpy.core._dotblas
没有获得ImportError
,您就可以使用优化的numpy.dot
。
但
您可以发布您的代码以及如何使用它吗?或者是一个有问题的最小例子?您的代码如何在群集上运行?