Google Cloud Platform の Compute Engine で GPU 環境を構築して TensorFlow を動作させる

# この記事について

Google Cloud Platform (GCP) に GPU 環境を用意して
tensorflow-gpu で自前のモデルをトレーニングしたときの記録になります。

# 環境

#### ローカル

- OS : Microsoft Windows (10.0.18362.295, 64 bit)

#### VM インスタンス

- 名前 : instance-2
- ゾーン : asia-east1-c
- コア : vCPU x 8
- メモリ : 32 GB
- GPU : NVIDIA Tesla V100 (https://cloud.google.com/compute/docs/gpus/?hl=ja)
- OS : Ubuntu (18.04 LTS)
- フレームワーク : tensorflow-gpu (1.13.1)

# 手順

######1. GCP へ登録する

→https://cloud.google.com/docs/overview/?hl=ja

######2. GCP のコンソールでプロジェクトを作成する

→https://console.cloud.google.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370111/a23e9f46-725a-c0dd-30c5-965f7c7a2c98.png)

######3. GCP のコンソールで VM インスタンスを作成する

→https://console.cloud.google.com/compute/instances

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370111/ecb393f2-a698-bf9c-a278-d74d3d2e75ff.png)

######4. Cloud SDK をローカルにインストールする

→https://cloud.google.com/sdk/downloads?hl=JA

######5. VM インスタンスを起動する

コンソールから「起動」を選択しますが、起動に失敗し次のエラーメッセージが表示される場合があります。

> The zone 'projects/tensile-topic-252919/zones/asia-east1-c' does not have
> enough resources available to fulfill the request.
> Try a different zone, or try again later.

リクエストを満たすために必要なデータセンタ内の GPU 等の資源が不足している状態です。
どうすることもできないので、必要な資源が利用可能になるのを待つしかありません。
また、次のメッセージが表示された場合割り当てを変更する必要があります。

> Quota 'GPUS_ALL_REGIONS' exceeded. Limit: 0.0 globally.

→https://console.cloud.google.com/iam-admin/quotas

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370111/7fcd9407-c55b-cb11-a661-6f851e98eb88.png)

「割り当てを編集」から増加リクエストを送信します。
上記のグローバル Quota のほか、GPU の場合は種類ごとにどのリージョンでいくつまで使用できるかという
個別の Quota もありますのでそれぞれ適切に設定する必要があります。
GCP のスタッフによってリクエストが承認されると上限が変更されます。

######6. ローカルホストから VM インスタンスへ接続する

gcloud コマンドでインスタンスに ssh で接続します。
認証情報は `gcloud init` を実行すると確認され、ローカルに保存されますので
それが使用されます。

```
C:\WINDOWS\system32>gcloud compute ssh "instance-2"
No zone specified. Using zone [asia-east1-c] for instance: [instance-2].
```

######7. NVIDIA ドライバをインストールする

→https://www.tensorflow.org/install/gpu

```bash:install-nvidia-driver.sh
# NVIDIA パッケージのリポジトリを追加する
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
sudo apt-get update
wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
sudo apt install ./nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
sudo apt-get update

# NVIDIA ドライバをインストールする
sudo apt-get install --no-install-recommends nvidia-driver-410

# インスタンスを再起動
sudo reboot
```

######8. GPU デバイスを確認する

```
chanmori@instance-2:~$ nvidia-smi
Sat Sep 14 19:00:17 2019
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 430.26       Driver Version: 430.26       CUDA Version: 10.2     |
|-------------------------------+----------------------+----------------------+
| 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 V100-SXM2...  Off  | 00000000:00:04.0 Off |                    0 |
| N/A   55C    P0   264W / 300W |   9017MiB / 16160MiB |    100%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0     30510      C   python                                      9007MiB |
+-----------------------------------------------------------------------------+
```

######9. cuDNN をインストールする

```
sudo apt-get install --no-install-recommends cuda-10-0 libcudnn7=7.6.0.64-1+cuda10.0 libcudnn7-dev=7.6.0.64-1+cuda10.0
```

######10. Anaconda をインストールする

```
sudo apt-get install python3
wget https://repo.anaconda.com/archive/Anaconda3-2019.07-Linux-x86_64.sh
sudo bash ./Anaconda3-2019.07-Linux-x86_64.sh
conda init bash
source ~/.bashrc
conda create -n tensorflow python=3.5
conda activate tensorflow
```

######11. tensorflow-gpu をインストールする

```
pip install tensorflow-gpu==1.13.1
```

######12. その他必要なライブラリをインストールする

```
pip install opencv-python
```

numpy で次のエラーが出る場合ダウングレードすると、とりあえずは回避できます

> ValueError: Object arrays cannot be loaded when allow_pickle=False

```
pip uninstall numpy
pip install numpy==1.16.2
```

######13. tensorflow-gpu の import を確認する

```
(base) chanmori@instance-2:~$ conda activate tensorflow
(tensorflow) chanmori@instance-2:~$ python
Python 3.5.6 |Anaconda, Inc.| (default, Aug 26 2018, 21:41:56)
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow
>>>
```

もし他のバージョンの tensorflow-gpu を使用してエラーが出る場合は
tensorflow-gpu のバージョンと CUDA のバージョンのかみ合わせが悪いことが考えられます。
以下のテスト済みビルドのページが参考になります。

→https://www.tensorflow.org/install/source

######14. Web サーバを構築する

Web サーバを構築しておくと何かと便利です。

```bash
sudo ufw allow 80
sudo apt-get install apache2
```

Apache HTTP Server だと既定のドキュメントルートは`/var/www/html/`です。

インスタンスの設定で「HTTP トラフィックを許可する」をチェックしていない場合は
一度インスタンスを停止してファイアウォール ルールを追加するか、上記項目にチェックを入れます。

######15. tensorboard を使用する

tensorboard を利用する場合 VPC ネットワークにファイアウォールルールを追加する必要があります。
コンソールから「VPC ネットワーク」→「ファイアウォール ルール」を選択します。

```bash
sudo ufw allow 6006
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370111/97b93e59-d886-78a6-c63f-0b5f7d14c385.png)

######16. 利用料金を確認する

コンソールの「お支払い」→「料金の履歴」を確認します。
GPU のご利用は計画的に。