GCPでプリエンプティブルのJupyterLab環境を楽して構築

クラウドでJupyter環境を使いたい場合[Google Colaboratory（Colab）Pro](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)を使えばいいと思います。私も基本的にそうしています。

ですが本稿では、何らかの理由でColabが使えない状況・かつクラウドのリソースを使いたいという時に、Colabのように安価で簡単に使い始められるJupyterLab環境をGoogle Cloud Platform（GCP）に構築します。
Colabぐらい...とはいきませんが、できるだけ楽に・安価に構築します。

"楽"というのは、具体的には下記のようになっています。

- 構築後のインスタンスに接続して`pip install`等で内部状態を変える必要がないこと
    - Ansible等のツールを使わなくても環境の再現性が取れる
- 構成に合わせてIPアドレスやポート番号などのネットワーク構成を変える必要がないこと
    - セキュアな状態を保つためにネットワークを管理したりする必要がない

## プリエンプティブル VM インスタンスによるコスト削減
GCPには **プリエンプティブル VM インスタンス** という機能があり、「24時間で停止する」等いくつかの制約を受ける代わりに安価で利用できます。Microsoft Azureで言う[Azure Spot Virtual Machines](https://azure.microsoft.com/ja-jp/services/virtual-machines/spot/#overview)や、AWSで言う[Spot Instances](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-spot-instances.html)と似たような物だと思います。

https://cloud.google.com/compute/docs/instances/preemptible?hl=ja

本稿ではこのプリエンプティブルインスタンスを構築することでコストを削減します。
...ですが、AI PlatformノートブックやVertex AI ノートブックを使ったり、マーケットプレイスのVMイメージを利用した方法ではプリエンプティブルインスタンスにできないようなので、Compute Engineで新規VMインスタンスから構築します。

## 実行環境
[GCPの管理コンソール](https://console.cloud.google.com/home/dashboard)にアクセスできるWebブラウザだけあれば良いです。

## 手順
### インスタンスの構築
[GCPの管理コンソール](https://console.cloud.google.com/home/dashboard)で「Compute Engine」→「VM インスタンス」→「インスタンスを作成」から、好みの名前やスペックを選んでインスタンスを構築します。必須なのは以下2点です。

- 「ブートディスク」→「変更」→「公開イメージ」 **「OS」を「Deep Learning on Linux」** にする
    - バージョンは使いたいソフトウェアにあわせてお好みで
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/01236aa3-f27c-3dc4-16dc-68b0cf08ea16.png)
- 「ネットワーク、ディスク、セキュリティ、管理、単一テナンシー」→「管理」→「可用性ポリシー」 **「プリエンプティブ」を「オン」** にする
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/e180b5ff-4c86-0dc5-17ad-736d831f0113.png)

必須の設定は以上です。ネットワークのアクセス許可等の設定は基本的に必要ありません。

### JupyterLabにアクセスする
Deep Learning on Linuxのイメージを使うと8080ポートでJupyterLabが自動的に立ち上がりますが、このままではアクセスする方法がありません。

そこでgcloudコマンドを使っての **SSHポートフォワード** を使うことで、パブリックネットワークに対してアクセス許可を新規で追加したりすることなくJupyterLabにアクセスできるようになります。さらに、CloudShellには **Webプレビュー** という公開されたポートに対してGCPログイン済アカウントでのみアクセスできるURLを払い出す機能があります。
これらを利用することで、ブラウザのみで（gcloudコマンド実行環境をローカルに構築したりすること無く）セキュアにJupyterLab環境へアクセスします。

管理コンソール右上「CloudShellをアクティブにする」で、CloudShellを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/47c50309-a24e-9e09-6a34-7ac60bd01621.png)

Shellが立ち上がったら、下記コマンドを入力します。

```sh
$ gcloud compute ssh --project [プロジェクト名] --zone [ゾーン名] [インスタンス名] -- -L 8080:localhost:8080
```

プロジェクト名やゾーン名は省略しても実行できる場合があります。

実行後、インスタンスに接続できたらShellはそのまま「ウェブでプレビュー」→「ポート 8080 でプレビュー」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/c0256dba-d43d-f187-058b-d6035748c928.png)

これでJupyterLabが立ち上がって使えるようになっていると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/44d26bd9-3b8b-17ae-b4c0-d47a6c96878d.png)

## 参考
- [GCP上にPyTorchが入ったGPUインスタンスを立ち上げる \| bassbone's blog](https://blog.bassbone.tokyo/archives/682)
- [GCPでできるだけ安くディープラーニング \| Hiho's Blog](https://blog.hiroshiba.jp/gcp-low-cost-deeplearning/)
- [JupyterLab に接続する  \|  Deep Learning VM Image  \|  Google Cloud](https://cloud.google.com/deep-learning-vm/docs/jupyter?hl=ja)
- [ウェブ プレビューの使い方  \|  Cloud Shell  \|  Google Cloud](https://cloud.google.com/shell/docs/using-web-preview)