思考の本棚

機械学習のことや読んだ本の感想を整理するところ

GCPとdockerによるkaggle環境の構築手順

はじめに

画像データを扱うkaggleコンペに参加しようと思い、クラウドGPU環境を構築しようと考えて以下のサイトを見つけました。

qiita.com

非常に丁寧で分かりやすい記事で参考にさせていただいたのですが、いくつかつまずくポイントもあったため、記録として残しておこうと思います。 今回はGCPGoogle Cloud Pratform)上でdockerとkaggleAPIを用いて行うkaggle環境の構築手順についてまとめたいと思います。

GCEインスタンスの作成

まずはクラウド上にインスタンスを作成します。この手順は非常に簡単です。

GCPの公式サイトにログイン(登録が済んでいない方はサインイン)します。 console.cloud.google.com

次にGPUの割り当て設定を確認します。 ナビゲーションメニュー → 「IAMと管理」 → 「割り当て」を選択し、指標のところでGPUs(all regions)を選択する f:id:kutohonn:20200301161905p:plain この時一番右側に表示される上限の値が使えるGPU数を示しています。 何も設定していない段階ではおそらく0になっているためCompute Engine API GPUs(all regions)の項目にチェックを入れ「割り当ての編集」を選択し,手順に従って割り当て数を1以上に変更します。これでGPUをGCEインスタンス上に加えることが可能になります。

ナビゲーションメニュー → Marketplace → 「deep learning VM」という環境を選択しLAUNCHボタンをクリック
すると以下の画面が出てきます。 f:id:kutohonn:20200301165111p:plain Deployment name: 任意の環境名
Zone: 特に変更なし
Machine type: CPUの数とメモリをカスタマイズする。
この時カスタマイズをするとGPUs aren’t available for the selected Machine Type という警告が出る場合があります。GPUと選択できるMachine typeには制限があるようなので、もし選択したMachine typeがGPUを利用できない場合はそれに近い別のものを選択する必要があります。今回はvCPU×4 メモリ26GBのものを選択しました。
GPUs: 使いたいGPUを選択
Framework: 今回はdockerで環境を作るためフレームワークのインストールは不要です。そこでIntel(R)のCUDA10.1のものを選択することにします。
GPU: 両方にチェック
Boot disk: 特に変更なし
Networking: 特に変更なし
設定が終わったら「デプロイ」をクリック

f:id:kutohonn:20200301171650p:plain

デプロイされていればGCEインスタンスの作成は完了です。 私の場合、警告が表示されていますが、そのまま続行しました。今のところ問題は起きていませんがもし解決方法がわかる方がいらっしゃればご教授いただけると幸いです。

gcloudのインストール

qiita.com この記事に従ってgcloudコマンドをインストールするとローカルのターミナルから作成したインスタンスに簡単にssh接続できるようになります。
(gcloudを入れなくてもブラウザ上のターミナルから作成したインスタンスに接続することはできます。その方法については他記事を参照ください。)

インスタンスssh接続

ナビゲーションメニュー → Compute Engine → 「VMインスタンス」で先ほど作成したインスタンスを開始 f:id:kutohonn:20200301173530p:plain

インスタンスが開始したらssh → gcloudコマンドを表示を選択 f:id:kutohonn:20200301174037p:plain

出てきたポップアップのscriptをローカルのターミナルにコピペして実行しパスワードを入力することでインスタンス内に接続することができます。

dockerによる環境構築

次にdockerによる環境構築を行なっていきます。 まずは接続したディレクトリでDockerfileとrequirements.txtを作成します。 以下をインスタンス内に入ったターミナルで実行します。

$ touch Dockerfile
$ touch requirements.txt

Dockerfileは環境構築のための仕様書のようなもので、requirements.txtにはインストールするモジュールを記載します。 vimがデフォルトで入っているのでvimを用いて以下のようにDockerfileとrequirements.txtをターミナル上で書きます。内容は冒頭で紹介した記事を参考にしています。

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

# set working directory
WORKDIR /root/user

# config and clean up
RUN ldconfig \
&& apt-get clean \
&& apt-get autoremove

