GCPでGPU＋JupyterでDNN学習環境の構築  (CUDA8.0)

Google Cloud Platform (GCP)
https://cloud.google.com/?hl=ja

## はじめに
GCPでGPUありDeepLearning学習環境を構築し、
ローカルでJupterからGPUに接続をしたときの手順メモです。
GPUを使うための設定が少し面倒でした。

※注記

以下は Ubuntu14.04 + CUDA 8.0のインストール方法です。
CUDA 9.1バージョン向けは以下が参考になります。
https://qiita.com/yukoba/items/3692f1cb677b2383c983


## 前提条件
GCPの無料トライアルから<b>有料アカウント</b>に切換えが必要となります。
クレジットカードの登録が必要ですが、切換え時に300ドルのクレジットがつくので、GPUありで使用していてもしばらくの間はタダで使えます。
ただしGPUの請求個数は1個まで、それ以上は別請求されました。

## GPU割り当て申請
GCPのGoogle Compute Engine(GCE)もしくはDatalabでGPUを使うには、初回にGPU割り当て申請を行います。

* GCPのコンソール画面を開く

* メニュ⇒[IAMと管理]を開く

* メニューバーから[割り当て]を選択

* 指標フィルタの[なし]を選択してフィルタをクリアし、NVIDIA P100またはK80を選択。GPU割り当ての一覧が絞り込み表示される。
* リージョンを選択。以下ではasia-east1を選択し、割り当てを編集をクリック。

* 変更の部分に使用したいGPU数の上限を指定。ここでは「1個」と選択
* 電話番号と理由を記入して申請する。数分で承認のメールが届く。


## Google Cloud SDKのインストール

GCP上でCloud Datalabを実行すると、ローカルPCとの時間のかかるデータやり取りなしに、グラフィカルに結果を見ることができる。

* 右上のボタンから[Google Cloud Shell]を起動<br>

* 環境変数を作成

```
export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)"
```

* Cloud SDK の配布 URI をパッケージ ソースとして追加<br>

```
echo "deb http://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
```
* Google Cloud の公開鍵をインポート

```
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
```

* Cloud SDK を更新してインストール

```
sudo apt-get update && sudo apt-get install google-cloud-sdk
```

* Datalabのインストール

```
sudo apt-get install google-cloud-sdk-datalab
```

* gcloud初期化

```
gcloud init
```
1⇒1⇒yを選択

* インストールできたか確認<br>

```
gcloud components list
```

* プロジェクトリストを確認

```
gcloud projects list
```

詳細手順は以下を参照
https://cloud.google.com/sdk/downloads?hl=ja

## インスタンスを作成

* [VMインスタンス]でインスタンスを作成

* ゾーンを先ほどGPU割り当てを行ったゾーンに設定。こここでは[asia-east1-a]を指定。GPUがないゾーンもあるので注意。

* ブートディスクを指定。ここでは[Ubuntu 16.06 LTS]を指定。
* IDとAPIへのアクセスは[すべてのCloud APIに完全アクセス権を許可]を選択
* ファイアウォールの許可は両方ともチェックON
* [管理]を選択して詳細を表示し、プリエンプティブを[オン]に設定。これは必須ではないが低コストとなる
* VMインスタンスが作成される


## インスタンスにログイン

* GCPの右上のボタンから[Google Cloud Shell]を有効にする
* 以下コマンドで作成したインスタンスにログインする<br>
例えば、プロジェクトIDがthematic-mapper-190607、ゾーンがasia-east1-aでインスタンス名がinstance-1の場合は以下のようになる。

```
gcloud compute --project "thematic-mapper-190607" ssh --zone "asia-east1-a" "instance-1"
```

*** インスタンスを停止

```
$ gcloud compute instances stop instance-4 --zone asia-east1-a
```


## NVIDIAドライバインストール

事前にNVIDIA Develpperの登録を済ませて置く。
https://developer.nvidia.com/developer-program

* 古いドライバの削除
 
```
dpkg -l | grep nvidia
dpkg -l | grep cuda
sudo apt-get --purge remove nvidia-*
sudo apt-get --purge remove cuda-*
```

*  NVIDIAドライバーをインストール

```
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
apt-cache search 'nvidia-[0-9]+$'
sudo apt install nvidia-384
reboot
```

* CUDA 8.0を入れる

CUDA Toolkit Archive から CUDA Toolkit 8.0 をダウンロードする。install では cuda-8.0 を指定。

```
sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb
sudo apt-get update
sudo apt-get install cuda-8-0
```

* cuDNN Download から Download cuDNN v6.0 (April 27, 2017), for CUDA 8.0 をダウンロードする

```
tar xfvz cudnn-8.0-linux-x64-v6.0.tgz
sudo cp cuda/include/cudnn.h /usr/local/cuda-8.0/include/
sudo cp cuda/lib64/libcudnn* /usr/local/cuda-8.0/lib64/
sudo chmod a+r /usr/local/cuda-8.0/lib64/libcudnn*
```

* .bashrc でパスの設定を行う

```
export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"
```

## 必要ライブラリインストール

* Anaconda環境インストール

```
wget http://repo.continuum.io/archive/Anaconda3-4.0.0-Linux-x86_64.sh
bash Anaconda3-4.0.0-Linux-x86_64.sh
source ~/.bashrc
```

* Anacondaバージョン確認

```
conda -V
```

* 仮想環境作成

```
conda create -n py36 python=3.6
source activate py36
```

* cupyのインストール（必ずNVIDIAドライバの後に実行）

```
pip install cupy
```

* 必要ライブラリのインストール

chainerインストールの一例

```
pip install chainer
conda install -c https://conda.anaconda.org/menpo opencv3
pip install -U numpy
pip install matplotlib
pip install pillow
sudo apt-get install zip unzip
sudo apt-get -y install imagemagick
```
## データをGoogle Cloud Storageとやり取りする

ローカルPCとインスタンスとの間でデータのやり取りを行いたいときは、Google Cloud Storage経由で行う。

* メニューから[Storage]⇒[ブラウザ]を選択

* バケットがなければ作成。Multi-Regionalで場所はどこでもよい。

* バケットを選択するとファイル一覧が見られる。ファイル名をクリックするとダウンロード可能。

* ファイルをインスタンスからStorageへコピー

```
gsutil cp ./filepath gs://thematic-mapper-190607/download
```

* ファイルをStorageからインスタンスへコピー

```
gsutil cp gs://thematic-mapper-190607/filepath ~/download
```


# ローカルのJupyterでGCPに接続

以下を参考にしたらできました。
http://bfin.sakura.ne.jp/?p=923