Itsukaraの日記

最新IT技術を勉強・実践中。最近はDeep Learningに注力。

Google Colaboratoryが便利・高速で凄過ぎる

Googleが研究の一環で提供しているColaboratoryを試してみました。

Jupyterと同じようなGUIでPythonのプログラムを実行可能で、GPUも使えます。

Jupyterと同様に、先頭に「!」を書くことで、Linuxのコマンドを実行可能であり、「!pip」「!conda」「!apt-get」などで機能を追加できます。

実行結果をファイルシステム上に保管でき、共有リンクを使って取り出せます。
ただし、12時間経過すると強制終了されて、ファイルは失われます。

しかし、Notebookが動いている仮想マシンにGoogleドライブをマウント可能であり、これにより、実行結果をGoogleドライブ上のファイルとして保管できます。

Deep Learningでは、途中の状態をファイルに保管して、そこからResumeできるようにプログラムを書くことが多いので、12時間で一度強制終了しても、Googleドライブに保管したファイルを使って学習を再開可能です。

試しに、Wide Residual Networks(WRN)のコードを実行してみました。このコードは、2016年時点にCIFAR10で最高性能を出したコードです。Colaboratoryを使って、16時間程度(途中で一度強制終了し、そこから再開)で結果を出すことができました。なお、当方のPCではGPUメモリが足りず同じ設定では試せませんでした(2GBでは足りなかった)。少し問題サイズを小さくして(depth=16からdepth=10にした)試したところ、Colaboratoryの方が問題サイズが大きいにもかかわらず、Epoch当たり処理時間は短かったです(当方PC: 3分53秒、Colaboratory:3分37秒)。

Deep Learningを個人的に試すには最適と感じました。

f:id:Itsukara:20180205205704p:plain

世界最高レベルのコードをこんな簡単・高速に試せるなんて、凄過ぎます!

Wide Residual Networks試行用Notebook

下記がWRN試行環境として作ったColaboratoryのNoteookです。共有設定していますので、リンクをたどれば、簡単にColaboratoryで実行できるはずです。

WRNd16w10(pytorch-v0.4).ipynb

Wide Residual Networksのpytorch0.4対応により一部変更した版(2018/9/30)。
https://colab.research.google.com/drive/1fDdGmFhh7X2Tu_Cg9yoDSY-9bM78w41s


NotebookにはWide Residual NetworksのPythonコードは全く書かず、「git clone」でコードを取得し、「import main」でメインのPythonファイル「main.py」をインポートし、「main()」を直接呼び出すことで実行しています。

ただし、このままではプログラムに引数を渡せないので、下記のように、間接的に「main()」に引数を渡すようにしています。この方法は汎用性があるので、他のコードを試す際も活用できそうです。

import sys
new_argv = "main.py --save ./logs/resnet_20180204 --depth 16 --width 10 --ngpu 1 --gpu_id 0".split(" ")
sys.argv = new_argv
main()

下記は、学習状況を可視化するためのNotebookです。

visualize.ipynb

https://drive.google.com/file/d/1eq4wAkZijRmfxiaQLpy5nXsR6I9Tu89-/view?usp=sharing

WRNのコードが作成したログファイル「log.txt」をGoogleドライブで右クリックして共有リンクを取得した後、上記Notebookに共有リンク中IDを埋め込んで実行すると、先頭で示したように、学習状況を可視化できます。

上記コードは、WRNのコードに含まれていたものを流用し、可視化にBokehを使っています。なお、ColaboratoryのNotebookでBokehを使う際は、グラフを表示するセル内で「output_notebook()」を必ず実行する必要があります。これが分からず、最初はMatplotlibで表示していましたが、Bokehは、表示した後で部分的に拡大したりできるので便利ですね

WRNコードの場所(Github)

github.com

WRNの論文(Wide Residual Networks, 23 May 2016)

https://arxiv.org/abs/1605.07146