我正在尝试使用numpy
安装OpenBLAS
,但我不知道如何编写site.cfg
文件。
当遵循installation procedure时安装完成且没有错误,但是将OpenBLAS使用的线程数从1增加(由环境变量OMP_NUM_THREADS控制)会导致性能下降。
我不确定OpenBLAS集成是否完美。任何人都可以提供site.cfg
文件来实现同样的目标。
P.S。:OpenBLAS集成在基于Python的Theano等其他工具包中,可以在同一台机器上提高线程数量,从而大幅提升性能。
答案 0 :(得分:88)
我刚刚在numpy
内部virtualenv
进行了OpenBLAS
整合,但似乎工作正常。
这是我的过程:
编译OpenBLAS
:
$ git clone https://github.com/xianyi/OpenBLAS
$ cd OpenBLAS && make FC=gfortran
$ sudo make PREFIX=/opt/OpenBLAS install
如果您没有管理员权限,可以将PREFIX=
设置为您具有写权限的目录(只需相应地修改以下相应步骤)。
确保包含libopenblas.so
的目录位于共享库搜索路径中。
要在本地执行此操作,您可以编辑~/.bashrc
文件以包含该行
export LD_LIBRARY_PATH=/opt/OpenBLAS/lib:$LD_LIBRARY_PATH
当您开始新的终端会话时,将更新LD_LIBRARY_PATH
环境变量(使用$ source ~/.bashrc
强制在同一会话中进行更新。)
适用于多个用户的另一个选项是在.conf
中创建包含第/etc/ld.so.conf.d/
行的/opt/OpenBLAS/lib
文件,例如:
$ sudo sh -c "echo '/opt/OpenBLAS/lib' > /etc/ld.so.conf.d/openblas.conf"
完成任一选项后,请运行
$ sudo ldconfig
抓取numpy
源代码:
$ git clone https://github.com/numpy/numpy
$ cd numpy
将site.cfg.example
复制到site.cfg
并修改副本:
$ cp site.cfg.example site.cfg
$ nano site.cfg
取消注释这些行:
....
[openblas]
libraries = openblas
library_dirs = /opt/OpenBLAS/lib
include_dirs = /opt/OpenBLAS/include
....
检查配置,构建,安装(可选择在virtualenv
内)
$ python setup.py config
输出应该如下所示:
...
openblas_info:
FOUND:
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
preferable进行安装python setup.py install
使用pip
,因为$ pip install .
将跟踪包元数据,并允许您以后轻松卸载或升级numpy。
$ OMP_NUM_THREADS=1 python build/test_numpy.py
version: 1.10.0.dev0+8e026a2
maxint: 9223372036854775807
BLAS info:
* libraries ['openblas', 'openblas']
* library_dirs ['/opt/OpenBLAS/lib']
* define_macros [('HAVE_CBLAS', None)]
* language c
dot: 0.099796795845 sec
$ OMP_NUM_THREADS=8 python build/test_numpy.py
version: 1.10.0.dev0+8e026a2
maxint: 9223372036854775807
BLAS info:
* libraries ['openblas', 'openblas']
* library_dirs ['/opt/OpenBLAS/lib']
* define_macros [('HAVE_CBLAS', None)]
* language c
dot: 0.0439578056335 sec
可选:您可以使用this script来测试不同线程数的性能。
{{1}}
高线程数的性能似乎有明显改善。但是,我没有对此进行过系统的测试,对于较小的矩阵,额外的开销可能会超过更高线程数的性能优势。
答案 1 :(得分:6)
万一你使用的是ubuntu或mint,你可以通过apt-get安装numpy和openblas轻松地将openblas链接到numpy
sudo apt-get install numpy libopenblas-dev
在一个新鲜的docker ubuntu上,我测试了从博客文章"Installing Numpy and OpenBLAS"复制的以下脚本
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,结果是:
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后,我用
import numpy as np
np.__config__.show()
,信息是
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:
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
答案 2 :(得分:0)
这里的方法比@ali_m的答案更简单,并且可以在macOS上使用。
如果没有,请安装gfortran编译器。例如。在macOS上使用自制软件:
$ brew install gcc
从源代码编译OpenBLAS
[安装发行版也应该可以,除非您需要未发布的错误修复]:
$ git clone https://github.com/xianyi/OpenBLAS
$ cd OpenBLAS && make FC=gfortran
$ sudo make PREFIX=/opt/OpenBLAS install
如果不执行sudo操作,请将PREFIX=
设置到另一个目录,然后在下一步中修改路径。
OpenBLAS不需要在编译器的include路径或链接程序库路径上。
将https://github.com/numpy/numpy/blob/master/site.cfg.example下载到~/.numpy-site.cfg
,取消注释这些行,然后对其进行编辑以提供您在步骤2中使用的PREFIX路径:
[openblas]
libraries = openblas
library_dirs = /opt/OpenBLAS/lib
include_dirs = /opt/OpenBLAS/include
从源代码中安装numpy和scipy(最好将其安装到virtualenv中),而无需手动下载它们(您也可以指定发行版本):
pip install numpy scipy --no-binary numpy,scipy
有关其他测试方法,请参见其他答案。