安装 scikit-learn 的开发版本#

本节介绍如何安装 scikit-learn 的 **主分支**。这可以通过安装 nightly build 或从源代码构建来完成。

安装 nightly build#

scikit-learn 项目的持续集成服务器每天都会构建、测试并上传最新 Python 版本的 wheel 包。

安装 nightly build 是最快的尝试以下操作的方法:

  • 尝试将在下一个版本中发布的新功能(即最近合并到主分支的 pull 请求中的功能);

  • 检查您遇到的错误是否已在上次发布后修复。

您可以使用 scientific-python-nightly-wheels 索引从 anaconda.org 的 PyPI 注册表中安装 scikit-learn 的 nightly build。

pip install --pre --extra-index https://pypi.anaconda.org/scientific-python-nightly-wheels/simple scikit-learn

请注意,可能需要先卸载 scikit-learn 才能安装 scikit-learn 的 nightly build。

从源代码构建#

从源代码构建是进行贡献(错误修复、新功能、代码或文档改进)所必需的。

  1. 使用 Gitscikit-learn 存储库 在 Github 上检出最新的源代码。

    git clone git://github.com/scikit-learn/scikit-learn.git  # add --depth 1 if your connection is slow
    cd scikit-learn
    

    如果您打算提交 pull 请求,您应该从您的 fork 中克隆。

  2. 安装最新版本的 Python(在撰写本文时为 3.9 或更高版本),例如使用 Miniforge3。Miniforge 提供了基于 conda 的 Python 发行版以及最流行的科学库。

    如果您使用 conda 安装了 Python,我们建议您创建一个专门的 conda 环境,其中包含 scikit-learn 的所有构建依赖项(即 NumPySciPyCythonmeson-pythonNinja)。

    conda create -n sklearn-env -c conda-forge python numpy scipy cython meson-python ninja
    

    虽然并非总是必要,但在激活新创建的 conda 环境之前打开一个新的提示符更安全。

    conda activate sklearn-env
    
  3. **conda 的替代方案:**您可以使用其他 Python 安装,只要它们足够新(在撰写本文时为 3.9 或更高版本)。以下是如何为 Linux 系统的 Python 创建构建环境的示例。构建依赖项使用 pip 安装在专门的 virtualenv 中,以避免破坏系统上安装的其他 Python 程序。

    python3 -m venv sklearn-env
    source sklearn-env/bin/activate
    pip install wheel numpy scipy cython meson-python ninja
    
  4. 使用 OpenMP 支持为您的平台安装编译器。请参阅 WindowsmacOSLinuxFreeBSD 的说明。

  5. 使用 pip 构建项目

    pip install --editable . \
       --verbose --no-build-isolation \
       --config-settings editable-verbose=true
    
  6. 检查安装的 scikit-learn 是否具有以 .dev0 结尾的版本号。

    python -c "import sklearn; sklearn.show_versions()"
    
  7. 请参考 开发者指南有用的 pytest 别名和标志 以在您选择的模块上运行测试。

注意

--config-settings editable-verbose=true 是可选的,但建议使用它以避免在导入 sklearn 时出现意外情况。 meson-python 通过在执行 import sklearn 时重建 sklearn 来实现可编辑安装。使用推荐的设置,您将在发生这种情况时看到一条消息,而不是可能在没有反馈的情况下等待并想知道发生了什么。额外的好处是:这意味着您只需要运行一次 pip install 命令,sklearn 将在导入 sklearn 时自动重建。

依赖项#

运行时依赖项#

Scikit-learn 在构建时和运行时都需要以下依赖项

  • Python (>= 3.8),

  • NumPy (>= 1.19.5),

  • SciPy (>= 1.6.0),

  • Joblib (>= 1.2.0),

  • threadpoolctl (>= 3.1.0)。

构建依赖项#

构建 Scikit-learn 还需要

注意

如果编译器不支持 OpenMP,则构建将禁用 OpenMP 功能。不建议这样做,因为它将强制某些估计器以顺序模式运行,而不是利用基于线程的并行性。设置 SKLEARN_FAIL_NO_OPENMP 环境变量(在 cythonization 之前)将强制构建在不支持 OpenMP 时失败。

从 0.21 版本开始,scikit-learn 会自动检测并使用 SciPy **在运行时** 使用的线性代数库。因此,scikit-learn 对 BLAS/LAPACK 实现(如 OpenBlas、Atlas、Blis 或 MKL)没有构建依赖项。

