MLFlow を少しさわってみようと思い、特に気になった TrackingAPI をさわってみつつ、データがどう保存されるのかを覗いてみました。
環境
- Ubuntu 20.04.3 LTS
- Python 3.8.3
- mlflow 1.20.0
MLFlow のインストール
MLFlow 自体は pip install mlflow
で簡単に導入できます。
サンプルコードの実行
公式ドキュメントの Quickstart に書かれている以下の内容のファイルを作成します。
import os from random import random, randint from mlflow import log_metric, log_param, log_artifacts if __name__ == "__main__": # Log a parameter (key-value pair) log_param("param1", randint(0, 100)) # Log a metric; metrics can be updated throughout the run log_metric("foo", random()) log_metric("foo", random() + 1) log_metric("foo", random() + 2) # Log an artifact (output file) if not os.path.exists("outputs"): os.makedirs("outputs") with open("outputs/test.txt", "w") as f: f.write("hello world!") log_artifacts("outputs")
python コマンドで実行します。
$ python mlflow_tracking.py
上記のサンプルコードが実行され、log_metric
、log_param
、log_artifacts
で指定した内容が保存されました。
保存された内容は、mlflow ui
コマンドで起動した Web UI で可視化できます。
できたファイルの一覧
デフォルトでは ./mlruns ディレクトリ以下にデータが出力されるようなので、それを見ていきます。
まず、tree コマンドで、出力されたファイルの一覧を見てみます。
$ tree
.
├── mlflow_tracking.py
├── mlruns
│ └── 0
│ ├── d0b221068a7147afb0177cd3fb9fb5cf
│ │ ├── artifacts
│ │ │ └── test.txt
│ │ ├── meta.yaml
│ │ ├── metrics
│ │ │ └── foo
│ │ ├── params
│ │ │ └── param1
│ │ └── tags
│ │ ├── mlflow.source.name
│ │ ├── mlflow.source.type
│ │ └── mlflow.user
│ └── meta.yaml
└── outputs
└── test.txt
8 directories, 10 files
各ファイルの中身
それでは、各ファイルについて見ていきます。
mlruns/0 ディレクトリ
meta.yaml
artifact_location: file:///home/oshima/mlflow_tracking/mlruns/0
experiment_id: '0'
lifecycle_stage: active
name: Default
「0」という experiment に対するメタデータのようです。
mlruns/0/d0b221068a7147afb0177cd3fb9fb5cf ディレクトリ
meta.yaml
artifact_uri: file:///home/oshima/mlflow_tracking/mlruns/0/d0b221068a7147afb0177cd3fb9fb5cf/artifacts
end_time: 1629894186654
entry_point_name: ''
experiment_id: '0'
lifecycle_stage: active
name: ''
run_id: d0b221068a7147afb0177cd3fb9fb5cf
run_uuid: d0b221068a7147afb0177cd3fb9fb5cf
source_name: ''
source_type: 4
source_version: ''
start_time: 1629894186647
status: 3
tags: []
user_id: oshima
「d0b221068a7147afb0177cd3fb9fb5cf」という run に対するメタデータのようです。
artifacts/test.txt
$ cat test.txt
hello world!
artifacts ディレクトリ以下には、log_artifact で指定したファイルが出力されるようです。
metrics/foo
1629894186651 0.10226160404903561 0
1629894186652 1.4250551980391988 0
1629894186652 2.904784967403418 0
log_metric で指定したログが、UNIX 時間とともに記録されています。
params/param1
16
log_param で指定した値です。
tags/mlflow.source.name
mlflow_tracking.py
tags/mlflow.source.type
LOCAL
tags/mlflow.user
oshima
tags 以下は、実行されたファイルや実行環境についての記録のようです。
感想
以上、MLFlow の TrackingAPI で出力されるデータを覗いてみました。
ここまでさわってみて、MLFlow の TrackingAPI は、非常に簡単に導入できる素晴らしいツールだなと思いました。
パラメータなどを記録したいというユースケースは非常によくあることで、そういった際に、独自実装せずに MLFlow というライブラリで解決できるのは、とても便利だと思います。
Automatic Logging を使うことで、対応するライブラリのパラメータは自動的に保存されるとのことで、これもとても便利そうです。
保存先について
ドキュメント を見たところ、データの保存先としては RDB やオブジェクトストレージなどを組み合わせて使えるようです。
チームで利用する際は、RDS などの DBaaS と S3 などを組み合わせて使うことになるのだと思います。
とはいえ、まずは今回試したように、ローカルのファイルに出力するところからでも気軽に使い始められそうです。