使用OpenBLAS集成编译numpy

发布于 2021-01-29 18:00:35

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

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

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

PS:OpenBLAS与基于Python的Theano等其他工具包的集成,可在同一台计算机上通过增加线程数显着提高性能。

关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我只是numpy在一个virtualenv带有OpenBLAS集成的内部进行编译,看来工作正常。

    这是我的过程:

    1. 编译OpenBLAS
      $ git clone https://github.com/xianyi/OpenBLAS
      

      $ cd OpenBLAS && make FC=gfortran
      $ sudo make PREFIX=/opt/OpenBLAS install

    如果您没有管理员权限,则可以将其设置PREFIX=为具有写权限的目录(只需相应地修改下面的相应步骤)。

    1. 确保包含目录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
    
    1. 抓取numpy源代码:

      $ git clone https://github.com/numpy/numpy
      

      $ cd numpy

    2. 复制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
    ....
    
    1. 检查配置,构建,安装(可选在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

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看