安装scikit-learn的开发版本#

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

安装每夜构建版本#

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

安装每夜构建版本是以下最快的方法:

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

  • 检查您遇到的错误是否已在上一版本中修复。

您可以使用scientific-python-nightly-wheels索引,从anaconda.org的PyPI注册表安装scikit-learn的每夜构建版本

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

请注意,可能需要先卸载scikit-learn才能安装scikit-learn的每夜构建版本。

从源代码构建#

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

  1. 使用Git从Github上的scikit-learn仓库检出最新源代码。

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

    如果您打算提交拉取请求,则应从您的派生(fork)仓库克隆。

  2. 安装最新版本的Python(3.10或更高版本),例如使用conda-forge。Conda-forge提供基于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.10或更高版本)。以下是为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的说明。

    注意

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

  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将自动重建。

请注意,--config-settings仅在pip 23.1或更高版本中受支持。要将pip升级到兼容版本,请运行pip install -U pip

从标签构建特定版本#

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

平台特定说明#

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

Windows#

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

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

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

在您的sklearn-env conda环境或virtualenv中运行以下命令来构建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方法有效。您可以使用conda-forge安装程序安装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命令行标志进行构建。

来自Homebrew的macOS编译器#

另一种解决方案是为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编译器#

在不使用conda的情况下从源代码安装scikit-learn,需要您已安装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)的预编译wheel包应自动安装在$HOME/.local/lib/pythonX.Y/site-packages中。或者,您可以在virtualenvconda环境中运行上述命令,以实现与通过系统包管理器安装的Python包的完全隔离。当使用独立环境时,上述命令中的pip3应替换为pip

当您的架构(例如ARM)没有预编译的运行时依赖项wheel包时,您可以安装系统版本:

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

在Red Hat及其克隆版本(例如CentOS)上,使用以下命令安装依赖项:

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

来自conda-forge的Linux编译器#

或者,您可以使用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支持。您需要从包(或ports)中安装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将包含在基础系统中,这些步骤将不再需要。