NumPy 从源代码构建

2021-09-24 19:20 更新

有两种构建 NumPy 的选项:

  • 使用 Gitpod 构建
  • 从源本地构建。

你的选择将会取决于你的操作系统以及对命令行的熟练程度。

gitpod

Gitpod 是一个开源平台,可以在你的浏览器中自动创建正确的开发环境,减少安装本地开发环境和处理不兼容依赖项的需要。

如果你是 Windows 用户,对于命令行的使用不熟悉或者是第一次构建 NumPy,使用 Gitpod 来构建通常会更快。下面是使用 Gitpod 构建 NumPy 的深入说明。

本地构建

在你的机器上本地构建,可以为你提供更加精细的控制。如果你是熟悉命令行使用的 MacOS 或者 Linux 用户,则可以按照下面的说明继续在本地构建 NumPy。

先决条件

构建 NumPy 前需要具备以下内容:

  1. Python 3.6.X 或者更新的版本
    请注意:还需要安装 Python 开发头文件,例如:在 Debian/Ubuntu 上就需要安装 Python3 和 Python3-dev。
    在 Windows 和 MacOS 上,这个通常不是问题。
  2. 编译器
    虽然构建 NumPy 不需要 FORTRAN 77 编译器,但是运行 numpy.f2py 测试需要它。如果未自动检测到编译器,则会跳过这些测试。
    请注意:NumPy 主要使用 GUN 编译器开发,并在 MSVC 和 Clang 编译器上进行测试。来自 Intel、Absoft、Sun、NAG、Compaq、Portlang、Lahey、HP、IBM等其他供应商的编译器仅是以社区反馈的形式提供支持,可能无法开箱即用。建议使用 GCC 4.x(或者更高版本)的便宜。在 ARM64(aarch64)上,建议使用 GCC 8.x(或者更高版本)。
  3. 线性代数库
    NumPy 不需要安装任何外部线性代数库。但是,如果这些可用,NumPy 的安装脚本可以检测到它们并使用它们进行构建。可以使用许多不同的 LAPACK 库设置,包括优化的 LAPACK 库,例如 OpenBLAS 或 MKL。这些库的选择和位置以及包含路径和其他此类构建选项可以在site.cfg位于 NumPy 根存储库或.numpy-site.cfg主目录中的文件中指定。有关site.cfg.example文档,请参阅NumPy 存储库或 sdist 中包含的示例文件,以及从环境变量指定搜索优先级的下方。
  4. CPython
    要构建 NumPy,你还需要最新版本的 Cython。

基本安装

要安装 NumPy,请运行:

pip install numpy

要执行可以从源文件夹运行的就地构建,请运行:

python setup.py build-ext --inplace

注意:有关在 NumPy 本身上进行开发工作的构建说明,请参阅 设置和使用开发环境

测试

测试是为了确保你的构建是否一切正常,请查看是否所有的测试都能够通过:

$ python runtests.py -v -m full

有关测试的详细信息,请参阅测试构建

并行构建

可以使用以下方法进行构建:

python setup.py build -j 4 install --prefix $HOME/.local

将会在 4 个 CPU 上编译 numpy 并将其安装到指定的前缀中。要执行并行就地构建,请运行:

python setup.py build-ext --inplace -j 4

还可以通过环境变量指定构建作业的数量 NPY_NUM_BUILD_JOBS

选择 Fortran 编译器

编译器是自动检测的。使用特定编译器可以使用 --fcompiler,例如选择 gfortran:

python setup.py build --fcompiler=gnu95

有更多的相关信息,可以通过以下命令参阅:

python setup.py build --help-fcompiler

如何检查 BLAS/LAPACK 库的 ABI

检查用于构建库的编译器的一种相对简单且可靠的方法是在库上使用 ldd。如果 libg2c.so 是一个依赖项,这意味着已经使用了 g77(注意:构建NumPy不再支持g77)。如果 libgfortran.so 是依赖项,则已经使用 gfortran。如果两者都是依赖项,则意味着两者都已经使用,这几乎是一个非常不好的方法。

