🍃

ryeでKaggleとほぼ同じML開発環境を構築してみた

2023/08/21に公開

修正履歴

  • 2023/8/21: 初版
  • 2023/9/5: CUDNNのインストールを追記

はじめに

最近よく耳にするpythonパッケージ管理ツール rye を使って、Kaggleとほぼ同じML開発環境を構築しようとがんばってみました。
結論、LightGBM、XGBoost、Catboost、pytorch、Polarsなどのライブラリのインストールはスムーズにできましたが、LightGBMのCUDA対応バージョンやRADIPSのcudfなどうまく導入できないライブラリも一部ありました。
(私の知識不足によるものな気もするので詳しい人いたらアドバイスください)

ryeを使って(できるだけ)Kaggleと同じ環境を再現してみる

実行環境

OS:Ubuntu2204
ryeのバージョン: 0.11.0 (インストール手順は後述)

1. Kaggleのライブラリのバージョンを確認する

KaggleカーネルのCUDAや各ライブラリのバージョンを確認
https://www.kaggle.com/code/kohecchi/kaggle-latest-library-version/

2023/8/21時点では以下になっている模様。

CUDA
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Wed_Sep_21_10:33:58_PDT_2022
Cuda compilation tools, release 11.8, V11.8.89    → CUDAのバージョンは11.8
Build cuda_11.8.r11.8/compiler.31833905_0
python
Python 3.10.12
Library
"pandas==1.5.3",
"polars==0.18.6",
"matplotlib==3.7.2",
"seaborn==0.12.2",
"numpy==1.23.5",
"lightgbm==3.3.2",
"xgboost==1.7.6",
"catboost==1.2",
"scikit-learn==1.2.2",
"wandb==0.15.5",
"torch==2.0.0",
"torchvision==0.15.1",
"torchaudio==2.0.1",
"pytorch_lightning==2.0.4",
"transformers==4.30.2",

2. CUDAのインストール

(1) CUDA Toolkit

Terminal(rootユーザ)
sudo su #rootユーザに切替え

# Install NVIDIA Driver - 15分くらいかかる
# 適切な環境のものを https://developer.download.nvidia.com/compute/cuda/repos/ から確認する
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.0-1_all.deb
dpkg -i cuda-keyring_1.0-1_all.deb
apt-get update
apt-get -y install cuda-11-8

正しくインストールできたかを確認。

Terminal(rootユーザ)
/usr/local/cuda/bin/nvcc --version
実行結果
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Tue_Jul_11_02:20:44_PDT_2023
Cuda compilation tools, release 12.2, V12.2.128 ← バージョンが12.2であることを確認
Build cuda_12.2.r12.2/compiler.33053471_0

KaggleのCUDAのバージョンは11.8だったのですが、指定し忘れたので最新版のCUDA v12.2が入ってしまいました。 後続の作業に特段影響がなかったのでこのままにしていますが、厳密に揃えるのであれば apt-get -y install cuda-11-8 にしてください。
(2023/9/5訂正) CUDAのバージョンは、CUDNNやTorchのバージョンと揃える必要があるため、apt-get -y install cuda-11-8 を実行する。間違って apt-get -y install cuda を実行してv12.xがインストールされてしまった場合、CUDA-11とCUDA-12は並存しても問題ないようなので、追加で apt-get -y install cuda-11-8 をしてください。

nvidia-smi も確認して、エラーが出ていないことを確認するとよいです。

(2) CUDNNのインストール (2023/9/5追記)

CUDNNは、ディープニューラルネットワークの計算をGPU上で高速に行うためのライブラリです。
NVIDIAの公式サイトから、Downloadページにアクセスして、使用しているCUDAバージョン(11.8)に対応するCUDNNをダウンロードします。
ダウンロードにはメールアドレスの登録が必要になります。

ダウンロードしたら以下コマンドを実行します。CUDNN_VERSIONは環境に合わせて修正ください。

CUDNN_VERSION=8.9.3.28 #バージョンは修正してください
sudo dpkg -i cudnn-local-repo-ubuntu2204-${CUDNN_VERSION}_1.0-1_amd64.deb
sudo cp /var/cudnn-local-repo-ubuntu2204-${CUDNN_VERSION}/cudnn-local-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get install libcudnn8
sudo apt-get install libcudnn8-dev

公式のインストールガイドでは最後の2行は、sudo apt-get install libcudnn8=8.x.x.x-1+cudaX.Y とバージョンを指定するように書かれていますが、上記の方法では、E: Version ‘8.9.3.28-1+cuda12.2’ for ‘libcudnn8’ was not foundエラーになりました。フォーラムのアドバイスに従って、=以降の部分を省略したらうまくいきました。