测试依赖项#

运行测试需要

  • pytest >= 7.1.2

一些测试还需要 pandas

从标签构建特定版本#

如果您想构建稳定版本,您可以 git checkout <VERSION> 以获取该特定版本的代码,或从 github 下载该版本的 zip 存档。

平台特定说明#

以下是如何为每个支持的平台安装具有 OpenMP 支持的工作 C/C++ 编译器以构建 scikit-learn Cython 扩展的说明。

Windows#

首先,下载 Visual Studio 2019 构建工具安装程序

运行下载的 vs_buildtools.exe 文件,在安装过程中,您需要确保选择了“使用 C++ 进行桌面开发”,类似于此屏幕截图

../_images/visual-studio-build-tools-selection.png

其次,找出您正在运行的是 64 位还是 32 位 Python。构建命令取决于 Python 解释器的体系结构。您可以通过在 cmdpowershell 控制台中运行以下命令来检查体系结构

python -c "import struct; print(struct.calcsize('P') * 8)"

对于 64 位 Python,通过在 cmd 或 Anaconda 提示符(如果您使用 Anaconda)中运行以下命令来配置构建环境

SET DISTUTILS_USE_SDK=1
"C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" x64

x64 替换为 x86 以构建 32 位 Python。

请注意,上面的路径可能因用户而异。目标是指向将设置当前命令提示符中必要环境变量的“vcvarsall.bat”文件。

最后,使用此命令提示符构建 scikit-learn

pip install --editable . \
    --verbose --no-build-isolation \
    --config-settings editable-verbose=true

macOS#

macOS 上的默认 C 编译器,Apple clang(令人困惑地别名为 /usr/bin/gcc),不支持 OpenMP。我们提供两种启用 OpenMP 支持的替代方法

  • 要么使用 conda 安装 conda-forge::compilers

  • 要么使用 Homebrew 安装 libomp 以扩展默认的 Apple clang 编译器。

对于 Apple Silicon M1 硬件,在撰写本文时(2021 年 1 月),只有下面的 conda-forge 方法已知有效。您可以使用 miniforge 安装程序 安装 conda 的 macos/arm64 发行版。

来自 conda-forge 的 macOS 编译器#

如果您使用 conda 包管理器(版本 >= 4.7),您可以从 conda-forge 频道安装 compilers 元包,它提供了基于 llvm 工具链的启用 OpenMP 的 C/C++ 编译器。

首先安装 macOS 命令行工具

xcode-select --install

建议您使用专门的 conda 环境 从源代码构建 scikit-learn

conda create -n sklearn-dev -c conda-forge python numpy scipy cython \
    joblib threadpoolctl pytest compilers llvm-openmp meson-python ninja

虽然并非总是必要,但在激活新创建的 conda 环境之前打开一个新的提示符更安全。

conda activate sklearn-dev
make clean
pip install --editable . \
    --verbose --no-build-isolation \
    --config-settings editable-verbose=true

注意

如果您遇到任何冲突的依赖项错误消息,请尝试注释掉 $HOME/.condarc 文件中的任何自定义 conda 配置。特别是 channel_priority: strict 指令已知会导致此设置出现问题。

您可以使用以下命令检查自定义编译器是否已从 conda forge 正确安装

conda list

其中应包括 compilersllvm-openmp

编译器元包将自动设置自定义环境变量

echo $CC
echo $CXX
echo $CFLAGS
echo $CXXFLAGS
echo $LDFLAGS

它们指向您 sklearn-dev conda 环境中的文件和文件夹(特别是在 bin/、include/ 和 lib/ 子文件夹中)。例如,-L/path/to/conda/envs/sklearn-dev/lib 应该出现在 LDFLAGS 中。

在日志中,您应该看到使用 conda 安装的 clang 和 clang++ 编译器构建的已编译扩展,并使用 -fopenmp 命令行标志。

macOS 编译器来自 Homebrew#

另一种解决方案是为 macOS 上默认提供的 clang 编译器启用 OpenMP 支持。

首先安装 macOS 命令行工具

xcode-select --install

为 macOS 安装 Homebrew 包管理器。

安装 LLVM OpenMP 库

brew install libomp

设置以下环境变量

