最近こちらの記事を拝見しました。
読んでて、mlflowってなんじゃい??ってなったので、今回はmlflowの使い方を勉強してみたのでそのメモです。
mlflow
MLflow is an open source platform for managing the end-to-end machine learning lifecycle. MLflow Documentation — MLflow 1.7.2 documentation
簡単に言えば、mlflowは機械学習の管理を行うライブラリです。
機能としては大きく3つあって、
- MLflow Tracking
- 実験の管理
- MLflow Projects
- モデルを再利用できるようにパッケージング
- MLflow Models
- モデルのデプロイ
となってます。
詳しくはこちらの記事がわかりやすかったです。 パッケージ化やデプロイ機能については下記の記事などをご参照ください。
インストール
インストールは簡単で、
$ pip install mlflow
だけです。 基本的な使い方はtutorialに記載がありますので、そちらも合わせて御覧ください
MLflow Tracking
今回はPythonスクリプトのトラッキングを試してみます。 上のquickstartをそのままなぞってみます。
サンプルコードはこんな感じになっています。
import os from mlflow import log_metric, log_param, log_artifact if __name__ == "__main__": # Log a parameter (key-value pair) log_param("param1", 5) # Log a metric; metrics can be updated throughout the run log_metric("foo", 1) log_metric("foo", 2) log_metric("foo", 3) # Log an artifact (output file) with open("output.txt", "w") as f: f.write("Hello world!") log_artifact("output.txt")
$ python tutorial.py
するとmlrunsというディレクトリができるかと思います。
これができていることを確認したら、GUIを起動してみます。
$ mlflow ui
これで http://127.0.0.1:5000にアクセスすればトラッキングの結果が見れるようになっています。
適当に自分で書いてみる
実際に使用しそうな場面を想定してやってみます。 参考にしたコードはこちら。なんの変哲もないLightGBMのサンプルコードです。
こちらを使用するにあたり、kaggleのdocker imageを使用しました。
これらをつかって、簡単に使い方を確認していきます。
パラメータ
mlflowで管理したい実行時パラメータについては、下記のように記述することで管理されるようになります。
num_boost_round=5 early_stopping_rounds=5 mlflow.log_param("num_boost_round",num_boost_round) mlflow.log_param("early_stopping_rounds",early_stopping_rounds)
メトリクス
最終的な評価値など、メトリクスについて管理したいものについて、下記のように記述することでmlflowでトラッキングできるようになっています。
rmse = mean_squared_error(y_test, y_pred) ** 0.5 mlflow.log_metric("rmse", rmse)
その他、モデル自体のバージョン管理や、生成物などもmlflowで管理出来るようです。 詳しくは以下の記事がわかりやすかったです。
確認する
実行が完了したら、 http://127.0.0.1:5000にアクセスすればパラメータとメトリクスの一覧を確認することが出来ます。
複数の実行の比較を行うことも可能になっています。 実際にどんなパラメータを使用して、結果がどうなっていたか、下記のように管理出来ます。
こんな感じに、気になったバージョン間で比較ができるので、実験の結果を分析するのには非常に有効かと思います。
感想
思ったより簡単に使えたので良かったです。
kaggleなど、大量に実験を行うような場面では、実験管理だけでも一苦労かと思います。 多分強いkagglerはもっと賢いやり方を使ってると思うので、そのへんも少しずつ調査していきたいなーとか思いました。