如何从链接到 Apple Accelerate 框架的源代码构建 NumPy?

Posted

技术标签:

【中文标题】如何从链接到 Apple Accelerate 框架的源代码构建 NumPy?【英文标题】:How to build NumPy from source linked to Apple Accelerate framework? 【发布时间】:2021-12-19 06:09:10 【问题描述】:

据我了解,NumPy 在 1.20.0 版本中不再支持使用 Accelerate BLAS 和 LAPACK。根据 NumPy 1.21.1 的发行说明,这些错误已得到解决,现在可以再次在 MacOS >= 11.3 上使用 Accelerate 框架从源代码构建 NumPy:https://numpy.org/doc/stable/release/1.21.0-notes.html,但我找不到任何有关如何执行此操作的文档.这似乎是一件有趣的事情,因为 Accelerate 框架应该针对 M 系列处理器进行了高度优化。我想这个过程是这样的:

    下载 numpy 源代码文件夹并导航到该文件夹​​。 制作一个类似于以下内容的site.cfg 文件:
[DEFAULT]
library_dirs = /some/directory/
include_dirs = /some/other/directory/

[accelerate]
libraries = Accelerate, vecLib
    运行python setup.py build

问题是我不知道 1. 变量 library_dirsinclude_dirs 应该是什么,以便 NumPy 知道使用 Accelerate BLAS 和 LAPACK 以及 2. 是否需要采取任何其他额外步骤。如果有人知道如何执行此操作或可以提供任何见解,将不胜感激。

【问题讨论】:

【参考方案1】:

我今天早些时候实际上尝试过,这些是我使用的步骤:

site.cfg 文件中,放入
[accelerate]
libraries = Accelerate, vecLib

使用NPY_LAPACK_ORDER=accelerate python3 setup.py build 构建

使用pip3 install .安装

之后np.show_config()返回如下

blas_mkl_info:
  NOT AVAILABLE
blis_info:
  NOT AVAILABLE
openblas_info:
  NOT AVAILABLE
accelerate_info:
    extra_compile_args = ['-I/System/Library/Frameworks/vecLib.framework/Headers']
    extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
    define_macros = [('NO_ATLAS_INFO', 3), ('HAVE_CBLAS', None)]
blas_opt_info:
    extra_compile_args = ['-I/System/Library/Frameworks/vecLib.framework/Headers']
    extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
    define_macros = [('NO_ATLAS_INFO', 3), ('HAVE_CBLAS', None)]
lapack_mkl_info:
  NOT AVAILABLE
openblas_lapack_info:
  NOT AVAILABLE
openblas_clapack_info:
  NOT AVAILABLE
flame_info:
  NOT AVAILABLE
lapack_opt_info:
    extra_compile_args = ['-I/System/Library/Frameworks/vecLib.framework/Headers']
    extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
    define_macros = [('NO_ATLAS_INFO', 3), ('HAVE_CBLAS', None)]
Supported SIMD extensions in this NumPy install:
    baseline = NEON,NEON_FP16,NEON_VFPV4,ASIMD
    found = ASIMDHP,ASIMDDP
    not found = 

我的快速测试表明相对于 OpenBlas 的性能有显着提升。

【讨论】:

谢谢!那行得通!它确实要快得多。出于好奇,我尝试为 Scipy 做一些类似的事情,但没有运气。 自己尝试过这样做,但不知何故,构建不断出错。我认为这与 -march=native 在 M1 上不受支持有关,但我当然不明白构建系统是如何工作的。您介意分享更多有关您的设置的信息吗?我基本上在新机器上试过git clone numpy && cd numpy && <create site.cfg> && NPY_LAPACK_ORDER=accelerate python3 setup.py build && pip3 install . 在我看来,获得 M1-native 环境设置最直接的方法是在:github.com/conda-forge/miniforge#download 获得 miniconda3 的 Macosx-arm64 版本。在这个环境中安装的任何东西都将默认为 arm64 构建或安装已发布的 arm64 二进制文件。如果这样做并安装了必要的编译器,那么您所说的大部分内容听起来都是正确的。除了我不确定您是否可以像这样在命令行中创建 site.cfg 文件。您必须手动制作并输入上面的行。也许如果您说明您遇到的错误,我们可以提供帮助。 您可能还必须删除site.cfg.example 文件,但这只是我的猜测。如果没有有关错误的更多信息,很难说出了什么问题。也许您没有安装一个或多个构建依赖项。【参考方案2】:

不,它不必那么复杂。我使用了这两个命令,并且能够在 Mac M1 上使用 Apple Accelerate 安装 numpy。

pip install cython pybind11
pip install --no-binary :all: --no-use-pep517 numpy

参考:How to install SciPy on Apple Silicon (ARM / M1)

【讨论】:

以上是关于如何从链接到 Apple Accelerate 框架的源代码构建 NumPy?的主要内容,如果未能解决你的问题,请参考以下文章

为什么Apple Accelerate框架有时会很慢?

为啥有时 Apple Accelerate 框架很慢?

Apple Accelerate Framework 缩放和规范化矢量

Apple 的 Accelerate Framework 库的开源等效项是啥? [关闭]

Apple Accelerate vDSP fft vs DFT 和比例因子

使用 Apple Accelerate Framework vForce 库来提高性能