ryeでKaggleとほぼ同じML開発環境を構築してみた
修正履歴
- 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や各ライブラリのバージョンを確認
2023/8/21時点では以下になっている模様。
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 3.10.12
"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
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
正しくインストールできたかを確認。
/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 のインストール
以後の作業は一般ユーザで進めます。
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プロジェクトの開始
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に以下を追記します。
[[sources]]
name = "torch"
url = "https://download.pytorch.org/whl/cu118"
type = "index"
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の部分の書き方は変わるので公式の説明を見た方がいいかもです。
7. pyproject.tomlの修正
#1で確認したKaggleのバージョンに合わせて、pyproject.toml の dependencies を変更していきます。
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では gpu
と cuda
がうまく使えず、以下のエラーになります。
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プロジェクト内で使うことができませんでした。
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を指定すればいけると思ったのですが、だめでした。
[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の基本操作については、以下の記事が分かりやすかったです。
Discussion