Colabノートブック上から別のノートブックを読み出す

よく言われることだけど、transformerは時系列に関係なく一気に学習できるという意味で、タイムステップtが終わらないとt+1の学習ができないRNNと違ってGPUの使用量が桁違いですね。つまり引くぐらい1 Epochの学習が早い。

Colabはインスタンスを同時に5つまで立てることができる。5つ並列に回してなにか比較モデルを計算させるような場合、最終的なモデルを構築するまでの基本的なコード(データの読み出しやモデル選択などなど)は当然共通化できる。

しかしそれをいちいち全てのNotebookにコピーするのも面倒だし(面倒というか統一できてないとバグの温床になる)、かといって.pyファイルにモジュール化すると修正が面倒だし、という感じなんだけど、JupyterはあるNotebook上で他のNotebookを走らせることができる。つまり共通化できる部分だけモジュールみたいな感じで別のノートブックに切り分けておいて、それを各ノートブックから参照するようなイメージ(最初に走らせるだけなので、厳密には参照しているわけではない; 参照っていうと関数走らせるたびに読みにいくように見える)。

本当はimport_ipynbパッケージでもできるはずなんだけどちょっとうまくいかなかったので、Magic Commandsの%runでやる。

事前にデータ周りの関数はdata_settings.ipynbに、モデル構築系の関数はmodel_settings.ipynbに書いてあって、それらがColabのデフォルトディレクトリ(/content/drive/MyDrive/Colab Notebooks) に置かれていたとすると、作成した新しいNotebook(たとえばanalytics.ipynb)上で

%run '/content/drive/MyDrive/Colab Notebooks/data_settings.ipynb'
%run '/content/drive/MyDrive/Colab Notebooks/model_settings.ipynb'

とする。注意点としてこれはフルパスじゃないと走らない。たとえ同じディレクトリ に置かれていたとしても無理だった。

こうすることで各Notebook内のセルを、現在開いているanalytics.ipynbのインスタンス上で走らせることができる。つまりpip installやパッケージのimport、関数の定義などを1行で済ませられる。import_ipynbもそうだけど、モジュール化しているような振る舞いではあるけど実際にはモジュールとして走っているわけではなくあくまでNotebook内に別のNotebookが差し込まれているようなイメージなので、定義した関数(たとえばload_data()なんていうものを作ったとして)はanalytics.ipynbインスタンスのグローバル空間にそのまま定義される。つまり個別の名前空間が用意されてdata_settings.load_data()なんていうふうに読み出すわけではなく、そのままload_data()という形で使用する。

こうやってどんどんNotebookとして個別の機能を実装していくと解析が本当に便利になりますね。パラメータ動かしながら探索するような人たちは毎回いちいちkerasでレイヤーをスタックしていくわけにもいかないだろうし、誰しも自分なりのモデル構築のための関数って持ってるもんだと思うけどね。