google cloudの機械学習用gpuインスタンスでjupyterlab_vim拡張機能を使えるようにするまで

来年から仕事で関わる２つのプロジェクトがそれぞれ

- pytorchを使う
- jupyterlabを使う

ことがわかって、google cloudでjupyterlab+vim環境を構築してみたらいろいろ詰まった。そのメモ（２０１８年１２月）。

# やっておきたいこと

1. google cloudのユーザ登録
2. gpuインスタンスを使用可能な状態にする
3. プロジェクト作成
4. gcloud SDKをインストールして認証する

初回登録時は３００００円分無料枠がもらえる

# google cloudでgpuインスタンスを立ち上げる

やり方は[こちら](https://cloud.google.com/deep-learning-vm/docs/pytorch_start_instance)の記述通り、慣れるとGUIじゃなくてCUIでやりたくなるが、掲載のコマンドそのままだとCPUとメモリーがデフォルト値で結構貧弱なので、CPU数とメモリーを指定するには下記のように書く。

```
#!/bin/sh
export IMAGE_FAMILY="pytorch-latest-cu92"
export ZONE="asia-east1-a"
export INSTANCE_NAME="pytorch"
export CLOUDSDK_CORE_PROJECT='xenon-chain-217906'

gcloud compute instances create $INSTANCE_NAME \
  --zone=$ZONE \
  --image-family=$IMAGE_FAMILY \
  --image-project=deeplearning-platform-release \
  --maintenance-policy=TERMINATE \
  --custom-cpu=4 \
  --custom-memory=15 \
  --accelerator="type=nvidia-tesla-k80,count=1" \
  --metadata="install-nvidia-driver=True"
```

`CLOUDSDK_CORE_PROJECT`はプロジェクトIDを入れる。これ実行するとしばらくしてインスタンスが作られる。

# ログインしてjupyterlabを使う

pytorch用のマシンイメージはデフォルトで立ち上がるときにjupyterlabが起動するが、このままだと外からアクセスするのが面倒なので、ポートフォワードを使うと気軽にローカルからpytorchインスタンスのjupyterlabにアクセスできる。

```
#!/bin/sh
export IMAGE_FAMILY="pytorch-latest-cu92"
export ZONE="asia-east1-a"
export INSTANCE_NAME="pytorch"
export CLOUDSDK_CORE_PROJECT='xenon-chain-217906'

gcloud compute ssh "pytorch" -- -L 8887:localhost:8080
```

最後の行は`ssh`の`L`オプションを使って、リモート（google cloud）側の8080ポートをローカル側の8887にバインドしているので、これでブラウザから`localhost:8887`にアクセスするとjupyterlabが立ち上がるはず。

# jupyterlab_vim

jupyterlabそのままでも結構使いやすそうだが、試行錯誤が多い機械学習案件なのでやっぱり編集ツールを整備しておきたい。jupyterlab(version:0.35.4)の`Settings`をクリックすると`Text Editor Key Map`項目に`vim`の選択肢を見つけ、「設定無しで使えるか、さすがlabだ」と喜んで選択するものの変化なし。やっぱ拡張機能をインストールしないと使えない。ターミナルで

```
jupyter-labextension list
```

とjupyterlabの拡張機能の状況を確認できる。何もインストールされていなかった。[こちら](http://kzkohashi.hatenablog.com/entry/2018/08/04/134609)を参考に

```
jupyter labextension install jupyterlab_vim
```

でインストールするが、権限の問題でエラーになる。どうやらただsshでログインするとインスタンス側で勝手にローカルユーザと同じ名前のユーザが作成されてそちらでログインするようです。`/home`ディレクトリ下に`jupyter`のフォルダがあったので、ログインコマンドを次のように変更して

```
gcloud compute ssh jupyter@pytorch -- -L 8887:localhost:8080
```

`jupyter`ユーザでログインし直せば権限の問題は解決。が、今度はnodejsがインストールされていないとエラーになる。

## nodejsのインストール

nodejsなんぞ、`sudo apt install nodejs`でイケるっしょ、と思いきや、それだとインストールされるのはバージョン４.x.x、それだと低すぎるとjupyterlabに怒られる（jupyterlab殿は6以上でないと承知しないのだ）。`sudo apt update`してからでもだめ。うぬ。。。

```
cat /etc/os-release
```

で調べてみるとLinuxが

```
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
```

になっているらしい、このディストリビューションは確か必要最小限のものしか入っていないらしい。。。うぬぬ。。。[こちら](https://linuxconfig.org/how-to-install-nodejs-on-debian-9-stretch-linux)を参考に

```
curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
```

でやっとnodejsをインストールでけた。

あれからjupyter_vimを無事インストールし、jupyterlabの画面から`Settings->Advaced Settings Editor->Extension Manager`で拡張機能を有効にして、そしてようやく僕の快適jupyterlab_vimライフが始まるのだった。

# おまけ

- google cloudのお代は使ったリソースの時間分だけ課金されるので、〇〇gpu１個１時間ｘｘｘ円、CPU１個１時間ｘｘ円、メモリー１ギガ１時間ｘ円、という具合になっているので、使わないときはインスタンスを止めて置いたほうが幸せになれる。K80を１個、cpuを4個、メモリーを１６ギガで使って１時間合計１００円弱だった。
- `gcloud compute instances stop pytorch`とか`gcloud compute instances start pytorch`とかでインスタンスを起動・停止できるので、これで次からはほしいときにgpuインスタンスを簡単に召喚できる。
- `Debian Stretch`君はデフォルトの状態で`ll`エイリアスがない、`.bashrc`に該当設定がコメントアウトされているので、そこを外して`source ~/.bashrc`で`ll`が使えるようになる

残留課題、インスタンス切り忘れ問題があるので、毎日定時にインスタンスを落とすスクリプトを仕組みたい（ごおごるふぁんくしょんかな）。