kaggleに取り組む時、マシンのパワーが足りないと感じることがあります。そういった時は、GoogleのクラウドコンピューティングであるGCP、もしくはアマゾンのクラウドコンピューティングのAWSで機械学習環境を構築し、jupyter notebookを走らせましょう。
こんな方におすすめ
- GCPで機械学習の環境を一瞬で終わらせたい人
- GCPでGPUを使ったディープラーニングを行いたい人
- 環境構築でハマりたくない人
環境構築はハマります。ですので、以下のコードをそのままはりつけるだけでjupyter notebookが走るようにします。
Dockerfileを使う方法、Docker-composeを使う方法をご紹介いたします。
Google Cloud PlatformのMarketplaceから"Deep Learning VM"と検索して1番上に出てくるイメージをクリックしてください。
その次に、「運用開始」というボタンをクリックします。
赤で囲ったところが大事な設定箇所です。
Deployment nameは任意の名前をつけてください。
Zoneはus-west1-bがいいでしょう。
Machine typeは"2"を選びます。
GPUの数ですが、これは初回は利用申請をしないといけません。誘導に従って利用申請をすればGPUを使い始めることができます。まずはGPU1つから、GPUのタイプはNVIDIA Tesla K80としてください。
Frameworkはここの設定に合わせてください。(CUDAの数字を変えるとうまく動かなくなります。)
その下の"Install NVIDIA GPU driver automatically on first startup?"のところはチェックをつけてください。
あとは右の料金を確認して先に進みます。
毎日連続稼働すると1ヶ月3万円くらいです。こまめにマシンを停止すれば、1ヶ月数千円で済むと思います。
ここまでできたら、インスタンスの起動を確認して、ssh接続をします。
configファイル などで設定をしていなければ、以下のコマンドでssh接続できます。
ssh username@ipアドレス -i 秘密鍵のpath
(例:ssh sample_user@58.887.647.32 -i ~/.ssh/id_rsa)
usernameとipアドレス(外部IPアドレスのことです)は任意の値に変えてください。
ここから環境構築に入っていきますが、まずその大まかな流れを確認します。
- Dockerfileを作成する
- 作成したDockerfileを元にdocker buildしてdockerイメージを作る
- docker runでコンテナを起動する
- docker execコマンドでコンテナ内に入る
まずはDockerfileからです。
Dockerfileとはベースイメージ、イメージに含めるファイル 、コンテナ起動直後に実行されるコマンドを記述した説明書きのことを指します。
FROM wordpress:latest
RUN (コマンド)
ADD ./project /project
基本構成としては上記のようになっています。
FROMの後に続けて書くのがベースイメージです。
RUNでビルド時に実行するコマンドを記述します。
ADDは、コンテナのファイルシステムへファイルを追加することを記述します。
今回は以下のDockerfileをコピペして、ホームディレクトリに置いてください。
FROM nvidia/cuda:10.0-cudnn7-devel-ubuntu16.04
# install basic dependencies
RUN apt-get update && apt-get upgrade -y && apt-get install -y --no-install-recommends \
sudo git wget cmake nano vim gcc g++ build-essential ca-certificates software-properties-common \
&& rm -rf /var/lib/apt/lists/*
# install python
RUN add-apt-repository ppa:deadsnakes/ppa \
&& apt-get update \
&& apt-get install -y python3.6 \
&& wget -O ./get-pip.py https://bootstrap.pypa.io/get-pip.py \
&& python3.6 ./get-pip.py \
&& ln -s /usr/bin/python3.6 /usr/local/bin/python3 \
&& ln -s /usr/bin/python3.6 /usr/local/bin/python
# install common python packages
ADD ./requirements.txt /tmp
RUN pip install pip setuptools -U && pip install -r /tmp/requirements.txt
# install pytorch
RUN pip install https://download.pytorch.org/whl/cu100/torch-1.0.0-cp36-cp36m-linux_x86_64.whl \
torchvision
# set working directory
WORKDIR /root/user
# config and clean up
RUN ldconfig \
&& apt-get clean \
&& apt-get autoremove
次に同じ階層(ホームディレクトリ)にrequirements.txtを作成します。
pip==18.1
setuptools==39.1.0
wheel==0.30.0
jupyter==1.0.0
matplotlib==2.2.2
seaborn==0.8.1
scikit_learn==0.20.0
scipy==1.1.0
numpy==1.15.2
pandas==0.23.4
gensim==3.6.0
kaggle==1.4.7.1
ここまで書けたら次のコマンドでdockerをビルドします。
docker build ./ -t kaggle1
最後のkaggle1については、任意の文字列で構いません。実行後、docker imagesコマンドでビルドが成功しているかを確認します。
docker images
ここまででイメージを作成しました。このイメージをもとにコンテナを作成します。
docker runコマンドを押します。
docker run --runtime=nvidia -p 8888:8888 -d -v ~/project:/root/user/project --name sample kaggle1 /sbin/init
--runtimeでGPUとしてnvidiaを指定しています。
-pはポートを指定しています。書き方が少しややこしいのですが、左の8888がクラウドコンピューター本体(インスタンス)のポート、右の8888がコンテナのポートを表しています。インスタンスを表す左のポート番号は8888ですので、ファイヤーウォール設定で8888番ポートを必ず開けてください!
-dはデタッチドモードを表します。バックグラウンドで動かすということです。
-vはdocker-compose.ymlだとvolumesに当たるところで、インスタンス本体とdocker内のファイル データをやり取りする仕組みを表しています。左がインスタンス本体、右がdocker内を表します。これを書かないと、docker内で保存したデータを永続的に保存することができません。
--nameは任意の名前をつけます。
そして、この後jupyter notebookを作成していきます。
docker exec -it sample /bin/bash
cd project
jupyter notebook --ip=0.0.0.0 --allow-root
これで(インスタンスの外部IPアドレス):8888でjupyter notebookに接続ができるようになります。
補足)上記の方法でdockerを一度起動してしまえば、2回目からはdocker startコマンドで再起動するだけで大丈夫です。
docker start sample
sampleには前に"--name ~"で定義したNAMESの文字列を当てはめてください。
SSL化をする方法(https-portalを使う)
一応ここまででjupyter notebookに接続は可能となったのですが、SSL化ができていません。
SSL化まで終わらせてしまいます。
- 手順1:docker-composeをインストールする
- 手順2:nvidiaのdockerをインストールする
- 手順3:docker-composeファイル からコンテナをビルドする
ここまではDockerfileでイメージをビルドする方法を書いてきました。しかし、SSL化をするとなると、docker-composeで2つのコンテナを一気に立ち上げた方が早いです。
curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
chmod +xというのは、ファイルに実行権限を与える、ということです。(chmodはファイルの読み、書き、実行権限を変更するLinuxコマンド)
docker-compose -v
>docker-compose version 1.24.1, build 4667896b
とすれば、docker-composeのバージョンが分かります。この場合はバージョン1.24.1です。
次にnvidia-dockerを入れます。
$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
$ sudo apt-get update
$ sudo apt-get install -y nvidia-docker2
$ sudo pkill -SIGHUP dockerd
そして以下をコピペして、docker-compose.ymlとしてください。
version: '2.3'
services:
https-portal:
image: steveltn/https-portal:1
ports:
- '80:80'
- '443:443'
links:
- test
restart: always
environment:
STAGE: 'production'
DOMAINS: '独自ドメイン名 -> http://test:8888'
#FORCED_RENEW: 'true'
test:
runtime: nvidia
image: kaggle-0409:latest #dockerのimage名と合わせてください
ports:
- '8888'
volumes:
- '$PWD/project:/root/user/project'
command: /sbin/init
container_name: 'kaggle0409' #dockerのimage名と合わせてください
上記ファイルをDockerfileと同じ階層に置きます。そして以下のコマンドを叩きます。
docker-compose up -d
あとは先ほどと同じように以下のコマンドでdocker内部に入り、jupyter notebookを立ち上げます。
docker exec -it kaggle0409 /bin/bash
cd project
jupyter notebook --ip=0.0.0.0 --allow-root
無事SSLされていると思います。
*最後のところで、SSL化してjupyter notebookにログインはできたものの、カーネルがすぐに止まってしまう、というエラーが出てくることがあります。Google chromのデベロッパーツールで確認すると、"WebSocket connection to 'wss://~' failed :Error during WebSocket handshake: Unexpected response code: 400"といったエラーになるようです。これはhttps-portalの方のdocker内のnginxが悪さをしていると考えられます。
その時は、nginxの設定ファイル(/etc/nginx/nginx.conf)の中にある send_timeout , proxy_connect_timeout , proxy_read_timeout , proxy_send_timeout の値を600などに増やしてみてください。