【问题标题】:Why numpy/scipy is faster without OpenBLAS?为什么没有 OpenBLAS numpy/scipy 会更快?
【发布时间】:2015-06-19 10:08:12
【问题描述】:

我做了两个安装:

  1. brew install numpy(和 scipy)--with-openblas
  2. 克隆 GIT 存储库(用于 numpy 和 scipy)并自己构建

在我克隆了两个方便的脚本以在多线程环境中验证这些库之后:

git clone https://gist.github.com/3842524.git

然后对于我正在执行的每个安装show_config

python -c "import scipy as np; np.show_config()"

安装1一切都很好:

lapack_opt_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/local/opt/openblas/lib']
    language = f77
blas_opt_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/local/opt/openblas/lib']
    language = f77
openblas_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/local/opt/openblas/lib']
    language = f77
blas_mkl_info:
    NOT AVAILABLE

但是安装2的事情就不那么亮了:

lapack_opt_info:
    extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
    extra_compile_args = ['-msse3']
    define_macros = [('NO_ATLAS_INFO', 3)]
blas_opt_info:
    extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
    extra_compile_args = ['-msse3', '- I/System/Library/Frameworks/vecLib.framework/Headers']
define_macros = [('NO_ATLAS_INFO', 3)]

看来,当我未能正确链接 OpenBLAS 时。但是现在还好,这里是性能结果。所有测试均在 iMac、Yosemite、i7-4790K、4 核、超线程上进行。

首次安装 OpenBLAS:

numpy:

OMP_NUM_THREADS=1 python test_numpy.py
FAST BLAS
version: 1.9.2
maxint: 9223372036854775807
dot: 0.126578998566 sec

OMP_NUM_THREADS=2 python test_numpy.py
FAST BLAS
version: 1.9.2
maxint: 9223372036854775807
dot: 0.0640147686005 sec

OMP_NUM_THREADS=4 python test_numpy.py
FAST BLAS
version: 1.9.2
maxint: 9223372036854775807
dot: 0.0360922336578 sec

OMP_NUM_THREADS=8 python test_numpy.py
FAST BLAS
version: 1.9.2
maxint: 9223372036854775807
dot: 0.0364527702332 sec

scipy:

OMP_NUM_THREADS=1 python test_scipy.py
cholesky: 0.0276656150818 sec
svd: 0.732437372208 sec

OMP_NUM_THREADS=2 python test_scipy.py
cholesky: 0.0182101726532 sec
svd: 0.441690778732 sec

OMP_NUM_THREADS=4 python test_scipy.py
cholesky: 0.0130400180817 sec
svd: 0.316107988358 sec

OMP_NUM_THREADS=8 python test_scipy.py
cholesky: 0.012854385376 sec
svd: 0.315939807892 sec

不使用 OpenBLAS 的第二次安装:

numpy:

OMP_NUM_THREADS=1 python test_numpy.py
slow blas
version: 1.10.0.dev0+3c5409e
maxint: 9223372036854775807
dot: 0.0371072292328 sec

OMP_NUM_THREADS=2 python test_numpy.py
slow blas
version: 1.10.0.dev0+3c5409e
maxint: 9223372036854775807
dot: 0.0215149879456 sec

OMP_NUM_THREADS=4 python test_numpy.py
slow blas
version: 1.10.0.dev0+3c5409e
maxint: 9223372036854775807
dot: 0.0146862030029 sec

OMP_NUM_THREADS=8 python test_numpy.py
slow blas
version: 1.10.0.dev0+3c5409e
maxint: 9223372036854775807
dot: 0.0141334056854 sec

scipy:

OMP_NUM_THREADS=1 python test_scipy.py
cholesky: 0.0109382152557 sec
svd: 0.32529540062 sec

OMP_NUM_THREADS=2 python test_scipy.py
cholesky: 0.00988121032715 sec
svd: 0.331357002258 sec

OMP_NUM_THREADS=4 python test_scipy.py
cholesky: 0.00916676521301 sec
svd: 0.318637990952 sec

OMP_NUM_THREADS=8 python test_scipy.py
cholesky: 0.00931282043457 sec
svd: 0.324427986145 sec

令我惊讶的是,第二种情况比第一种更快。在 scipy 的情况下,添加更多内核后性能没有提高,但即使是一个内核也比 OpenBLAS 中的 4 个内核更快。

有人知道这是为什么吗?

【问题讨论】:

  • 一方面,您似乎在比较不同版本的 numpy(1.9.1 带 OpenBLAS,1.10.0.dev0+3c5409e 不带)。
  • 另外,你不应该相信那些测试脚本的输出。他们检查 numpy.core._dotblas 的存在,以测试 numpy 是否与优化的 BLAS 库链接。此模块已在 numpy > 1.10.0 的版本中删除,因此脚本将始终报告 slow blas,即使在您的第二种情况下,numpy 已针对 Accelerate 框架(另一个优化的 BLAS 实现)构建。为了解决这个问题,我写了a newer test script
  • ali_m 你应该发布你的 cmets 作为答案
  • 谢谢 ali_m,是的,看起来在第二种情况下,我只是将 numpy 与 Apple's Accelerate Framework 关联起来,它的性能恰好更好,至少在 Mac 上是这样。
  • @ali_m,请发表您的评论作为回复,我会确认

标签: python performance numpy scipy openblas


【解决方案1】:

有两个明显的差异可能导致这种差异:

  1. 您正在比较两个不同版本的 numpy。您使用 Homebrew 安装的 OpenBLAS 链接版本是 1.9.1,而您从源代码构建的版本是 1.10.0.dev0+3c5409e。

  2. 虽然较新的版本没有链接到 OpenBLAS,但它链接到 Apple 的 Accelerate Framework,这是一种不同的优化 BLAS 实现。


您的测试脚本仍然在第二种情况下报告slow blas 的原因是由于与最新版本的numpy 不兼容。您正在使用的脚本测试 numpy 是否通过 checking for the presence of numpy.core._dotblas 链接到优化的 BLAS 库:

try:
    import numpy.core._dotblas
    print 'FAST BLAS'
except ImportError:
    print 'slow blas'

在旧版本的 numpy 中,只有在找到优化的 BLAS 库的情况下,才会在安装过程中编译这个 C 模块。但是,_dotblas has been removed altogether in development versions > 1.10.0(如this previous SO question 中所述),因此脚本将始终为这些版本报告slow blas

我已经编写了一个更新版本的 numpy 测试脚本,它可以正确报告最新版本的 BLAS 链接; you can find it here.

【讨论】:

  • 那么,在 OS X 下使用 openblas 的 numpy(和 scipy)会更快吗?
  • @EduardoReis 我假设您在问 OpenBLAS 是否比 Accelerate Framework 更快?我没有 OSX,所以我自己无法运行任何基准测试。根据this guy 的说法,对于矩阵-矩阵产品,它们大致相同(这也可能取决于您要执行的计算类型)。
猜你喜欢
  • 2018-02-22
  • 2015-02-25
  • 1970-01-01
  • 2016-06-09
  • 2015-05-15
  • 2014-12-11
  • 1970-01-01
  • 1970-01-01
  • 2019-03-09
相关资源
最近更新 更多