GCPでKaggleのPython Docker(GPU版)を立ち上げてみた。
(参考記事:GCPとDockerでKaggle用計算環境構築 )
GCPインスタンスの立ち上げ
GCPとDockerでKaggle用計算環境構築
https://qiita.com/lain21/items/a33a39d465cd08b662f1
を参考にインスタンスを立ち上げ
gcloudの設定
GCP上のインスタンスにはGCPが用意しているブラウザベースのターミナルからも接続できるが、手元の環境から接続するのにgcloudが便利。
# 初期設定
gcloud auth login
exec -l $SHELL
gcloud init
# 設定情報確認
gcloud config list
# インスタンスへの接続(リージョンなど、デフォルトの設定がなければ対話的に聞かれる)
gcloud compute ssh {インスタンス名}
KaggleのDocker
KaggleのDockerは以下のリンクにある
https://github.com/Kaggle/docker-python
インストールガイドを読むと、CPU版はGoogle Container Registoryにあるが、GPU版はまだないとのこと。一度CPU版を設定してから、gpu.Dockerfileで再設定を行うようになっている。
# githubからクローン
git clone git@github.com:Kaggle/docker-python.git
cd docker-python
# --gpuオプションでビルド
./build --gpu
#GCPに保存
docker tag {docker image name to be tagged} {gcp project}/{docker image name}
docker push gcr.io/{gcp project}/{docker image name}
gpu.Dockerfileではtensorflowやpytorchなどをインストールし直している。
Xgboostは動くが、このビルドではlightgbmは動かないので、動かすには再設定が必要。
githubのssh設定等々を毎回やるのは面倒なので、インスタンス停止時にディスクは破棄しないように設定する方がいい。
(GCPの設定項目)
インスタンスを削除したときの動作
→「ディスクを維持」に変更
インスタンス停止時の維持費はディスク100GBで一ヶ月4ドル
Standard provisioned space | $0.040
(https://cloud.google.com/compute/disks-image-pricing?hl=ja)
立ち上げ
このままだとcuda関係のライブラリでエラーが出るので環境変数の設定が必要
https://github.com/Kaggle/docker-python/issues/361
echo $LD_LIBRARY_PATH
/usr/local/nvidia/lib64:/usr/local/cuda/lib64:/usr/local/cuda/lib64/stubs
これだとダメなので
export LD_LIBRARY_PATH=/usr/local/cuda/lib64
が必要。毎回やるのは面倒なので
# コンテナ作成
docker run --runtime=nvidia --name kaggle_mod kaggle/python-gpu-build /bin/bash
# コンテナ内で設定
export LD_LIBRARY_PATH=/usr/local/cuda/lib64
# コンテナ外から止めてコミット
docker stop kaggle_mode
docker commit kaggle_mod kaggle/python-gpu-build:ld-library-path-mod
としてみるが、もう一回入ると
docker run --runtime=nvidia --name kaggle/python-gpu-build:ld-library-path-mod
echo $LD_LIBRARY?PATH
=>/usr/local/nvidia/lib64:/usr/local/cuda/lib64:/usr/local/cuda/lib64/stubs
と戻ってしまう。環境変数は上書きできないので、コンテナ作成時にオプションで渡す(本当はDockerfileでENV内で設定してビルドし直すべき)。
# -eオプションでLD_LIBRARY?PATHを上書きして作成
docker run --runtime=nvidia -e LD_LIBRARY_PATH=/usr/local/cuda/lib64 -v $PWD:/home/{user_name}/project -w=/home/{user_name}/project -p 8888:8888 --rm -it
kaggle/python-gpu-build jupyter notebook --no-browser --ip="0.0.0.0" --notebook-dir=/home/{user_name} --allow-root
GPUを使ってみる
GPUが見つかるか確認
# tensorflow
import tensorflow as tf
tf.contrib.eager.num_gpus()
# pytorch
import torch
torch.cuda.get_device_name(device=0)
XGboostを試す
from xgboost import XGBClassifier
clf = XGBClassifier(
n_estimators=1000,
max_depth=9,
learning_rate=0.05,
subsample=0.9,
colsample_bytree=0.9,
missing=-999,
n_jobs=-1,
random_state=42,
tree_method="gpu_hist")
clf.fit(X_resampled,y_resampled)
nvidia-smiでGPUの状態を見れる
# リアルタイムにGPUの状態を監視
watch -n1 "nvidia-smi"
Every 1.0s: nvidia-smi machine-learning-vm: Mon Aug 12 02:47:11 2019
Mon Aug 12 02:47:11 2019
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.104 Driver Version: 410.104 CUDA Version: 10.0 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 Tesla P100-PCIE... Off | 00000000:00:04.0 Off | 0 |
| N/A 46C P0 88W / 250W | 2833MiB / 16280MiB | 100% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 0 9329 C /opt/conda/bin/python 2823MiB |
+-----------------------------------------------------------------------------+