Numpy SVD似乎在Mac OSX上并行化,但在我的Ubuntu虚拟机上却没有

时间:2014-08-17 03:17:59

标签: python numpy virtual-machine linear-algebra blas

我想运行以下脚本:

#python imports
import time

#3rd party imports
import numpy as np
import pandas as pd

def pd_svd(pd_dataframe):
    np_dataframe = pd_dataframe.values
    return np.linalg.svd(pd_dataframe)

if __name__ == '__main__':
    li_times = []
    for i in range(1, 3):
        start = time.time()
        pd_dataframe = pd.DataFrame(np.random.random((3000, 252 * i)))
        pd_svd(pd_dataframe)
        li_times.append(str(time.time() - start))
    print li_times

我在运行OSX 10.9.4的Macbook Air 2011和运行Ubuntu 12.0.4的16核云虚拟机上试用。出于某种原因,我的Macbook Air大约需要4秒钟,而我的VM大约需要15秒。我使用top检查了进程,看来在我的Ubuntu VM上,它没有使用并行性,而在我的Macbook Air上,它是。

以下是我工商管理硕士学位的结果:

enter image description here

在我的ubuntu VM上:

enter image description here

为什么我的Macbook Air对于SVD来说要快得多?特别是,在进行numpy比较时,云VM的速度要快得多,并且似乎使用了并行性(没有top,但它的速度要快几倍。)

编辑:

以下是云VM上np.show_config()的输出:

blas_info:
    libraries = ['blas']
    library_dirs = ['/usr/lib']
    language = f77
lapack_info:
    libraries = ['lapack']
    library_dirs = ['/usr/lib']
    language = f77
atlas_threads_info:
  NOT AVAILABLE
blas_opt_info:
    libraries = ['blas']
    library_dirs = ['/usr/lib']
    language = f77
    define_macros = [('NO_ATLAS_INFO', 1)]
atlas_blas_threads_info:
  NOT AVAILABLE
lapack_opt_info:
    libraries = ['lapack', 'blas']
    library_dirs = ['/usr/lib']
    language = f77
    define_macros = [('NO_ATLAS_INFO', 1)]
atlas_info:
  NOT AVAILABLE
lapack_mkl_info:
  NOT AVAILABLE
blas_mkl_info:
  NOT AVAILABLE
atlas_blas_info:
  NOT AVAILABLE
mkl_info:
  NOT AVAILABLE

1 个答案:

答案 0 :(得分:3)

我怀疑您的云虚拟机上的numpy版本仅链接到参考CBLAS库(* /usr/lib/libblas/libblas.so.3.0)。这是单线程的,比其他优化的BLAS实现(如OpenBLAS和ATLAS)慢得多。

您可以使用ldd确认在运行时通过numpy动态链接哪些库来确认:

~$ ldd /usr/lib/python2.7/dist-packages/numpy/core/_dotblas.so

你可能会看到这样的一行:

...
libblas.so.3 => /usr/lib/libblas.so.3 (0x00007f98445e3000)
...

/usr/lib/libblas.so.3是一个符号链接。如果您使用readlink关注链接链,您可能会看到以下内容:

~$ readlink -f /usr/lib/libblas.so.3
/usr/lib/libblas/libblas.so.3.0

这是一个缓慢的单线程CBLAS库。假设您具有root访问权限,最简单的解决方案可能是通过apt-get安装OpenBLAS:

~$ sudo apt-get install libopenblas-base libopenblas-dev

当我在我的服务器上安装此软件包时,它更新了/usr/lib/libblas.so.3处的符号链接以指向OpenBLAS库而不是CBLAS:

~$ readlink -f /usr/lib/libblas.so.3
/usr/lib/openblas-base/libblas.so.3

希望这足以让你使用更快的BLAS库。

如果出于某种原因,您无法使用apt-get解决此问题,我之前已经编写过一些有关从源which you can find here构建numpy和OpenBLAS的说明。我还编写了一些说明here,以便使用update-alternatives手动符号链接到不同的BLAS库。


*我在答案中引用的路径是运行Ubuntu 14.10的服务器的默认值,我使用apt-get安装了numpy。它们可能会有所不同,具体取决于您的Ubuntu版本以及您安装numpy的方式。