データ分析でマネージドノートブック使ってみたらエクゼキュータ機能が便利だったという話

#  データ分析でマネージドノートブック使ってみたらエクゼキュータ機能が便利だったという話

こんにちは、京セラコミュニケーションシステム 森田 (@kccs_kai-morita）です。

最近、データの分析にてGoogle Cloud Platform（以下GCP）の**Vertex AI Workbench**を使っています。

Vertex AI WorkbenchはJupyterLab環境としてデータの探索や分析、モデリングなどのデータサイエンス作業に向いており、マシンスペックも自由に変えることができる上GPUを使うこともできます。またマネージド環境の「マネージドノートブック」と「ユーザ管理のノートブック」がありますが、その違いはカスタマイズ性にあり環境を細かく設定したい場合はユーザ管理のノートブックがいいと思います[^1]。

私がデータ分析で使用しているのはマネージドノートブックです。注目したのは**エクゼキュータ機能**でした。この記事ではエクゼキュータ機能中心にマネージドノートブックの紹介をします。

:::note info

本記事は2022年12月ごろに作成しております。
:::

## この記事の対象者
* マネージドノートブックでデータ分析やAIの実験やってみようと思っている人
* 基本的なGCPの機能が扱えること

## マネージドノートブックの始め方
マネージドノートブックの開始方法についてざっくり記載します。前提としてGCPを自由に使える環境があることとします。

1. GCPコンソール>VertexAI>ワークベンチから上方のタブからマネージドノートブックを選択
2. 上部の＋新しいノートブックを選択
3. ノートブック名やリージョンを選択（一年前は選択できませんでしたが今は東京リージョンが使えました。）
4. 共同編集したい場合は「Service account」、一人で使う場合は「Single user only」を選択
5. 詳細設定を開きノートブック環境をいじる。

マネージドノートブックは裏でVMインスタンスを保持していないのでユーザ管理のノートブックと比較して起動にそこそこ時間がかかります。その分**起動していない間課金されない**メリットがあります。（重要！！）

ノートブック環境が起動状態になると「JUPYTERLABを開く」が有効になるので押すと以下のような画面が開き完了です。


![マネージドノートブック画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780555/de1601e2-94c0-d113-de81-30d03488bb26.png)<font color="DarkGray">_Vertex AI Workbench マネージドノートブック画面_</font>


以下設定について補足します。
### 権限について
共同編集する際はサービスアカウントを設定しますが、権限としては基本「ノートブック実行者」が良く、BigQueryを使う場合は「BigQueryジョブユーザ」を付与するなど使う機能に応じて権限を付与する必要があります。

使用感としてはマネージドノートブックが登場する去年まではユーザ管理のノートブックで作業していたのですが、共同作業ができなくてあまり期待していなかったのですが、マネージドノートブックは想定していた以上でGoogleSlideやSpreadsheetなみに共同作業できて驚きました。

### 環境について
デフォルトはn1-standard4という構成で常に起動し続けると$230.52かかりますので、まずスペックダウンしてn1-standard2等で開始し、要件に応じてスペックアップしていくのがオススメです。

### アイドル状態でのシャットダウン
詳細設定の下部に「アイドル状態でのシャットダウンを有効にする」というチェックボックスがありますが、これを有効にするとノートブックを操作していない時間設定した時間が経過すると自動的にシャットダウンします。これはマネージドノートブックにしかない機能のようで、ユーザ管理のノートブックやComputeEngineでcronコマンドを設定する対応することを簡単に設定できます。

### ターミナルの有効化
セキュリティセクションに「ターミナルを有効にする」がオンになっていますが、オフにするとターミナルが使えなくなります。これは初期起動時にしか設定できない項目のため使われる方はここをオンにしましょう。

## マネージドノートブックでGPUを使う場合は２パターンある
本題に入ります。大量のデータ分析に機械学習を用いるとCPUでは時間がかかます。私も最近500トークンほどの文章1つの分析を終えるのに30分くらいかかり、このような文章がまだまだ大量にあると思うと気が遠くなりました。そこでクラウドだと多少課金がかかりますが並列計算が得意なGPUを使うことが可能です。初期起動時に環境設定されるとわかると思いますが、マネージドノートブックはGPUをアタッチできます。それに加えて冒頭でも触れましたが、一時的にGPUを使用実行できるエクゼキュータ機能もあります。

### GPUのアタッチ
GPUのアタッチは環境設定時にも変えられますが、起動中も変更できて便利でした。
変え方は以下の通りです。
1. 右上のインスタンスのマシンタイプのタブをクリック
2. 「Modify hardware」をクリック
3. 「Attach GPUs」にチェック
4. GPUタイプを選択
5. 次のページで差分がでるので確認し「submit」をクリック

![GPUのアタッチ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780555/59024b70-edbc-4371-0bb5-564055541c9f.png)<font color="DarkGray">_Vertex AI Workbench マネージドノートブック GPUのアタッチ_</font>


実行するとおよそ**４分後**に完了画面がでてGPUがついていました。速い！！

CPU環境で約30分かかっていた処理が38秒ほどで終わりました。速い！！

また、リソースの使用状況もアタッチする前まではCPUだけ見えていましたが、GPUも表示されました。
![リソースの使用状態](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780555/6656437c-d475-f972-f70c-9bbbd72f3834.png)<font color="DarkGray">_Vertex AI Workbench マネージドノートブック リソースの使用状態_</font> 


### エクゼキュータ
1回限りの実行やスケジュールにしたがってノートブックファイル（.ipynb）を実行する機能がマネージドノートブックにあります。実行するごとのパラメーターを設定する機能や実行結果を共有する機能もあり、Vertex AIのカスタトレーニング用に難しい記述しなくても簡単に機械学習のトレーニングや複雑なデータ分析の試行錯誤ができます。また実行する環境もノートブックの環境と別に設定できますので、簡単な処理はノートブック環境上で試し、複雑な処理はGPUを設定したエクゼキュータで試すという使い方も可能です。

実施方法は以下の通りです。
1. 実行したいノートブックファイル（.ipynb）を開く
2. 上部の「Execute」をクリック
3. 実行名やマシンタイプを選択。GPUもアタッチ
4. その他項目を埋めて「SUBMIT」を実行します

##### その他項目の補足
* Environmentで該当のノートブックで使用しているカーネルを選択。GCPのクライアントライブラリを使いたい場合は用意されているカーネルを選択することをオススメします。
* ノートブック上の変数を設定するには「Input parameters」を設定します[^2]。
* BigQueryなどGCP上のプロダクトにアクセスする必要がある場合は「Use Vertex AI Training’s default service account」のチェックボックスを外し、「Service account」に必要な権限を付与したサービスアカウントを設定します。（何度も権限エラーがでました・・・。）

![エクゼキュータ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780555/f29a0e94-505d-7477-6130-bb032d650581.png)<font color="DarkGray">_Vertex AI Workbench マネージドノートブック エクゼキュータの設定_</font>

試しに前節でGPUを直接アタッチしたコードを実行してみました。実態としてはVertex AIのカスタムトレーニングで実行されるようで、想像より時間がかかりGPUアタッチで試したファイルと同様のもので10分ほどかかりました。ただし内部的に処理された時間は35秒ほどと記録されていましたので、トレーニングジョブの起動に時間がかかっていたようです。実行結果を確認するには「実行数」タブを開き「結果を表示」を押すと実行結果が記載されたノートブックファイルを確認できます。

![エクゼキュータ実行結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780555/06425e57-fac7-34bd-5cc5-b0b1fb3e304f.png)<font color="DarkGray">_Vertex AI Workbench マネージドノートブック エクゼキュータの結果_</font>


## エクゼキュータは圧倒的に安い！
結論からいうと、GPUアタッチしたときの費用はおよそ三桁円ほどでしたが、エクゼキュータは**一桁円**と桁違いに違いました。この違いはノートブック使う際にインスタンス費用と別に管理手数料がかかるところ[^3]のようです。（注意点として日本語のドキュメントでは管理手数料なしとありますが、Englishにするとちゃっかり書いていました…。）

また、実際に処理している時間に加えて、操作していない時間やGPUにアタッチする変更を実施している時間も課金されるからと考えられます。まとめると現時点（2022年12月）での費用このような違いあるようです。

※ストレージやBQなど他リソースにアクセスした際の費用は省略しています。またリージョンはasia-northeast1、構成はn1-standard-4 GPUをNVIDIA_TESLA_T4としています。

|                        |                    GPUアタッチ構成                    |       エクゼキュータ       |
| :--------------------- | ----------------------------------------------------: | -------------------------: |
| 課金が発生するリソース | Compute Engine <br> マネージドノートブック 管理手数料 | Vertex AI トレーニング費用 |
| 課金額(1時間あたり$)   |                                                \$1.17 |                     \$0.71 |


よって、GPUを使用して試行錯誤するならば圧倒的にエクゼキュータが安いと言えます。

## エクゼキュータはクラウドリソースを使う必要がある
よくJupyterlabやJupyternotebook環境では、ローカルにリソースやトレーニングファイルをおいて作業しがちですが、ノートブックエクゼキュータは実態としてVertex AIのカスタムトレーニングのため、クラウドにリソースをおいてそれにアクセスする形をとる必要があります。また、マネージドノートブックにおいてマジックコマンドでBigQueryを呼びだすことや、bashでgsutilコマンドなどでCloud Storageからデータを呼び出すことを良くします。これでは明示的にどのプロジェクトかを指定できないようで、以下のようにクライアントライブラリを用いることで解決できました。

```python
from google.cloud import storage
storage_client = storage.Client(project='プロジェクト名')
bucket = storage_client.bucket('バケット名')
```

## 終わりに
今回の記事はエクゼキュータ機能に焦点を当ててVertex AI Workbenchマネージドノートブックについて紹介しました。エクゼキュータを使うとGPUを気軽に使える課金額に抑えることができるため、試行錯誤が捗るなという感想です。

また、今年GAになったばかりなこともありバグもまだまだあるようで、何回か環境を作り直しています。その点においても、マネージドなだけあり事前にpytorchやtensorflowやGoogleのクライアントライブラリが導入された状態ですぐに使いやすいのでこの点もデータ分析で推せるポイントです。

マネージドノートブックには他にもGitとの連携機能や直接BigQueryを参照できてクエリを送る機能など紹介していない機能がまだまだありますのでこれから使用していく中でまた注目するポイントがあればまた紹介したいと思います。





[^1]: <https://cloud.google.com/vertex-ai/docs/workbench/notebook-solution>
[^2]: <https://cloud.google.com/vertex-ai/docs/workbench/managed/executor-parameters>
[^3]: <https://cloud.google.com/vertex-ai/pricing?hl=ja#notebooks>