3. rye のインストール

以後の作業は一般ユーザで進めます。

Terminal
project_name="project_name" #適宜変更する

# Install rye
curl -sSf https://rye-up.com/get | bash
echo 'source "$HOME/.rye/env"' >> ~/.bashrc
source "$HOME/.rye/env"

4. ryeプロジェクトの開始

Terminal
rye init $project_name && cd $project_name
rye sync
rye pin 3.11 # pythonのバージョンを指定

rye pin 3.11 だけでpythonをインストールできるのがryeの最大の魅力です。

なお、Kaggle環境でのpythonのバージョンは 3.10.12ですが、ryeでは指定できず、 3.10.11 または 3.11.x しか選べませんでした。

$ rye pin 3.10.12
error: unsupported/unknown version for this platform
$ rye pin 3.10
pinned 3.10.11 in /home/xxxx/.python-version
$ rye pin 3.11
pinned 3.11.3 in /home/xxxx/.python-version

5. ライブラリの追加

追加したいライブラリは rye add ライブラリ名 で追加できます。
細かいバージョン指定は後で pyproject.toml を直接編集する方が楽です。

rye add pandas

6. pytorchのインストール

pytorchのインストールには、indexの追加が必要です。pyproject.tomlに以下を追記します。

pyproject.toml
[[sources]]
name = "torch"
url = "https://download.pytorch.org/whl/cu118"
type = "index"
Terminal
rye add torch
rye add torchaudio
rye add torchvision

一旦、rye sync して、インストールと正しくcudaが使えるかを確認してもいいです。

rye run python # pythonを実行
import torch
print(torch.cuda.is_available()) # Trueが返ってくればOK

sourcesの部分の書き方は変わるので公式の説明を見た方がいいかもです。
https://rye-up.com/guide/pyproject/#toolryesources

7. pyproject.tomlの修正

#1で確認したKaggleのバージョンに合わせて、pyproject.toml の dependencies を変更していきます。

pyproject.toml

dependencies = [
    "mypy>=1.5.1", #VSCode用に追加
    "black>=23.7.0", #VSCode用に追加
    "pytest>=7.4.0", #VSCode用に追加
    "flake8>=5.0.4", #VSCode用に追加
    "isort>=5.12.0", #VSCode用に追加
    "pandas==1.5.3",
    "polars==0.18.6",
    "matplotlib==3.7.2",
    "seaborn==0.12.2", # Kaggleでは、0.11だが、ptitprince?との依存の都合により0.11に下げる
    "numpy==1.23.5",
    "lightgbm==4.0.0", # Kaggleでは3.3.2だが、4.0.0を使用(理由は以下参照)
    "xgboost==1.7.6",
    "catboost==1.2",
    "scikit-learn==1.2.2",
    "wandb==0.15.5",
    "torch==2.0.0",
    "torchvision==0.15.1",
    "torchaudio==2.0.1",
    "pytorch-lightning==2.0.4",
    "transformers==4.30.2",
    "timm==0.9.2",
    "japanize-matplotlib>=1.1.3",
    "ptitprince>=0.2.6",
    "adjustText>=0.8",
    "python-dotenv>=1.0.0",
    "ipykernel>=6.25.1",
    "pyarrow>=12.0.1",
]

8. 追加ライブラリの反映

rye syncコマンドを実行することで、これまで追加してきたライブラリが環境に反映されます。

rye sync

9. pythonの実行

構築した開発環境で、pythonコマンドを実行するには、venvをactivateします。

source .venv/bin/activate

環境を抜けるときは deactivate です。

エラーなく、ライブラリをimportできました。

$python
Cannot read termcap database;
using dumb terminal settings.
Python 3.11.3 (main, May  7 2023, 19:29:55) [Clang 16.0.3 ] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import xgboost 
>>>

うまくいかなかったこと

ryeによる開発環境構築はそこそこスムーズにいきましたが、以下2つだけはうまくインストールできませんでした。

LightGBM CUDA (v3.3.2)

rye add lightgbm でインストールしたLightGBMでは gpucuda がうまく使えず、以下のエラーになります。

コード(抜粋)
params = {
    (中略)
    'device': 'gpu',  # cpu, gpu, cuda
}
lgb.train(Config.params,(中略))
エラーメッセージ
[LightGBM] [Fatal] CUDA Tree Learner was not enabled in this build.
Please recompile with CMake option -DUSE_CUDAP=1