requirements.txt

pip==20.0.2
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.5.6
torch==1.4.0
torchvision==0.5.0

今回はフレームワークにPyTorchを選択しています。 PyTorchとCUDAの対応バージョンが一致していないと環境構築でつまずきます。 今回はインスタンスの作成時にCUDA 10.1をインストールしたのでそれに対応するバージョンのPyTorchモジュール(torch, torchvision)をインストールします。

今いるディレクトリ内にここで作成した2つのファイルが存在していればOKです。 ではDockerfileに従ってdockerイメージをbuildします。イメージ名は任意の名前をつけることができます。

$ docker build ./ -t {イメージ名}

上記のスクリプトを実行するとbuildが始まります。完了にはしばらくかかります。 終了時にSuccessfully built ~とかかれていればdockerイメージのbuildは成功です。

ではprojectというフォルダを作成しその後イメージからコンテナを作成します。 コードの意味については冒頭の記事を参照ください。

$ mkdir project
$ docker run --runtime=nvidia -p 8888:8888 -d -v ~/project:/root/user/project --name {コンテナ名} {イメージ名} /sbin/init

上記で任意の名前のコンテナができたので下記のスクリプトでコンテナ内に入ります。

$ docker exec -it {コンテナ名} /bin/bash

これでdockerの設定はおしまいです。コンテナを抜けたいときはexitを入力するとコンテナを抜けれます。 またコンテナに入り直したいときは dicker exec~ を再び実行すれば同じコンテナに入ることができます。

Kaggle APIの導入

kaggle APIを利用してデータセットをターミナル上で取得することが可能です。
ただしkaggle APIの導入作業をする必要があります。

まずkaggleの公式サイトからMy accountに移動します。APIという項目の部分のCreate New API Tokenというボタンをクリックするとkaggle.jsonというファイルがダウンロードされます。 f:id:kutohonn:20200301191739p:plain このファイルの中身をコピーしておきます。

次にインスタンスと接続しているターミナルからコンテナ内に入ります。 root直下に.kaggleというフォルダが既に作成されていると思うので

$ touch ~/.kaggle/kaggle.json

を実行しkaggle.jsonという空のファイルを作成します。 この空のファイルにさきほどダウンロードしコピーしたものを貼り付けます。vimとかでターミナル上で開いてコピペするのが早いと思います。 その後以下のコマンドを入力し実行権限を付与します。

$ chmod 600 ~/.kaggle/kaggle.json

この設定をすることでdocker内でkaggleコマンドが使えるようになります。
kaggleコマンドを用いることでデータセットのダウンロードを簡単にできます。

以下使いそうなコマンドをメモしておきます。

特定のコンペのデータをダウンロード

$  kaggle competitions download -c [コンペ名]

特定のkeywordでdatasetを検索

$ kaggle datasets list -s [KEYWORD]

データセットをダウンロード

$ kaggle datasets download -d [DATASET_NAME]

ダウンロードされたデータセットはzipファイルになっているので解凍します。 zip, unzipコマンドのインストール

$ sudo apt-get install zip unzip

zipファイルの解凍

$ unzip {zipファイル名}

Jupyter Notebookの設定

jupyterを起動するにはインスタンス内でコンテナに入った状態で以下を実行します。

$ jupyter notebook --ip=0.0.0.0 --allow-root

すると~ token= ~と書かれた文が出力されると思うので,tokenをコピーしておきます。

その後インスタンスに入っていないローカルのターミナルを開き以下を実行します。

$ gcloud compute ssh "{インスタンス名}" -- -N -f -L 7777:localhost:8888

その後localhost:7777をURLとしてブラウザに入力するとパスワードもしくはtokenが求められるので、先程のtokenを入力すると jupyterへの接続が完了します。

以上で環境構築は終了です。

おわりに

web上でGCPでの環境構築に関する有益な記事は存在しているものの、つまずきポイントが多かったので自分なりにまとめてみました。 環境構築に関してはdockerを使わない方法も試してみたんですけど、結果的にはdockerを用いての環境構築の方がいろいろと楽な気がしました。