export CC=/usr/bin/clang
export CXX=/usr/bin/clang++
export CPPFLAGS="$CPPFLAGS -Xpreprocessor -fopenmp"
export CFLAGS="$CFLAGS -I/usr/local/opt/libomp/include"
export CXXFLAGS="$CXXFLAGS -I/usr/local/opt/libomp/include"
export LDFLAGS="$LDFLAGS -Wl,-rpath,/usr/local/opt/libomp/lib -L/usr/local/opt/libomp/lib -lomp"

最后,以详细模式构建 scikit-learn(以检查编译器命令中是否存在 -fopenmp 标志)

make clean
pip install --editable . \
    --verbose --no-build-isolation \
    --config-settings editable-verbose=true

Linux#

Linux 编译器来自系统#

从源代码安装 scikit-learn 而不使用 conda 需要您已安装 scikit-learn Python 开发头文件以及具有 OpenMP 支持的工作 C/C++ 编译器(通常是 GCC 工具链)。

为基于 Debian 的操作系统(例如 Ubuntu)安装构建依赖项

sudo apt-get install build-essential python3-dev python3-pip

然后像往常一样进行

pip3 install cython
pip3 install --editable . \
    --verbose --no-build-isolation \
    --config-settings editable-verbose=true

Cython 和运行时依赖项(numpy、scipy 和 joblib)的预编译轮子应该自动安装在 $HOME/.local/lib/pythonX.Y/site-packages 中。或者,您可以从 virtualenvconda 环境 运行上述命令,以完全隔离来自系统打包程序安装的 Python 包。使用隔离环境时,上述命令中的 pip3 应替换为 pip

当运行时依赖项的预编译轮子不可用于您的体系结构(例如 ARM)时,您可以安装系统版本

sudo apt-get install cython3 python3-numpy python3-scipy

在 Red Hat 和克隆(例如 CentOS)上,使用以下命令安装依赖项

sudo yum -y install gcc gcc-c++ python3-devel numpy scipy

Linux 编译器来自 conda-forge#

或者,使用 conda 在用户文件夹中安装最新版本的 GNU C 编译器工具链(GCC)

conda create -n sklearn-dev -c conda-forge python numpy scipy cython \
    joblib threadpoolctl pytest compilers meson-python ninja

虽然并非总是必要,但在激活新创建的 conda 环境之前打开一个新的提示符更安全。

conda activate sklearn-dev
pip install --editable . \
    --verbose --no-build-isolation \
    --config-settings editable-verbose=true

FreeBSD#

FreeBSD 12.0 和 11.2 基本系统中包含的 clang 编译器不包含 OpenMP 支持。您需要从包(或端口)安装 openmp

sudo pkg install openmp

这将在 /usr/local/include 中安装头文件,并在 /usr/local/lib 中安装库。由于默认情况下不会搜索这些目录,因此您可以将环境变量设置为这些位置

export CFLAGS="$CFLAGS -I/usr/local/include"
export CXXFLAGS="$CXXFLAGS -I/usr/local/include"
export LDFLAGS="$LDFLAGS -Wl,-rpath,/usr/local/lib -L/usr/local/lib -lomp"

最后,使用标准命令构建包

pip install --editable . \
    --verbose --no-build-isolation \
    --config-settings editable-verbose=true

对于即将发布的 FreeBSD 12.1 和 11.3 版本,OpenMP 将包含在基本系统中,这些步骤将不再需要。

替代编译器#

以下命令将使用您的默认 C/C++ 编译器构建 scikit-learn。

pip install --editable . \
    --verbose --no-build-isolation \
    --config-settings editable-verbose=true

如果您想使用 setuptools 处理的另一个编译器构建 scikit-learn,请使用以下命令

python setup.py build_ext --compiler=<compiler> -i build_clib --compiler=<compiler>

要查看可用编译器的列表,请运行

python setup.py build_ext --help-compiler

如果您的编译器未在此处列出,您可以通过一些环境变量指定它(在 Windows 上不起作用)。setuptools 文档的这一部分详细解释了 setuptools 在编译的哪个阶段使用哪些环境变量来设置编译器和链接器选项。

设置这些环境变量时,建议首先检查它们的 sysconfig 对应变量,并将其调整为您的编译器。例如

import sysconfig
print(sysconfig.get_config_var('CC'))
print(sysconfig.get_config_var('LDFLAGS'))

此外,由于 Scikit-learn 使用 OpenMP,您需要将编译器的相应 OpenMP 标志包含在 CFLAGSCPPFLAGS 环境变量中。