sam_yusukeの日記

機械学習について書きます。

Omniboard + Sacred, Jupyter、実験実行コマンド実行ツールを導入

問題意識

最近、複数の機械学習プロジェクトに並行して取り組むことが多くなり、もう少しスマートに実験結果の管理をしたいと思っていました。例えば、古い実験結果をもう一度見るために再度学習から実行し直したりと効率が悪くなっているので、実験結果の分類と検索をうまくして、過去の実験再度実行したり、過去の実験結果を再度分析したりできるようにしたいなと考えています。

ライブラリと使い分け

 ざっくり見た感じだと、実験結果を長期的に(プロジェクトをまたいで)管理し続けるためにはSacredOmniboardが役立ちそうで、プロジェクトごとにまとめられた結果を見たりするにはTensorboardが適していそうです。Sacredは実験再現性を向上することを目的として作られたライブラリで、実行中・実行後の実験をDBとかで管理してくれます。OmniboardはSacredのフロントエンドです。OmniboardとSacredを使うと、スクリプトを実行した時点から管理されるので、サーバ上で実行されている実験を管理したりするのにも役立ちそうです。

サーバ構築

実験の実行と管理をするサーバを立てました。構成要素は次の通りです。

  • Jupyter

  • Sacred + Omniboard

    • サーバの実行からあとで検索する用途まで

  • 自前のプログラム実行プログラム

    • paramikoを利用

スクリーンショット

f:id:sam_yusuke:20181205142228p:plain

f:id:sam_yusuke:20181205142932p:plain



今回調査したライブラリに関するメモ

Tensorboard

TensorboardはTensorflow専用というイメージがありますが、Tensorflow以外でTensorboardを使うためのTensorboardXなるものがあるらしいです。

Dockerイメージを使った導入記事もあり、参考にしてみました。

Windowsですが、Dockerは使わずに、WSL上に導入してみました。手順Ubuntuとほぼ同じです。

f:id:sam_yusuke:20181205142544p:plain

tensorboardでは、tesnorboard起動時のlogdirに指定したディレクトリ内でサブディレクトリで整理する感じになりそう。Tensorboardはサブディレクトリを読んで、別のデータとして表示非表示を変更できるようにしてくれて、(実験一回分はTensorboardでは、runと呼ばれている。)この機能を使うとユーザはrunごとの結果の比較や縮尺を変更した比較などがやりやすくなる。また、画像のように正規表現で絞り込んで、狙ったそれぞれのrunの表示非表示を変更できる。下の画像では、runは一つだが、groupが複数あるので複数runsが表示されている。

  • Tensorboardで可視化の省力化

    • Tensorboardで実験するときの設定

      • サブディレクト=パラメタ設定の違いがわかる名前をつける

      • グループ設定=ロス関数とかで分類 (data/loss/focal_lossなど)

      • やりたい実験ごとにディレクトリを区切る

      • それぞれのディレクトリ以下に実験を再現できるパラメタすべてを入れる。

Sacred

  • sacredによる実験再現性確保の省力化
    • 実験をクラスとしてもコマンドとしても定義可能
    • 実験のパラメータを定義可能
    • 実験に関する情報(パラメタ、依存パッケージやそれらのバージョン、マシンに関する情報など..)

パラメータを関数間で引き回さなくていいのがすごいいい気がする。

スクリプトのメインファイルでパラメータの名前の定義だけしちゃって、

任意の関数にcaptureデコレータで設定を突っ込める。

また引数定義がargparseと比較して楽にできる。

ただ、関数を呼び出す場合に、どの引数が設定されていて、どの引数を与えないと行けないかわかりにくくて、バグを生んだり開発スピードが下がりそう。

dictionaryを引き回すほうがわかりやすいかも。

 

Omniboard

SacredにあるMongoDBに実験結果を保存する機能のフロントエンド。

実験結果の一覧を見れる。結構便利だし、導入も楽。タグとステータス以外で検索が出来ない。issueに上がっているので今後サポートされる可能性はある。