All Articles

MLFlow の TrackingAPI を Quickstart して保存されたデータを覗いてみる

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_metriclog_paramlog_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 などを組み合わせて使うことになるのだと思います。

とはいえ、まずは今回試したように、ローカルのファイルに出力するところからでも気軽に使い始められそうです。