クラウドを用いたMLトレーニング環境の構築（GPU使用）

### この記事を読んでできるようになること
 - GCP上に、グラボが積まれたインスタンスを立てられるようになる

### GCP、クラウドを利用する利点：グラボを利用できる（単刀直入）
 - ローカルmacの数10倍の速度、メモリ容量も大幅に増すので、基本的に、画像分析などメモリ使用量が肥大化しがちなMLトレーニング時は必要
 - ローカルで動作させる場合は、訓練後のmodelをローカルにダウンロードし使用する形が綺麗
 - 最新のグラボを活用でき、高速な処理が可能 ※記載当時は NVIDIA tesla A100

### 以降、以下3見出しで解説を行います。
 - ワークベンチ画面
 - マネージドノートブックの作成画面 (ワークベンチ画面から遷移)
 - JUPYTERLAB (ワークベンチ画面から遷移)

## ワークベンチ画面 

https://console.cloud.google.com/vertex-ai/workbench

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206781/11e6963a-3a4b-6cbd-da78-9f0f0bb89968.png)

**↑**
- <span style="color:#d70910;">赤枠内</span>、今回使うのはワークベンチタグのみ
- <span style="color:#098117;"> 緑枠内</span>の操作ボタンでそれぞれのインスタンスの状態管理を行える
 - 新しいノートブック　ボタンクリックで、次画面の[マネージドノートブックの作成画面]に遷移
- <span style="color:#1453c6;">青枠内</span>JUPYTERLABを開くボタンをクリックしJUPYTERLAB画面へ遷移する(10 〜 30秒程度で遷移)
 - ここに立ち上げているインスタンスが表示される、ここでインスタンスを選択し、停止すると課金額はほぼかからない

## マネージドノートブックの作成画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206781/c0874927-3225-4304-807d-db227111743e.png)

**↑**
- <span style="color:#d70910;">赤枠内</span>はGPUの操作を行う場合は、有効なタイプ選択が必要
- <span style="color:#098117;"> 緑枠内</span>の自動シャットダウン機能は便利なので、推奨（グラボはかなり金額コストが嵩むので...）

 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206781/0840b377-33d9-1384-582c-c264dda8e9b5.png)

**↑**
 - <span style="color:#d70910;">赤枠内</span>カスタムドッカーイメージをGCPにあらかじめアップロードしておくことで、予めプリインストールされたイメージ以外を使用することができる
 - 例えばOpenCVなどはtensorflow2のイメージにはないので、自分でtensorflow2とopencvをセットアップしたイメージを作成するなど可能
  -  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206781/119fd841-a181-c28b-aed2-7eef0f0388af.png)

**↑**
- <span style="color:#1453c6;">青枠内</span>について、後述でダウンロード、アップロード操作を可能にするチェックボックス
- ターミナル機能もbatch操作などをする場合有用


## JUPYTERLAB

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206781/4b3dfd15-2c48-c73f-db14-b83c30bfcf42.png)


**↑**
- <span style="color:#d70910;">赤枠内</span>のプラスボタンを押下で、dockerImageを選択
 - 予め用意されたdockerImageを選択可能
 - 今回はtensorFlow2を選択。このため、notebook内で改めてpip install tensorflowのような実行は必要ない。
 - これでタブが追加され、notebookが開始可能となる
 - 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206781/e91194c2-e4fa-01cd-6aca-e63077663f88.png)


**↑**
- terminal実行も可能、
 - 例えば、sshキーを格納し、gitのpull pushコマンドの実行も可能
  - コマンド例 eval `ssh-agent`
  - コマンド例 ssh-add ~/.ssh/<キー名>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206781/df125403-5e7f-11f0-f25f-1c04b603616c.png)


**↑**
- <span style="color:#098117;"> 緑枠内</span>インスタンス上のディレクトリに直接ダウンロード、アップロード処理が可能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206781/85061208-1533-ed65-bd1a-c246ef0328a2.png)


**↑**
- <span style="color:#d70910;">赤枠内</span>のボタン押下でグラボの使用状況を確認可能
 - せっかくクラウドリソースを使っているのに、ここが0%では意味がなくなるので、プログラム実行時にここの％を要チェック 


### tips
- マネージドインスタンスは、操作がないと自動で落としてくれる機能が付与されているので、お手軽

### 落とし穴
 - gitのpullをした場合、毎回jupyter notebookのタブとコンテナはキルした方がいい、pullによりファイルのoverwriteが必要になった場合など、時間が想像以上にかかってしまっていた。
 - git pullした場合に、ノートブック上に同じ内容が2回重複して記載されるバグがあるので、notebook形式のファイルではなく、.py形式でgith上は管理した方が色々と安全で比較的管理はしやすい

### 費用
使用したインスタンスタイプは[ a2-highgpu-1g ]
最も安いタイプだが、 速度的にも大きな問題なく使用できた。
トレーニング時のみの使用のため、平日1/2回 1日あたり6時間程度であると
以下のような金額になった。
上記使用量であれば、多少の変動を加味しても月10万は行かない可能性が高い
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206781/d98f6649-1e2e-044c-34f3-cb3e2de29feb.png)