使用 OpenBLAS 集成编译 numpy

2025-02-11 09:50:00
admin
原创
53
摘要:问题描述:我正在尝试使用 进行安装numpy,OpenBLAS但我不知道如何site.cfg写入文件。按照安装程序后,安装完成并且没有出现错误,但是当 OpenBLAS 使用的线程数从 1 增加时(由环境变量 OMP_NUM_THREADS 控制),性能会下降。我不确定 OpenBLAS 集成是否完美。有人可...

问题描述:

我正在尝试使用 进行安装numpyOpenBLAS但我不知道如何site.cfg写入文件。

按照安装程序后,安装完成并且没有出现错误,但是当 OpenBLAS 使用的线程数从 1 增加时(由环境变量 OMP_NUM_THREADS 控制),性能会下降。

我不确定 OpenBLAS 集成是否完美。有人可以提供一个site.cfg文件来实现相同的功能吗?

PS:OpenBLAS 与其他基于 Python 的工具包(如Theano)的集成,在同一台机器上,通过增加线程数量,可以显著提高性能。


解决方案 1:

我刚刚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
  1. 复制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

线程数越高,性能似乎越有显著提升。不过,我还没有对此进行过非常系统的测试,对于较小的矩阵,额外的开销可能会超过线程数越高所带来的性能优势。

解决方案 2:

如果你使用的是 ubuntu 或 mint,你可以通过 apt-get 安装 numpy 和 openblas,从而轻松地将 openblas 链接到 numpy。

sudo apt-get install numpy libopenblas-dev

在全新的 docker ubuntu 上,我测试了从博客文章“安装 Numpy 和 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

在我使用 安装 openblas 之后apt install openblas-dev,我使用 检查了 numpy 链接

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

解决方案 3:

这是一个比@ali_m 的答案更简单的方法,并且它适用于 macOS。

  1. 如果你没有 gfortran 编译器,请安装一个。例如在 macOS 上使用 homebrew:

$ brew install gcc
  1. 从源代码编译OpenBLAS[或使用包管理器],获取源代码存储库或下载发布版本:

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

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

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

  1. 创建一个~/.numpy-site.cfg包含步骤 2 中使用的 PREFIX 路径的文件:

[openblas]
libraries = 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-install numpy 和 scipy,无需手动下载它们[您也可以指定发布版本]:

pip install numpy scipy --no-binary numpy,scipy
  1. 根据我的经验,OPENBLAS_NUM_THREADS运行时的这种设置会使 OpenBLAS 更快,而不是更慢,尤其是当多个 CPU 进程同时使用它时:

 export OPENBLAS_NUM_THREADS=1

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

请参阅其他答案以了解测试方法。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用