Edited at

ColaboratoryでKerasからTensorboard出力をする


無料でGPUが使える!

素晴らしい。詳しい事はこの記事見ればOK。マジで3分でGPUがバリバリ使える環境が手に入る。

https://qiita.com/tomo_makes/items/f70fe48c428d3a61e131

※ 上記記事の通り部分的に制限はあるものの、現実的に個人利用ならほぼ問題ないし、プロダクトレベルでも上手く途中経過を保存するなりして永続化すれば割と使える。


GoogleDriveをファイルシステムとして使う

インスタンスは落としてしまうとローカルのファイルや何やらは維持されません。そのため下記記事を参考にGoogleDriveからファイルを読み込んだり保存したりしましょう。

https://qiita.com/tomo_makes/items/b3c60b10f7b25a0a5935

[2019.06.03 追記]

→ マウントもめっちゃ簡単になってた https://qiita.com/k_uekado/items/45b76f9a6f920bf0f786

普通にpythonファイル読み込めて驚いた。

import sys

sys.path.append('drive/path/to/libs')

from example import example_func

これでGoogleDriveの /path/to/libs/example.py みたいにファイルを置いておくとちゃんと読み込む。(たまに読み込まない時があったのでそういう時はランタイムの再起動すると直る。多分前にパスを読み込んだ時の状態が残ってたりするんだと思う。)


Tensorboardのファイルが0bytes?

意気揚々とこんな感じでKerasで書いたモデルの学習を走らせた。

model = Model(inputs, outputs)

model.compile(適当)
callback = Tensorboard(log_dir='drive/path/to/log')
try:
model.fit(X, y, epochs=99999, callbacks=[callback])
except KeyboardInterrupt:
model.save('drive/path/to/log/model.h5')

個人的によくやる、とりあえず大量のepoch走らせておいて、暇な時間が出来たら一旦止めて(止めなくてもいいけど)色々検証して再度保存した所から走らせたり、部分的に書き直して走らせたり。

ローカルでやった時はこれでちゃんとTensorboardの出力も見れてたのですが、GoogleDriveには0bytesのファイルが吐き出されるだけで処理を止めた後にDLしてローカルで見ようとしてもグラフが見れませんでした。

そこで

model.fit(X, y, epochs=10, callbacks=[callback])

として途中で止めずに最後まで走らせてみると、ちゃんとした出力ファイルが得られグラフも正しく見れました。おそらくですが、GoogleDriveのせいなのかColaboratoryのせいなのかは分からないですがファイルの書き込みがバッファにある状態で、書き込みが終わる前に終了しちゃってるのかと予想しました。

なので上のコードを下記のように書き換えると、途中で□で止めてもちゃんとTensorboardの出力が得られました。(12時間経過後の自動ランタイム再起動でも同じ挙動になるのかは未検証…)

model = Model(inputs, outputs)

model.compile(適当)
callback = Tensorboard(log_dir='drive/path/to/log')
try:
model.fit(X, y, epochs=99999, callbacks=[callback])
except KeyboardInterrupt:
model.save('drive/path/to/log/model.h5')
callback.writer.close()

途中で停止した時はKeyboardInterruptの例外が投げられるようなのでそこでcallbackのファイル操作を適切に閉じてあげる感じですね。


Googleすごい

のに、何故かそこまでバズってない気がする。