【问题标题】:Installing scipy and scikit-learn on apple m1在苹果 m1 上安装 scipy 和 scikit-learn
【发布时间】:2021-10-07 18:25:36
【问题描述】:

在 m1 芯片上安装以下软件包:Numpy 1.21.1、pandas 1.3.0、torch 1.9.0 和其他一些软件包对我来说效果很好。在测试它们时,它们似乎也能正常工作。但是,当我尝试通过 pip 安装 scipy 或 scikit-learn 时,会出现此错误:

错误:numpy 构建轮子失败

无法构建 numpy

错误:无法为使用 PEP 517 且无法直接安装的 numpy 构建轮子

当我已经安装了 pip 的最新版本时,为什么还要重新构建 Numpy?

之前的每一次安装都是在 Mac OS 11.3.1 上使用 python3.9 -m pip install ... 和苹果 m1 芯片完成的。

也许有人知道如何处理这个错误,或者这只是时间问题。

【问题讨论】:

  • pip 有一个 --no-use-pep517 选项。看看这是否有效。
  • 感谢提示,使用此标志进行安装有什么缺点吗?

标签: python scikit-learn scipy apple-m1


【解决方案1】:

更新:scikit-learn 现在通过 pip 工作✅

首先是brew install openblas - 它有针对不同处理器的指令 (wikipedia)

brew install openblas
export OPENBLAS=$(/opt/homebrew/bin/brew --prefix openblas)
export CFLAGS="-falign-functions=8 ${CFLAGS}"
# ^ no need to add to .zshrc, just doing this once.
pip install scikit-learn # ==0.24.1 if you want

在 M1 Pro 上表现出色 ?

额外细节

Pip 从 Pipy 下载源代码,然后针对 MacOS X 12.0 和 arm64(苹果硅)构建了轮子:scikit_learn-1.0.1-cp38-cp38-macosx_12_0_arm64.whl

Building wheels for collected packages: scikit-learn
  Building wheel for scikit-learn (pyproject.toml) ... done
  Created wheel for scikit-learn: filename=scikit_learn-1.0.1-cp38-cp38-macosx_12_0_arm64.whl size=6364030 sha256=0b0cc9a21af775e0c8077ee71698ff62da05ab62efc914c5c15cd4bf97867b31
Successfully built scikit-learn
Installing collected packages: scipy, scikit-learn
Successfully installed scikit-learn-1.0.1 scipy-1.7.3

关于 Pipy 的注意事项:我们通常会下载 预构建的轮子(是的,这对于可靠的分发和确保兼容性非常有用)。或者,如果不存在预构建的轮子(悲伤),那么我们下载 tar.gz 并自己构建它。发生这种情况是因为作者没有向 Pipy 发布预构建的轮子,但是越来越多的人将其添加到他们的 CI(github 操作)工作流程中。自己构建轮子需要更多的 cpu 时间,并且通常不太可靠,但在这种情况下可以工作。

我们在这里下载了一个预构建的轮子,它几乎没有限制:它适用于任何版本的 python 3、任何操作系统、任何架构(如 amd64 或 arm64):click-8.0.3-py3-none-any.whl

Collecting click>=7.0
  Downloading click-8.0.3-py3-none-any.whl

这里显然我们没有可用的轮子,所以我们必须使用setuptools 运行setup.py 自己构建它。

Collecting grpcio>=1.28.1
  Downloading grpcio-1.42.0.tar.gz (21.3 MB)
     |████████████████████████████████| 21.3 MB 12.7 MB/s
  Preparing metadata (setup.py) ... done

## later in the process it installs using setuptools 
Running setup.py install for grpcio ... done

祝你好运和快乐的管道。

