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


この記事について

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

環境

ローカル

  • OS : Microsoft Windows (10.0.18362.295, 64 bit)

VM インスタンス

手順

1. GCP へ登録する

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

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

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

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

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

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

「割り当てを編集」から増加リクエストを送信します。
上記のグローバル 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

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 サーバを構築しておくと何かと便利です。

sudo ufw allow 80
sudo apt-get install apache2

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

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

15. tensorboard を使用する

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

sudo ufw allow 6006

16. 利用料金を確認する

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