月: 2016年7月

機械学習の環境をGCPで構築する

前回前々回の続き。

今回、tensorflowの趣味プロジェクトにはGCP (Google Cloud Platform) を全面的に使った。手元の環境はChromeOSなので、ローカルには実行環境を持っていない。開発環境になる。

といっても大したことは何もしていない。

学習用に独自のGCEインスタンスを作成する。編集や実験はIPython / Jupyterを使うことになるので、Anacondaをインストールしてこれを使う。tensorflowだけpip installでインストールする。GCEインスタンスにはブラウザから直接端末にログインできる機能があるので、ボタン一発でつなげてたいへん便利だ(ブラウザのポップアップウィンドウなので、Ctrl-wするとウィンドウが消えそうになるなどの問題がじゃっかんありますが)。

jupyterは起動コマンドで 0.0.0.0 を指定しておいて、どこからでもアクセスできるようにしておく。アクセスは手元のブラウザから(ただmatplotlibについては %matplotlib inline が必要)。これもちろん、IPアドレスが判明すると誰でも私の作業環境にアクセスできてしまうのだけど、IPアドレスがephemeralなので、使っていない間にインスタンスをシャットダウンしておくとIPアドレスは毎日変化するので、基本的に私以外の人間がピンポイントで攻撃できるような事態は、かなり起こらないと思われる。

が、ある日の作業中に身に覚えのないアクセスログが出てきたので、たぶん以前にほかの人が私用で作ったIPアドレスとかぶったりしたのだろう、そういう事故は発生する可能性はあるので、その日にパスワードだけは設定することにした。

この辺、真面目に使うのであればインスタンスごとにホスト名を与えて、Let’s Encryptで証明書を与えてhttpsコネクション、といったあたりぐらいまでやるのがスジであろう。あるいは自分のIPアドレスを調べてその都度jupyterの起動コマンドでアクセス元を制限するとか。が、私用だしひとまず適当でよかろうというバランス感覚でこうなっているので、あまりお勧めではない、ということは一応言っておく。

さてそんなわけでIPythonでtensorflowを使ってすべての作業を行うが、長いタスクになってくると、計算処理をやったまま寝るとか出勤するとかいうことになる。今回の実行環境では端末アクセスしてそこでjupyterを立ち上げていたので、端末とのコネクションが切れるとjupyter自体が終了してタスクが終了してしまうようだった。このへん、いろいろ混同していたのもあり、長いジョブを投入するときはIPythonの.ipnbファイル形式から.pyに変換し、その.pyを起動しておくこととした。Python2をいまだに使っているので、non-asciiが出てくると発狂する問題があったりするが……。

より多くの計算リソースが必要になったら、そのときだけ新しいインスタンスを立ち上げてそこで使う(そちらはanaconda/IPythonは導入していないので、.py変換はここでも意味がある)。データの受け渡しは、gsutilが標準でインストールされているのでGoogle Storageに適当なbucketを作ってシェアしておく。

C++やMakefileについては、端末アクセスでvimを入れて書いていたが、Emacs入れたほうが楽だっただろうか、という気もしている。他のエディタを使いたい人はどうするのかなぁ。X11で仮想デスクトップを立ててChrome remote desktopを使えば良さそうだけど、私にはそこまでするモチベーションが湧かなかった。

Emscriptenで生成したjsファイル(や手書きのHTML/JSファイル)の動作確認には何らかのHTTPサーバが必要になるが、楽にセットアップできる環境を考えた結果、WEBrickが一番楽そうだと思ったので、rubyをインストールして数行のファイルサーバを書き、必要に応じて立ち上げたりする、といった手法を採用した。これがRubyに標準添付なのだから楽なものだと思う(書いてて今思い出したけどPythonにもSimpleHTTPServerがあってそのまま使えたような気がする。まあラクなもんですな)。

まあそれぐらいかな。適当にやっているだけで、あまり効率重視しているわけでもない、比較的単純な手法です。

なお、他のありえた構成についていちおう書いておくと、Google Cloud Datalabはインストールされているtensorflowのバージョンが比較的低く、あまりヘビーな計算はおそらく無理(distributed tensorflow以前のバージョンなのでバックエンドを追加もできなさそう)ということで断念、Google Cloud MLはまだ万人が使えるものではなく私用では使えそうもない、といった次第。あとほんとうは、新しいGCEインスタンスを立ち上げるよりはGKEでtensorflow計算クラスタを作ってフロントエンドは維持しつつバックエンドに計算ジョブを投げるほうが柔軟だったのかも、と思いつつ、そこまでは手が回らなかった次第。

全体的にどれぐらいお金がかかったか、というと、全体で$300ていどのコストだったようである(16CPUインスタンスの稼働時間が効いているっぽい)。上げっぱなしでうっかり寝たりとかムダも多く、あまり切り詰めていない値段なので、もう少し安くできたはず。だが、しばらく多数CPUで遊んでいたということを考えればまあ良いのでは、という気がする。普通に高い機器を手元に購入して使ったらもっと高いですし。