Google Colaboratoryローカルランタイムで開発環境の保持

# 要旨
Google Colaboratoryの環境コロコロかわるし、突然既存のコードが動かなくなったりと大変じゃないですか？Colaboratoryの自鯖立てれば固定できるし、「ある時点でのColaboratory環境」再現できたりして良いですよね。

# 背景
## セットアップ
開発だけでなく教育にも使える便利なGoogle Colaboratoryですが、致命的な仕様に悩まされてきました。それはプレインストールパッケージを含め環境が定期的に変更されることです。例えば、昨年末CUDAのバージョンが11.xから12.xに変更されたため、onnxruntime-gpuが動作しなくなったり特定の深層学習モデルが動作しなくなったりと散々な目にあいました。　最近ではNumpyの[メジャーアップデート（1.x -> 2.0.0）が発表](https://numpy.org/devdocs/release/2.0.0-notes.html)され、Colaboratoryが新バージョンに移行すると既存のアセットが動作しなくなるのではと戦々恐々としています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156483/5acfe2b3-98e9-0df0-d78b-dc25b3badb0f.png)
*最近はnumpyが変わってもすぐに気付けるようおまじないを冒頭で走らせたりしています。まだ大丈夫（2024/06/08）。*

https://medium.com/google-colab
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156483/90513c3d-6e22-41f0-9ed7-3241caa16426.png)

mediumでアップデート情報が公開されているものの、下のようにColaboratoryのノートブックからリリースノートを表示したほうが確実でしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156483/01e15a0e-dfac-1edb-50ab-f25fe01d799c.png)
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156483/b39b9344-5478-5eb6-9dcd-a355ac4c33b7.png)
（2023年12月18日にCUDAのバージョンが変更されたことを確認できます。）

最新の環境にあわせてコードを書き換えれば済む場合もありますが、対応できないときもあります。CUDAのダウングレードやパッケージの再インストール、果てにはcondacolabを使ってColaboratoryの中で仮想環境を構築しなおしたりとその都度工夫は可能したりしています。が、ノートブックを立ち上げて数秒で環境構築という利点がなくなってしまいます。

いっそのこと私物のGPUPCをColaboratoryサーバーとして使い、開発環境を永続化させましょう。

# 解説
Google Colaboratoyのローカルランタイム接続機能を使うと、通常のCoalaboratory Notebookそのままにクラウドではなく自鯖で建てたColaboratoryスペースを使うことができます。説明は[公式解析](https://research.google.com/colaboratory/local-runtimes.html?hl=ja)を読めば十分でしょう。

- nvidia driverがセットアップされてGPUが認識されているubuntu/windows PCにdockerをインストールして使えるようにしておく。
- 以下のコマンドで最新のColaboratoryの環境を立ち上げる
```shell
docker run --gpus=all -p 127.0.0.1:9000:8080 us-docker.pkg.dev/colab-images/public/runtime
```
- ログにAPIU付きのアクセスurlが出るのでクリップボードにコピーしておく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156483/30626111-2a8f-932c-fcb5-a0cfd74a4252.png)

下のようなリンクが該当部分。末尾の(type=jupyter)はコピーしない。
```
 http://127.0.0.1:9000/?token=XXXXXXX (type=jupyter)
```
- Colaboratoryのノートブックを通常通り立ち上げ、リンクを貼るとローカルでColaboratoryを動かすことができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156483/17defeb1-632a-72a2-3add-f7d86bae1e85.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156483/741c5a2d-b244-ff3d-92f0-c58ab921a70e.png)

## 特定のColaboratoryのバージョンを動かす。
冒頭に書いたように、例えば「半年前動いていたコードを当時の環境で動かしたい」といったときには、起動するdocker imageのバージョンを指定すればよいでしょう。

[Colaboratoryのdocker image レポジトリ](https://console.cloud.google.com/artifacts/docker/colab-images/us/public/runtime)では、約一年前までの仮想環境をtagで指定可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156483/2df8edbc-be55-72da-fdd9-8349b60a2718.png)
なので例えば下のように2023/5/24時点のtagをつけて起動すると
```shell
docker run --gpus=all -p 127.0.0.1:9000:8080 us-docker.pkg.dev/colab-images/public/runtime:release-colab-20230515-060150-RC00
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156483/31ea316f-0c8c-aff6-8d0c-6ddf8288f45f.png)

CUDA11.8が使えます。すばらしい。


## 出先での使い方
例えば、以下のような使い方で出先からアクセスすると捗ります。

- host GPU-PC -> tailscale -> client pc 
- ssh接続はvscode経由でポート9000と3389を転送。

tailscaleでvpnを使うことで、自宅ルータのポートを解放しなくても固定IPでアクセス。ポート9000はColaboratory用、3389はwindows remote desktop用に確保。さらにvscodeの利用もできます。また、未検証ですが、Colaboratory同一環境をjupyter notebook（ブラウザor vscode経由）で利用することもおそらく可能でしょう。


## 注意
今は1年前まで遡った環境にアクセスできますが、Googleがいつまで過去のdocker imageを保持してくれてるかは気分次第でしょう。必要に応じてイメージをダウンロードして確保しておきましょう。



--- 
# 最後に
スマート農業や植物科学研究に関連した画像解析アルゴリズムや装置の開発をする[ベンチャー](https://phytometrics.jp)やってます。最近ではGoogle Colaboratoryをベースとした[植物画像解析（植物フェノタイピングのハンズオン資料集](https://github.com/phytometrics/plant_phenotyping_python)を作ったりしています。初学者向けのため、本稿のローカルランタイムを使用せず、最新のColaboratoryに対応できるよう日々デバッグしています。いつかColaboratoryでセットアップ環境の指定ができればいいなあ。