首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用OpenBLAS集成编译numpy

使用OpenBLAS集成编译numpy
EN

Stack Overflow用户
提问于 2012-07-12 07:59:47
回答 3查看 42.9K关注 0票数 53

我正在尝试安装带有OpenBLASnumpy,但是我不知道site.cfg文件需要如何编写。

当遵循installation procedure时,安装完成时没有错误,但是从1(由环境变量OMP_NUM_THREADS控制)增加OpenBLAS使用的线程数会降低性能。

我不确定OpenBLAS集成是否完美。有没有人能提供一个site.cfg文件来实现同样的目的。

附注:在其他工具包中集成OpenBLAS,如基于Python的Theano,在增加同一台机器上的线程数量方面提供了实质性的性能提升。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-18 10:50:38

我刚刚在virtualenv中使用OpenBLAS集成编译了numpy,看起来运行得很好。

这是我的过程:

  1. 编译OpenBLAS

$ git克隆https://github.com/xianyi/OpenBLAS $ cd OpenBLAS && make FC=gfortran $ sudo make PREFIX=/opt/OpenBLAS install

如果您没有管理员权限,则可以将PREFIX=设置为您具有写入权限的目录(只需修改下面的相应步骤,确保包含libopenblas.so的目录位于您的共享库搜索路径中。

代码语言:javascript
复制
- To do this locally, you could edit your `~/.bashrc` file to contain the line

导出LD_LIBRARY_PATH=/opt/OpenBLAS/lib:$LD_LIBRARY_PATH

当您启动一个新的终端会话时,LD_LIBRARY_PATH环境变量将被更新(使用$ source ~/.bashrc在同一会话中强制更新)。

-另一个适用于多个用户的选择是在/etc/ld.so.conf.d/中创建一个包含行/opt/OpenBLAS/lib.conf文件,例如:

$ sudo sh -c "echo '/opt/OpenBLAS/lib‘> /etc/ld.so.conf.d/openblas.conf“

完成任一选项后,请运行

$ sudo ldconfig

  1. 抓取numpy源代码:

$ git克隆https://github.com/numpy/numpy $ cd numpy

  • site.cfg.example复制到site.cfg并编辑副本:

$ cp site.cfg.example site.cfg $ nano site.cfg

取消对以下行的注释:

……openblas库= openblas library_dirs = /opt/OpenBLAS/lib include_dirs = /opt/OpenBLAS/include ...

  • 检查配置、构建、安装(可选在virtualenv中)

$ python setup.py配置

输出应如下所示:

..。openblas_info:找到: libraries = 'openblas','openblas‘library_dirs = '/opt/OpenBLAS/lib’language =c define_macros = ('HAVE_CBLAS',None) FOUND: libraries = 'openblas','openblas‘library_dirs = '/opt/OpenBLAS/lib’language =c define_macros = ('HAVE_CBLAS',None) ...

使用pip安装比使用python setup.py install更容易,因为pip将跟踪包元数据,并允许您在将来轻松卸载或升级numpy。

$ pip安装。

  • 可选:您可以使用this script测试不同线程数的性能。

$ OMP_NUM_THREADS=1 python build/test_numpy.py版本: 1.10.0.dev0+8e026a2 maxint: 9223372036854775807 BLAS信息:*库'openblas','openblas‘* library_dirs '/opt/OpenBLAS/lib’* define_macros ('HAVE_CBLAS',None) *语言c点: 0.099796795845秒$ OMP_NUM_THREADS=8 python build/test_numpy.py版本: 1.10.0.dev0+8e026a2 maxint: 9223372036854775807 BLAS信息:*库'openblas','openblas‘* library_dirs '/opt/OpenBLAS/lib’* define_macros ('HAVE_CBLAS',None) *语言c点: 0.0439578056335秒

对于更高的线程数量,性能似乎有了明显的提高。但是,我还没有系统地测试过这一点,对于较小的矩阵,额外的开销可能会超过更高的线程数量带来的性能好处。

票数 99
EN

Stack Overflow用户

发布于 2016-07-05 01:34:26

如果您正在使用ubuntu或mint,您可以通过apt-get安装numpy和openblas来轻松地获得openblas链接numpy。

代码语言:javascript
复制
sudo apt-get install numpy libopenblas-dev

在一个新的docker ubuntu上,我测试了从博客帖子"Installing Numpy and OpenBLAS"复制的以下脚本

代码语言:javascript
复制
import numpy as np
import numpy.random as npr
import time

# --- Test 1
N = 1
n = 1000

A = npr.randn(n,n)
B = npr.randn(n,n)

t = time.time()
for i in range(N):
    C = np.dot(A, B)
td = time.time() - t
print("dotted two (%d,%d) matrices in %0.1f ms" % (n, n, 1e3*td/N))

# --- Test 2
N = 100
n = 4000

A = npr.randn(n)
B = npr.randn(n)

t = time.time()
for i in range(N):
    C = np.dot(A, B)
td = time.time() - t
print("dotted two (%d) vectors in %0.2f us" % (n, 1e6*td/N))

# --- Test 3
m,n = (2000,1000)

A = npr.randn(m,n)

t = time.time()
[U,s,V] = np.linalg.svd(A, full_matrices=False)
td = time.time() - t
print("SVD of (%d,%d) matrix in %0.3f s" % (m, n, td))

# --- Test 4
n = 1500
A = npr.randn(n,n)

t = time.time()
w, v = np.linalg.eig(A)
td = time.time() - t
print("Eigendecomp of (%d,%d) matrix in %0.3f s" % (n, n, td))

如果不使用openblas,结果是:

代码语言:javascript
复制
dotted two (1000,1000) matrices in 563.8 ms
dotted two (4000) vectors in 5.16 us
SVD of (2000,1000) matrix in 6.084 s
Eigendecomp of (1500,1500) matrix in 14.605 s

在我使用apt install openblas-dev安装openblas之后,我用以下命令检查numpy链接

代码语言:javascript
复制
import numpy as np
np.__config__.show()

其中的信息是

代码语言:javascript
复制
atlas_threads_info:
  NOT AVAILABLE
openblas_info:
  NOT AVAILABLE
atlas_blas_info:
  NOT AVAILABLE
atlas_3_10_threads_info:
  NOT AVAILABLE
blas_info:
    library_dirs = ['/usr/lib']
    libraries = ['blas', 'blas']
    language = c
    define_macros = [('HAVE_CBLAS', None)]
mkl_info:
  NOT AVAILABLE
atlas_3_10_blas_threads_info:
  NOT AVAILABLE
atlas_3_10_blas_info:
  NOT AVAILABLE
openblas_lapack_info:
  NOT AVAILABLE
lapack_opt_info:
    library_dirs = ['/usr/lib']
    libraries = ['lapack', 'lapack', 'blas', 'blas']
    language = c
    define_macros = [('NO_ATLAS_INFO', 1), ('HAVE_CBLAS', None)]
blas_opt_info:
    library_dirs = ['/usr/lib']
    libraries = ['blas', 'blas']
    language = c
    define_macros = [('NO_ATLAS_INFO', 1), ('HAVE_CBLAS', None)]
atlas_info:
  NOT AVAILABLE
blas_mkl_info:
  NOT AVAILABLE
lapack_mkl_info:
  NOT AVAILABLE
atlas_3_10_info:
  NOT AVAILABLE
lapack_info:
    library_dirs = ['/usr/lib']
    libraries = ['lapack', 'lapack']
    language = f77
atlas_blas_threads_info:
  NOT AVAILABLE

它没有显示到openblas的链接。然而,脚本的新结果显示numpy肯定使用了openblas:

代码语言:javascript
复制
dotted two (1000,1000) matrices in 15.2 ms
dotted two (4000) vectors in 2.64 us
SVD of (2000,1000) matrix in 0.469 s
Eigendecomp of (1500,1500) matrix in 2.794 s
票数 8
EN

Stack Overflow用户

发布于 2018-12-07 10:24:20

这里有一个比@ali的答案更简单的方法,它在macOS上有效。

  1. 如果您没有gfortran编译器,请安装它。例如,在macOS上使用自制软件:

$ brew安装gcc

  1. 从源编译OpenBLAS或使用包管理器,获取源代码库或downloading a release

$ git克隆https://github.com/xianyi/OpenBLAS $ cd OpenBLAS && make FC=gfortran $ sudo make PREFIX=/opt/OpenBLAS install

如果您不能/不能sudo,请将PREFIX=设置为另一个目录,并在下一步中修改路径。

OpenBLAS不需要在编译器包含路径或链接器库路径上。

  1. 创建包含您在步骤2中使用的前缀路径的~/.numpy-site.cfg文件:

openblas库= openblas library_dirs = /opt/OpenBLAS/lib runtime_library_dirs = /opt/OpenBLAS/lib include_dirs = /opt/OpenBLAS/include

include_dirs是用于编译器的。library_dirs用于链接器。runtime_library_dirs用于加载器,可能不需要。

  1. pip-从源安装numpy和scipy (最好是安装到一个virtualenv中),无需手动下载它们,您还可以指定发布版本:

pip install numpy scipy --no-binary numpy,scipy

  1. 在我的经验中,这个OPENBLAS_NUM_THREADS设置在运行时使OpenBLAS更快,而不是更慢,特别是。当多个CPU进程同时使用它时:

导出OPENBLAS_NUM_THREADS=1

(或者,您可以使用make FC=gfortran USE_THREAD=0.)编译OpenBLAS

有关测试方法,请参阅其他答案。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11443302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档