一尘不染

Python-使用OpenBLAS集成编译numpy

python

我试图安装numpyOpenBLAS,但我在损失的如何site.cfg文件需要被写入。

当安装过程之后安装完成且没有错误,但没有关于增加从1(由环境变量OMP_NUM_THREADS控制)使用OpenBLAS线程数性能下降。

我不确定OpenBLAS集成是否完善。任何人都可以提供site.cfg文件来实现相同目的。

PS:OpenBLAS与基于PythonTheano等其他工具包的集成,可在同一台计算机上显着提高线程数量,从而显着提高性能。


阅读 1704

收藏
2020-02-21

共1个答案

一尘不染

我只是numpyvirtualenv带有OpenBLAS集成的a内编译,看来工作正常。

这是我的过程:

编译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.examplesite.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是最好用python setup.py install的,因为pip将跟踪包的元数据,让你轻松卸载或将来升级numpy的。

$ pip install .
  1. 可选:你可以使用此脚本来测试不同线程数的性能。
$ 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

对于更高的线程数,性能似乎有了明显的提高。但是,我尚未对此进行非常系统的测试,对于较小的矩阵,额外的开销可能会超过线程数增加带来的性能好处。

2020-02-21