安裝 scikit-learn 的開發版本#

本節介紹如何安裝 scikit-learn 的 main 分支。這可以透過安裝 nightly build 或從原始碼建置來完成。

安裝 nightly build#

scikit-learn 專案的持續整合伺服器會為最新的 Python 版本,每天建置、測試和上傳 wheel 封裝。

安裝 nightly build 是最快的方法,可以

  • 嘗試將在下一個版本中發布的新功能(即,最近合併到 main 分支的 pull request 中的功能);

  • 檢查您遇到的錯誤是否已在上次發布後修復。

您可以使用來自 anaconda.org 的 PyPI 註冊表中的 scientific-python-nightly-wheels 索引來安裝 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. 使用 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
    

    如果您計劃提交 pull request,您應該從您的 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 將會自動重建。

請注意,--config-settings 僅在 pip 版本 23.1 或更高版本中支援。若要將 pip 升級到相容版本,請執行 pip install -U pip

依賴項#

執行階段依賴項#

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 環境變數(在 cython 化之前)將會在不支援 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 Prompt(如果您使用 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 安裝程式來安裝 macos/arm64 發行版的 conda

從 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 編譯器#

從原始碼安裝 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)的預編譯 wheels 應自動安裝在 $HOME/.local/lib/pythonX.Y/site-packages 中。或者,您可以從 virtualenvconda 環境 執行上述命令,以完全隔離透過系統套件管理器安裝的 Python 套件。當使用隔離環境時,上述命令中的 pip3 應替換為 pip

當您的架構無法使用運行時依賴項的預編譯 wheels 時(例如 ARM),您可以安裝系統版本

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 中安裝 libs。由於預設不會搜尋這些目錄,您可以將環境變數設定為這些位置

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 將包含在基本系統中,並且不需要這些步驟。