32

我正在使用针对英特尔的数学内核库构建的 NumPy。我使用 virtualenv,通常使用 pip 来安装软件包。

但是,为了让 NumPy 找到 MKL 库,有必要在编译之前在 NumPy 源目录中创建一个 site.cfg 文件,然后手动构建和安装。我可以编写整个过程的脚本,但我希望有一个更简单的解决方案。

我有一个标准的 site.cfg 文件,可以在版本控制下用于此目的。是否有任何 pip 命令行选项会告诉它在构建包之前将特定文件复制到源目录?

或者,是否可以设置任何环境变量而不是在 site.cfg 文件中提供库路径?这是我使用的 site.cfg 文件。它几乎一字不差地取自英特尔的网站

[mkl]
library_dirs = /opt/intel/composer_xe_2013.1.117/mkl/lib/intel64
include_dirs = /opt/intel/composer_xe_2013.1.117/mkl/include
mkl_libs = mkl_rt
lapack_libs =

作为参考,我正在运行 Ubuntu、Python 2.7 和 NumPy 1.6。

4

4 回答 4

31

从源代码(https://github.com/numpy/numpy/blob/master/site.cfg.example):

为了帮助像 easy_install 这样的自动安装,还将检查用户的主目录中的文件 ~/.numpy-site.cfg 。

这是一个可行的解决方案吗?您仍然需要使用全局 .numpy-site.cfg 预加载主目录,但之后您不必为构建或安装而烦恼。

于 2012-12-10T07:41:10.977 回答
7

我最终整理了一个脚本来自动执行此操作。在这里,以防它可以帮助其他人。我已经在 Python 2.7 中对其进行了测试,但它应该可以在其他地方工作而无需进行重大修改。

from __future__ import unicode_literals

import io
import os.path
import re
import subprocess
import urllib2

# This downloads, builds, and installs NumPy against the MKL in the
# currently active virtualenv

file_name = 'numpy-1.6.2.tar.gz'
url = ('http://sourceforge.net/projects/numpy/files/NumPy/1.6.2/'
       'numpy-1.6.2.tar.gz/download')

def main():

    # download NumPy and unpack it
    file_data = urllib2.urlopen(url).read()
    with io.open(file_name, 'wb') as fobj:
        fobj.write(file_data)
    subprocess.check_call('tar -xvf {0}'.format(file_name), shell=True)
    base_name = re.search(r'(.*)\.tar\.gz$', file_name).group(1)
    os.chdir(base_name)

    # write out a site.cfg file in the build directory
    site_cfg = (
        '[mkl]\n'
        'library_dirs = /opt/intel/composer_xe_2013.1.117/mkl/lib/intel64\n'
        'include_dirs = /opt/intel/composer_xe_2013.1.117/mkl/include\n'
        'mkl_libs = mkl_rt\n'
        'lapack_libs =\n')
    with io.open('site.cfg', 'wt', encoding='UTF-8') as fobj:
        fobj.write(site_cfg)

    # build and install NumPy
    subprocess.check_call('python setup.py build', shell=True)
    subprocess.check_call('python setup.py install', shell=True)


if __name__ == '__main__':
    main()
于 2012-12-12T04:15:54.670 回答
4

您安装 NumPy 以使用英特尔的数学内核库的目标现在变得更加容易,因为英特尔创建了 pips来安装 MKL + NumPy:

pip uninstall numpy -y  # if the standard numpy is present
pip install intel-numpy

以及intel-scipy, intel-scikit-learn, pydaal, tbb4py, mkl_fft,mkl_random和更低级别的包(如果您只需要它们)。同样,如果标准包已经安装在您的 virtualenv 中,您必须先卸载它们。

笔记:

如果已安装标准 NumPy、SciPy 和 Scikit-Learn 软件包,则必须在安装这些软件包的英特尔® 变体(intel-numpy 等)之前卸载这些软件包以避免任何冲突。如前所述,pydaal 使用 intel-numpy,因此首先删除标准 Numpy 库(如果已安装)然后安装 pydaal 很重要。

于 2018-12-06T07:01:58.380 回答
0

或者,是否可以设置任何环境变量而不是在 site.cfg 文件中提供库路径?

NumPy 1.21为此引入了环境变量。

例如

NPY_BLAS_ORDER=MKL NPY_LAPACK_ORDER=MKL pip install numpy --no-binary numpy

从源代码安装 NumPy 时自动检测 MKL 库。如果需要,您可以设置环境变量NPY_BLAS_LIBSNPY_CBLAS_LIBSNPY_LAPACK_LIBS链接器 CLI 选项,将您选择的库放在链接器路径上。

这对脚本来说比创建~/.numpy-site.cfg文件更容易,

[openblas]
libraries = openblas
library_dirs = /usr/local/opt/openblas/lib
include_dirs = /usr/local/opt/openblas/include
runtime_library_dirs = /usr/local/opt/openblas/lib

然后运行

pip install numpy --no-binary numpy

~/.numpy-site.cfg顺便说一句,从源代码安装 scipy 时,该文件也适用:

pip install scipy --no-binary scipy

注意:如果您仍在使用 Python 2.7,请先安装 numpy,然后再安装 scipy。尝试将它们安装在一起将:

  • 调用请求 NumPy 的 SciPy easy_install 安装程序,
  • 加载最新的 NumPy 安装程序(即使您特别要求 pip 到install numpy==1.14.6 scipy==1.0.1 --no-binary numpy,scipy),然后
  • 失败是RuntimeError: Python version >= 3.5 required因为最新的 NumPy 不支持 Python 2.7。
于 2018-12-06T07:08:52.860 回答