KaggleではGPU対応のLGBM v3.3.2 がインストールされています。
Kaggle-pythonのDocker imageと同じやり方でインストールを試みましたが、うまくryeプロジェクト内で使うことができませんでした。
https://github.com/Kaggle/docker-python/blob/91118646a80183bf5ac2ebb8c53e728c4a69ecbf/packages/lightgbm.Dockerfile#L16-24

LGBM CUDA version (4.0.0)

LGBM v4.0.0ではGPU対応版のインストールが簡単になったそうなので、Kaggleカーネルとのバージョンの差異が出てしまいますが、こちらを利用することにしました。これにより、'device':'gpu' はエラーにならずに動くようになりました。

一方、gpuよりも速い'device':'cuda'で動かすためのCUDA対応版は、pipからは以下の方法でインストールできるらしいのですが、ryeでconfig-settingsを指定する方法が分からず、断念。 'device':'gpu' は使えるので、一旦、よしとしました。

pip install lightgbm \
    --no-binary lightgbm \
    --no-cache lightgbm \
    --config-settings=cmake.define.USE_CUDA=ON

RAPIDS

RAPIDS のcudfもうまくインストールできませんでした。
torchと同じように、pyproject.tomlにsourcesを指定すればいけると思ったのですが、だめでした。

pyproject.toml
[project]
(中略)
dependencies = [
    "cudf-cu12>=23.8.0",
    "dask-cudf-cu12>=23.8.0",
    "cuml-cu12>=23.8.0",
    "cugraph-cu12>=23.8.0",
    "cuspatial-cu12>=23.8.1",
    "cuproj-cu12>=23.8.1",
    "cuxfilter-cu12>=23.8.2",
    "cucim>=23.6.0",
]
(中略)
[[sources]]
name = "cudf"
url = "https://pypi.nvidia.com"
type = "index"

rye syncを実行すると、以下のエラーメッセージが表示されます。

エラーメッセージ
$ rye sync
Reusing already existing virtualenv
Generating production lockfile: /home/Kohei/kaggle_icr/requirements.lock
    error: subprocess-exited-with-error
    
    × python setup.py egg_info did not run successfully.
    │ exit code: 1
    ╰─> [16 lines of output]
        Traceback (most recent call last):
          File "<string>", line 2, in <module>
          File "<pip-setuptools-caller>", line 34, in <module>
          File "/tmp/pip-resolve-fa9e1_so/cudf-cu12_8b428d68bde94c38a321f490d3ded143/setup.py", line 137, in <module>
            raise RuntimeError(open("ERROR.txt", "r").read())
        RuntimeError:
        ###########################################################################################
        The package you are trying to install is only a placeholder project on PyPI.org repository.
        This package is hosted on NVIDIA Python Package Index.
        
        This package can be installed as:
        ```
        $ pip install --extra-index-url https://pypi.nvidia.com cudf-cu12
        ```
        ###########################################################################################
        
        [end of output]

pip以外からのインストールは受け付けていないのかもしれません。

(Tips) よく見かけるエラーと解決策

rye sync をしたときに以下のようなエラーが表示されることがあります。
原因は、各ライブラリのdependencyのconflictです。
以下の例は、seabornの0.12.2だとdependencyがconflictするので、書かれている通り、0.11に切り替えると解消できます。

ERROR: Cannot install -r /tmp/.tmpMVB71J (line 1), -r /tmp/.tmpMVB71J (line 20) 
and seaborn>=0.12.2 because these package versions have conflicting dependencies.
(中略)
raise ResolutionImpossible(self.state.backtrack_causes) pip._vendor.resolvelib.resolvers.ResolutionImpossible: 
[RequirementInformation(requirement=SpecifierRequirement('seaborn>=0.12.2'), parent=None),
RequirementInformation(requirement=SpecifierRequirement('seaborn>=0.12.2'), parent=EditableCandidate('file:///.')),
RequirementInformation(requirement=SpecifierRequirement('seaborn==0.11'), parent=LinkCandidate('https://files.pythonhosted.org/packages/dc/95/c3b9e3883f4ac06566a042db282167f5da14491fccaac538f8805612a62e/ptitprince-0.2.6-py3-none-any.whl (from https://pypi.org/simple/ptitprince/)'))]

参考記事

ryeの基本操作については、以下の記事が分かりやすかったです。
https://zenn.dev/watany/articles/f69db9e33d4427
https://nsakki55.hatenablog.com/entry/2023/05/29/013658

Discussion