加速 BLAS/LAPACK 库

NumPy 搜索优化的线性代数库,例如 BLAS 和 LAPACK。搜索这些库有特定的顺序,如下文和site.cfg.example文件中所述:

BLAS

请注意:正确优化的NumPy构建需要BLASh和CBLAS接口。 库的默认顺序是:

  1. MKL
  2. BLIS
  3. 开放式BLAS
  4. ATLAS
  5. BLAS(NetLIB)

可以通过定义环境变量来绕过对 BLAS 库的检测,该变量NPY_BLAS_LIBS应包含您要使用的确切链接器标志(假设接口为 Fortran 77)。还定义 NPY_CBLAS_LIBS(如果 CBLAS 包含在您的 BLAS 库中,则为空)以触发 CBLAS 的使用并避免用于矩阵计算的缓慢回退代码。

如果您希望针对 OpenBLAS 进行构建,但也有 BLIS 可用,则可以通过环境变量预定义搜索顺序,该环境变量 NPY_BLAS_ORDER是上述名称的逗号分隔列表,用于确定要搜索的内容,例如:

NPY_BLAS_ORDER=ATLAS,blis,openblas,MKL python setup.py build

将更喜欢使用 ATLAS,然后是 BLIS,然后是 OpenBLAS,并且作为最后的手段 MKL。如果这些都不存在,构建将失败(名称比较小写)。

或者,可以使用!^否定所有项目:

NPY_BLAS_ORDER='^blas,atlas' python setup.py build

将允许使用任何东西,但NETLIB的BLAS和ATLAS库,上面列表的顺序被保留。 不能混合否定和肯定,也不能有多个否定,这种情况会引发错误。

LAPACK

  1. MKL
  2. 开放式BLAS
  3. libFLAME
  4. ATLAS
  5. LAPACK(NetLIB)

可以通过定义环境变量来绕过 LAPACK 库的检测,该变量NPY_LAPACK_LIBS应包含您要使用的确切链接器标志(假定语言为 Fortran 77)。

如果您希望针对 OpenBLAS 进行构建,但您也有 MKL 可用,则可以通过环境变量预定义搜索顺序,该环境变量 NPY_LAPACK_ORDER是上述名称的逗号分隔列表,例如:

NPY_LAPACK_ORDER=ATLAS,openblas,MKL python setup.py build

将更喜欢使用 ATLAS,然后是 OpenBLAS,并且作为最后的手段 MKL。如果这些都不存在,构建将失败(名称比较小写)。

或者,可以使用!^否定所有项目:

NPY_LAPACK_ORDER='^lapack' python setup.py build

将允许使用任何东西,但在NETLIB LAPACK库,上面列表的顺序被保留。

不能混合否定和肯定,也不能有多个否定,这种情况会引发错误。

禁用 ATLAS 和其他加速库

可以通过以下方式禁用 ATLAS 和 NumPy 中其他加速库的使用:

NPY_BLAS_ORDER= NPY_LAPACK_ORDER= python setup.py build

或者:

BLAS=None LAPACK=None ATLAS=None python setup.py build

64位 BLAS 和 LAPACK

您可以通过设置环境变量来告诉 Numpy 使用 64 位 BLAS/LAPACK 库:

NPY_USE_BLAS_ILP64=1

在构建 Numpy 时。支持以下 64 位 BLAS/LAPACK 库:

  1. 带有64_符号后缀 ( openblas64_) 的OpenBLAS ILP64
  2. 没有符号后缀的 OpenBLAS ILP64 ( openblas_ilp64)

它们的优先顺序由NPY_BLAS_ILP64_ORDERNPY_LAPACK_ILP64_ORDER环境变量决定 。默认值为openblas64_,openblas_ilp64

提供额外的编译器标志

可以通过设置OPT、 FOPT(对于 Fortran)和CC环境变量来提供额外的编译器标志。在提供应该提高代码性能的选项时,请确保您还设置-DNDEBUG为不执行调试代码。

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号