実験管理(1)
概要
機械学習の研究開発においては,プログラムやハイパーパラメータの変更・モデルの学習・モデルの評価,というサイクルを繰り返す.本稿では,より素早く質の高いアウトプットを目指し,実験管理:洗練された方法で実験結果を管理する方法を紹介する.
実験管理の方針
筆者は,実験管理に次のような特徴を要請する:
- 集約: コード・学習済みモデル・メタ情報(実験の概要や評価値など)の3点をセットにして保存できる
- 再現: 所望のコード・学習済みモデルにロールバックして再学習・再評価を行える
- 俯瞰: 複数の実験のメタ情報を俯瞰し,比較できる
これらを実現するシンプルな方法を検討する.
1
実験が完了した時点で,コード・学習済みモデル・メタ情報の3点をセットにして適当なドライブのフォルダにまとめて保存しておく方法が考えられる.最もシンプルに「集約」と「再現」を達成できる方法である. 一方で,実験間で共通するプログラムやデータセットについて,これらの共通性は意識されることなく複製される. したがって,非効率的にドライブの容量を消費してしまう懸念がある.
2
Gitを利用して3点を保存する方法が考えられる.Gitの有するオブジェクト・zlib圧縮・パッキングの仕組みにより,一つ目の方法より効率的に容量を圧縮しながらコードを保存することができる. また,Gitに特有の「コミット(スナップショット)の親子関係」の概念により,コードを変更して別の実験を実施していくとき,それらの実験がどのように派生してきたのかを理解しやすい. 一方で,gitの問題点として,gitにコミットするだけだと結局スプレッドシートでメタ情報の一覧を作る羽目になることが挙げられる.単にgitを利用するだけでは,「俯瞰」は達成できない. コードは差分を意識しながら効率よく保存できるが,学習済みモデルのパラメータは共通する部分が皆無なので,git以外に保管する手も考えられる.
TODO
A.pyでモデルAを学習して評価指標A'を計算する. 同様に,B.pyでモデルBを学習して評価指標B'を計算する. これが完了したのち,C.pyでモデルAとモデルBを用いてモデルCを学習して評価指標C'を計算する,というプロセスを考える.
この時,モデルA,Bの学習それ自体も一つの実験であるし,これを前提にしたモデルCの学習も一つの実験であるが,この関係をうまく取り扱う方法はあるか?
Appendix: 実験管理ツールの調査
実験管理のフロー: コーディング -> 実験サーバーに転送 -> モデルを学習・評価 -> 3点セットを保存 -> メタ情報を一覧に追加
WandB
- wandbは学習曲線の可視化と比較・レポーティングに強みのあるサービス
- スタンドアローン版もある[2]
- [3]によれば,特定のディレクトリの内容を保存できるので,コードや学習済みモデルのバージョン管理もできそう
- いわゆるtrain.pyをartifactsとして保存しておけばバージョン管理できる?
- ただ,そのへんの機能の紹介に乏しいのでコード管理はgit前提かも?
MLFlow
- [4]によれば,サーバーは自分で立てないといけない
- 複数台の結果を統合する時にサーバーが必要なはず
- 実験サーバーの1台をtrackingサーバーにすれば良いのでは?
- そんなことしなくてもwandbなら自分でサーバー建てられる上に最初からクラウドも提供されているのに・・・
- databricksのcommunity editionなら楽できる?[5][6].無料で建てられるっぽいけどやや面倒
Comet.ml
- self hosting機能がなさそう?
- 自分らで鯖を立てられない? クラウドに出られない環境とかだと逆にself hosting機能が必要になるので・・・
Neptune.ai
- [7]によればself hostingできそう
参考文献
[1] 試行回数の増やし方2021年度版. https://speakerdeck.com/butsugiri/increasing-number-of-attempts-ver-2021
[2] Self-Hosting. https://docs.wandb.ai/guides/self-hosted
[3] Model Versioning. https://docs.wandb.ai/guides/artifacts/model-versioning
[4] MLflowを利用して機械学習チームで共有可能な実験管理をする方法. https://qiita.com/MasafumiTsuyuki/items/9e03e285d4b9e0c41a7c
[5] MLflow Tracking. https://mlflow.org/docs/latest/tracking.html#how-runs-and-artifacts-are-recorded
[6] Managed MLflow Now Available on Databricks Community Edition. https://databricks.com/jp/blog/2019/10/17/managed-mlflow-now-available-on-databricks-community-edition.html
[7] Deploying Neptune on your server (on-premises). https://docs.neptune.ai/administration/on-premises-deployment