【讨论】:

  • 对我来说工作得很好,即使我没有单独安装 openblas 和 brew。稍等片刻,使用 pep 517 成功构建了轮子。还使用简单的教程对 Sklearn 进行了测试,以确认可以正常安装。谢谢你的回答。
  • 你知道这是否适用于从源代码构建吗?假设您要在本地对 scikit-learn 代码进行更改。
  • @ajl123 是的,这将适用于从源代码构建,因为这与我们为 scikit-learn 构建轮子时所做的事情是一样的。祝你好运!
【解决方案2】:

最终设法使用以下步骤对其进行排序:

  1. 使用 brew 安装 python 3.9 (brew install python@3.9)
  2. 设置 PATH 以首先选择 brew python3 (export PATH=opt/homebrew/bin:$PATH)
  3. 运行以下命令安装 scipy 和 scikit-learn


    >> /opt/homebrew/bin/brew install openblas
    >> export OPENBLAS=$(/opt/homebrew/bin/brew --prefix openblas)
    >> export CFLAGS="-falign-functions=8 ${CFLAGS}"
    >> git clone https://github.com/scipy/scipy.git
    >> cd scipy
    >> git submodule update --init
    >> /opt/homebrew/bin/pip3 install .
    >> /opt/homebrew/bin/pip3 install scikit-learn

  1. 进入需要创建虚拟环境的文件夹,运行python3 -m venv --system-site-packages .venv

【讨论】:

  • 这是我发现正确安装scipy 的最简单方法。我觉得这条评论应该得到更多关注,因为您在搜索如何安装scipy 时找到的大多数指南都经过conda forge
  • 你的2号怎么办?
  • @EnzoY export PATH=opt/homebrew/bin:$PATH
【解决方案3】:

请看scikit-learn的这篇笔记

Installing on Apple Silicon M1 hardware

最近推出的macos/arm64 平台(有时也称为macos/aarch64)需要开源社区升级构建配置和自动化以正确支持它。

在撰写本文时(2021 年 1 月),在此硬件上安装 scikit-learn 的唯一方法是从 conda-forge 发行版安装 scikit-learn 及其依赖项 ,例如使用 miniforge 安装程序:

https://github.com/conda-forge/miniforge

以下问题跟踪了使用 pip 从 PyPI 安装 scikit-learn 的进展:

https://github.com/scikit-learn/scikit-learn/issues/19137

【讨论】:

  • 感谢您的回复。已阅读此说明,但由于它们的日期为 1 月 21 日,我认为可能有一种修复/更好的方法来安装这些软件包。
  • 我无法确定是否有其他选择。但是,当您关注问题 #19137 的 GitHub 链接时,您可以看到它仍然处于打开状态,并且目前 3 个任务中的 1 个已完成。他们正在积极努力,但尚未解决。
  • 更新:scikit-learn 现在可通过 PIP 获得。先安装openblas,看我的回答:stackoverflow.com/a/70178471/6912226
【解决方案4】:

我不知道为什么 numpy 会再次构建(也许 scipy 有其他版本要求?),但我可以报告如何安装 scipy 和 scikit-learn 的方法。我刚刚成功使用以下命令序列,基于 Python 3.8.11(特别是 scipy 编译需要一些时间,所以这个过程不是很快,不幸的是):

# SciPy:
python -m pip install --no-cache --no-use-pep517 pythran cython pybind11 gast"==0.4.0"
pyenv rehash
python -m pip install --no-cache --no-binary :all: --no-use-pep517 scipy"==1.7.1"

# Scikit-Learn
python -m pip install --no-use-pep517 scikit-learn"==0.24.2"

所以 scikit-learn 主页上关于 conda 安装路径是必要的信息似乎已经过时了。

Apple 开发者工具(XCode、xcode-select)和其他一些通过自制软件安装的软件包,以及之前在 pyenv virtualenv 环境中安装的,这也可能是相关的,所以我在下面添加它们:

brew install openblas openssl@1.1 pkg-config pyenv pyenv-virtualenv
python -m pip install numpy==1.19.5

我需要旧的 numpy 版本,因为在这个环境中还安装了 tensorflow,它与新的 numpy 版本不兼容;我不知道您的新 numpy 是否会导致您遇到的问题。

