【问题标题】:Supplying NumPy site.cfg arguments to pip为 pip 提供 NumPy site.cfg 参数
【发布时间】:2012-11-26 00:51:21
【问题描述】:

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

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

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

或者,是否可以设置任何环境变量而不是在 site.cfg 文件中提供库路径?这是我使用的 site.cfg 文件。它几乎是从Intel's site 中逐字记录的。

[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。

【问题讨论】:

    标签: python numpy pip intel-mkl


    【解决方案1】:

    来自来源(https://github.com/numpy/numpy/blob/master/site.cfg.example):

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

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

    【讨论】:

    • 是的,这绝对可以。谢谢。不过,我会将其保留一段时间,看看是否有人提出了更简单的解决方案。
    • @joshayers 你的~/.numpy-site.cfg 是怎么写的?我没有向 Scipy 提供 MKL 的 BLAS 的运气。见stackoverflow.com/q/22067761/688080
    • 作为额外的,我想安装scikits.audiolab,所以我将site.cfg 下的行从github.com/cournape/audiolab/issues/7 放入~/.numpy-site.cfg
    【解决方案2】:

    我最终整理了一个脚本来自动执行此操作。在这里,以防它可以帮助其他人。我已经在 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()
    

    【讨论】:

      【解决方案3】:

      自从Intel created pips 安装 MKL + NumPy 以来,您安装 NumPy 以使用英特尔的数学内核库的目标现在要容易得多

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

      以及intel-scipyintel-scikit-learnpydaaltbb4pymkl_fftmkl_random 以及较低级别的软件包(如果您只需要它们)。同样,如果标准包已经安装在您的 virtualenv 中,您必须先卸载它们。

      注意:

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

      【讨论】:

      • 直到我读到这篇文章,我才知道英特尔自己终于做了一些事情来让这件事变得简单。太棒了!
      【解决方案4】:

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

      NumPy 1.21 introduces environment variables 用于此目的。

      例如

      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。 Attempting 将它们安装在一起将:

      • 调用请求 NumPy 的 SciPy easy_install 安装程序,
      • 加载最新的 NumPy 安装程序(即使您专门要求 pip 到 install numpy==1.14.6 scipy==1.0.1 --no-binary numpy,scipy),然后
      • 因为最新的 NumPy 不支持 Python 2.7 而失败,RuntimeError: Python version >= 3.5 required

      【讨论】:

        猜你喜欢
        • 2016-07-29
        • 1970-01-01
        • 2021-01-18
        • 2015-03-11
        • 2018-05-15
        • 2016-04-24
        • 1970-01-01
        • 2021-11-27
        • 2017-11-29
        相关资源
        最近更新 更多