Google Cloud Platform + GPU設定 備忘録

#概要
Google Cloud PlatformにGPU付きのTensorFlow環境を設定する手順を備忘録として残す。
- 実施期間: 2020年7月
- 環境：GCP
- Python3 + TF2.2.0
- GPU: NVIDIA Tesla T4

##背景
Google ColaboratoryのGPUを使わせていただきDNNモデルをいじくっているが、やはり無料ということもあって、連続でTraining させるにはつらいシーンもある。
GCPは初めの$300分まで無料利用できるので、どんな感じか試してみたのだが、GPUの割付に手間取った。それがこの備忘録を残す理由である。
GCPの手順書をくまなく読めば理解できるのであろうが、とても分かりづらく読む気が起きない。
いくつかサイトを見つけたが、基本がわかっていないせいなのか、その通りにやってもうまくいかない。

##ユーザ登録と最初のプロジェクト作成
まず、使っているOSがWin10の場合、デフォルトブラウザをIEからChromeに変更しておくこと。
GCPのサイトに行きユーザ登録する。$300を超過した分が自動的に徴収されるので、登録にはクレジットカードが必須。
自分のトップページから「新しいプロジェクト」を作成しておく（キャプチャをとった時点ではすでに"GPU-VM-test01"というプロジェクトを作成済み）。

![pict1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/123c3c3b-9c89-db9b-000f-5cd33ac3b68b.png)
詳細は忘れたがここまでは戸惑うところはなかった。

##GPUの申請
GCPはAWSと違いデフォルトでGPUはついていない。そのため以下の手順でGPUを申請する必要あり。
GCPの[手順書](https://cloud.google.com/compute/docs/gpus?hl=ja#restrictions)をよ～っく読むとそれらしいことが書いてあるが、よほど根気強くなければその手順書まで辿り着けないと思う。

「Compute Engine システムとユーザーを保護するため、新しいプロジェクトにはグローバル GPU 割り当てが設定されます。この割り当ては、サポート対象のすべてのゾーンで作成できる GPU の総数を制限するものです。**GPU 割り当てをリクエストするときは、各リージョンで作成する GPU モデルに対する割り当てに加え、すべてのゾーンにおけるすべてのタイプの GPU の総数に対するグローバル割り当てもリクエストする必要があります。**」

[IAMと管理]→[割り当て]を選択する。割り当て画面で「場所」に”asia-northeast1”と”グローバル”の2つを選択、「指標」に”GPUs (all regions)”、”NVIDIA T4 GPUs”の2つを選択する。
asia-northeast1(Tokyo)/2(Osaka)ではTesla T4しか選択できない。米国のどこかにするとGPU全種が選択可能となるが、大きなファイルのUploadがあるため近場を選択する。T4が一番安いし。
東京か大阪かは各位の住まいによる。

![pict2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/7b273024-c9b3-82da-d4f5-e670ec8a2449.png)

初期状態では、上図右端の「上限」はどちらも”0”となっている。左２つのチェックボックスにチェックを入れて「割り当てを編集」を押すと、「2件の割り当てを選択」ペインが現れる。

![pict3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/1d1759d4-06eb-ac93-eac1-b1ef10e48862.png)

左上図で名前とメアドはデフォルトのまま、電話番号（+81はなくてもOK）のみ記入し「次へ」を押す。
右上図で”GPUs (all regions)”と”NVIDIA T4 GPUs - asia-northeast1”にそれぞれ”1”と入力し、リクエストの説明を簡単に（例えば、”Need this for DNN training.”くらい）記入して「完了」→「リクエストを送信」を押す。
2営業日ほどで申請時のメアドに下記のような返信が来る。

![pict4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/1e8235c6-6f08-93af-8701-9f90f8d0e2bd.png)

このメールにもあるようにGPUは申請したプロジェクトに対し割り付けられる。
プロジェクト内で作成されるVMインスタンすべてでシェアすることが可能。
ここまでが今回キモであった前準備


##環境の作成
承認を待っている間、GCPを弄っていると3つくらいの方法がありそう。

1. VMインスタンスを作成し、そこにCUDAやTFやAnacondaを入れる。
2. Marketplaceにある設定済みVMからVMインスタンスを作成する。
3. ノートブック専用のVMインスタンスを作成する。

おいらの用途で使えるのは3のみ。
1,2はそもそも環境構築後、どのように使うかイメージできない。VMインスタンスの操作はローカルPCのCUIからだけで、それでTF開発はきつい。
VMインスタンスには外部IPアドレスが割り振られ、ゲートウェイを設定するとVMにインストールしたAnacondaのJupyterにローカルからアクセスできることは確認したが、GCPの手順通りにCUDAをインストールしても入ってくれず諦めた。たとえできたとしても、それって結局3のことだもの。

ノートブック用GPU付きVMインスタンスを作成する。
[AI Platform]→[ノートブック]を選択する。「新しいインスタンス」を押し、「TensorFlow 2.2」→「With 1 NVIDIA Tesla T4」を選択する。
TFのバージョンは所望のものを選択する。

![pict5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/95277433-e7c4-98fe-76d8-14aea653328d.png)

「新しいノートブック　インスタンス」画面でノートブック用VMインスタンスの設定を行う。
インスタンス名は適当に、「リージョン」にリクエストした時の”asia-northeast1 (Tokyo)”、「ゾーン」に” asia-northeast1-a”か、”…-c”を選択する。今現在”…-b”にはGPUが割り当たらない。
ML後進国の日本人にはGPUはそんなに必要ないのだろうと…

![pict6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/e208849b-8424-2403-852d-e33d415e1807.png)

2,3分待つとVMインスタンスが作成されるので一旦ホッとして、目的のGPUが割りついていることを確認し、”JUPYTERLABを開く”を押すとブラウザの別タブでJupyterが起動する。

![pict7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/a987151a-47d6-b79e-a567-79d8f574c27b.png)

##Jupyter動作確認
最初のセルでGPUが認識されているか確認する。

![pict8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/bfaa4f7b-255a-5e05-2b6a-a65851ecfc75.png)

```Python
import tensorflow as tf
print(tf.__version__)		        #2.2.0が表示されること
tf.config.list_physical_devices(‘GPU’)	#'/physical_device:GPU:0'的なことが表示されること
```

“File”から”Shut Down”を選択しブラウザのこのタブを閉じる。
VMインスタンスが停止するわけではないので、インスタンスが選択されている状態で「停止」を押す。
「停止」を押さなければずっと課金されるので注意。

![pict10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/72ce95bc-42ea-bb2e-81c0-0cc285a8626d.png)

以上