目前对 Apple M1 的支持似乎有很多变化,所以这可能很快就会变得更容易。

【讨论】:

    【解决方案5】:

    我猜 Scipy 和 Numpy 在 arm64 处理器(MAC M1 OS BigSur 和更高版本)上不直接支持,这需要用户手动安装和构建依赖项。我想通过使用 Python 3.8 版创建一个虚拟环境来解决这个问题。最终版本发布后,可以轻松删除此更改而不会产生任何冲突。

    1. 使用 Python 3.8 版设置 Python 虚拟环境。

    python3.8 -m venv

    1. 激活环境

    源 /bin/activate

    1. 安装 numpy 和 scipy

    pip3 安装 numpy
    pip3 安装 scipy

    【讨论】:

      【解决方案6】:

      我在这里插话,因为我正在使用 Docker 容器安装所有这些。主机是运行 Monterey 12.0.1 的 M1 MBP - 我在 GitHub 上的 this thread 中找到了以下解决方案。 scipy 团队似乎很快就会有更新。

      确保您使用的是 Python 3.9 并使用 HomeBrew,运行 brew install openblas。完成后,您可以将以下行添加到 Dockerfile:

      RUN OPENBLAS="/opt/homebrew/opt/openblas" CFLAGS="-falign-functions=8 ${CFLAGS}" pip3 install scipy
      RUN OPENBLAS="/opt/homebrew/opt/openblas" CFLAGS="-falign-functions=8 ${CFLAGS}" pip3 install scikit-learn
      

      【讨论】:

        【解决方案7】:

        最好的方法是使用 Miniforge 。确认适用于 Macbook M1 和 OS 12(monterey)

        1. 在 macbook M1 上,您可以使用命令 brew install miniforge 安装 miniforge。

        2. 安装后,您可以使用以下命令创建虚拟环境 命令conda create -n .venv python

        3. 使用命令conda activate .venv激活环境

        4. 使用conda install scikit-learn将scikit-learn安装到环境中

        与 scikit-learn 安装相关的官方问题跟踪器位于他们的 github issues 中。建议的一些解决方案适用于 Mac OS 11,但不适用于 Mac OS 12。
        我终于找到了可行的解决方案here

        【讨论】:

          【解决方案8】:

          苹果 M1 专业版,macOS 12.1

          Python 3.9.10 (main, Jan 15 2022, 11:40:53) 
          [Clang 13.0.0 (clang-1300.0.29.3)] on darwin
          pip 22.0.3
          

          安装 numpy 和 scipy

          brew install openblas gfortran
          OPENBLAS="$(brew --prefix openblas)" pip install numpy==1.19.3
          OPENBLAS="$(brew --prefix openblas)" pip install scipy==1.7.2
          

          安装 scikit-learn (0.21.3)

          pip install cython
          brew install libomp
          export CC=/usr/bin/clang
          export CXX=/usr/bin/clang++
          export CPPFLAGS="$CPPFLAGS -Xpreprocessor -fopenmp"
          export CFLAGS="$CFLAGS -I/opt/homebrew/Cellar/libomp/13.0.1/include"
          export CXXFLAGS="$CXXFLAGS -I/opt/homebrew/Cellar/libomp/13.0.1/include"
          export LDFLAGS="$LDFLAGS -L/opt/homebrew/Cellar/libomp/13.0.1/lib -lomp"
          export DYLD_LIBRARY_PATH=/opt/homebrew/Cellar/libomp/13.0.1/lib
          pip install scikit-learn==0.21.3
          

          【讨论】:

            猜你喜欢
            • 2021-08-18
            • 2012-11-02
            • 2021-12-19
            • 2021-04-22
            • 2016-02-21
            • 2021-07-22
            • 2017-03-08
            • 2017-08-30
            • 2015-06-28
            相关资源
            最近更新 更多