Traffine I/O

Bahasa Indonesia

2023-01-06

MLflow Tracking

Apa itu MLflow

MLflow adalah alat OSS untuk mengelola siklus hidup ML. Mlflow menawarkan fungsi-fungsi berikut:

  • MLFlow Tracking: manajemen eksperimen
  • MLFlow Projects: manajemen lingkungan runtime
  • MLFlow Models: menyebarkan dan menyalurkan model Anda
  • MLFlow Model Registry: pembuatan versi model

Artikel ini membahas MLflow Tracking, sebuah fitur manajemen eksperimen.

Pelacakan MLflow

Manajemen eksperimen MLflow terdiri dari tiga komponen berikut.

  • Run
    Sebuah percobaan tunggal (misalnya, percobaan, studi)
  • Experiment
    Sebuah grup yang mengikat Runs bersama-sama.
  • Artifact
    Penyimpanan output atau produk antara dari sebuah Run

MLFlow architecture

Mari kita benar-benar menggunakan Pelacakan MLflow. Pertama, instal pustaka.

$ pip install mlflow

Kemudian simpan kode berikut di main.py dan jalankan.

main.py
import os
from random import random, randint
from mlflow import log_metric, log_param, log_artifact, 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") # Record folder
$ python main.py

Sebuah folder mlruns dan sebuah folder outputs akan dibuat.

.
├── __init__.py
├── main.py
├── mlruns
│   └── 0
│       ├── 21af48fda35a4aa1b61ef3622f71e4c0
│       │   ├── artifacts
│       │   │   └── test.txt
│       │   ├── meta.yaml
│       │   ├── metrics
│       │   │   └── foo
│       │   ├── params
│       │   │   └── param1
│       │   └── tags
│       │       ├── mlflow.runName
│       │       ├── mlflow.source.git.commit
│       │       ├── mlflow.source.name
│       │       ├── mlflow.source.type
│       │       └── mlflow.user
│       └── meta.yaml
└── outputs
    └── test.txt

0 adalah ID dari Experiment dan 21af48fda35a4aa1b61ef3622f71e4c0 adalah ID dari Run.

Jalankan perintah mlflow ui.

$ mlflow ui

[2023-01-08 15:41:46 +0900] [54928] [INFO] Starting gunicorn 20.1.0
[2023-01-08 15:41:46 +0900] [54928] [INFO] Listening at: http://127.0.0.1:5000 (54928)
[2023-01-08 15:41:46 +0900] [54928] [INFO] Using worker: sync
[2023-01-08 15:41:46 +0900] [54930] [INFO] Booting worker with pid: 54930
[2023-01-08 15:41:47 +0900] [54931] [INFO] Booting worker with pid: 54931
[2023-01-08 15:41:47 +0900] [54932] [INFO] Booting worker with pid: 54932
[2023-01-08 15:41:47 +0900] [54933] [INFO] Booting worker with pid: 54933
[2023-01-08 15:41:55 +0900] [54928] [INFO] Handling signal: winch
[2023-01-08 15:41:58 +0900] [54928] [INFO] Handling signal: winch

Anda bisa mengakses http://127.0.0.1:5000 untuk melihat hasil eksperimen di browser Anda.

mlflow ui | 1
mlflow ui | 2
mlflow ui | 3

Eksperimen yang akan dikontrol

Dalam MLflow, empat nilai utama berikut ini dikendalikan.

  • Parameters
    Parameter untuk eksekusi eksperimen
  • Tags
    Tag untuk eksekusi eksperimen
  • Metrics
    Metrik dari eksperimen
  • Artifacts
    File yang dihasilkan oleh eksperimen

Fungsi pencatatan

MLflow dapat mencatat data ke Run menggunakan Python, R, Java, atau REST API.

https://mlflow.org/docs/latest/tracking.html#logging-functions

Server MLflow Tracking

Anda dapat menggunakan perintah mlflow server untuk mengatur server Tracking MLflow.

$ mlflow server \
    --backend-store-uri /mnt/persistent-disk \
    --default-artifact-root s3://my-mlflow-bucket/ \
    --host 0.0.0.0

Server Tracking MLflow memiliki dua komponen terkait penyimpanan

  • Backend Stores (--backend-store-uri)
  • Artifact Stores (--default-artifact-root)

Backend Stores

Backend Store adalah tempat untuk menyimpan metadata eksperimen dan eksekusi, parameter eksekusi, metrik, dan tag.

Backend Store berikut dapat ditentukan dalam --backend-store-uri.

  • Sistem berkas lokal
    • . /path_to_store
    • file:/path_to_store
  • DB yang kompatibel dengan SQLAlchemy
    • <dialect>+<driver>://<username>:<password>@<host>:<port>/<database>

Nilai default dari --backend-store-uri adalah . /mlruns.

Artifact Stores

Artifact Stores adalah tempat penyimpanan Artifacts. Artifact Stores mendukung sistem file berikut ini

  • Amazon S3
  • Google Cloud Storage
  • Azure Blob Storage
  • FTP server
  • SFTP Server
  • NFS
  • HDFS

--default-artifact-root menentukan lokasi artefak default.

Pencatatan otomatis

MLflow menggunakan fitur yang disebut pencatatan otomatis untuk secara otomatis mencatat metrik, parameter, dan model tanpa secara eksplisit menulis kode pencatatan. Pustaka berikut mendukung pencatatan otomatis

  • Scikit-learn
  • Keras
  • Gluon
  • XGBoost
  • LightGBM
  • Statsmodels
  • Spark
  • Fastai
  • Pytorch

Ada dua cara untuk menggunakan pencatatan otomatis:

  • Panggil fungsi mlflow.autolog() sebelum kode pembelajaran
  • Panggil fungsi khusus library (misalnya mlflow.sklearn.autolog())

Kode berikut ini adalah contoh dari autologging sklearn.

import mlflow

from sklearn.model_selection import train_test_split
from sklearn.datasets import load_diabetes
from sklearn.ensemble import RandomForestRegressor

mlflow.autolog()

db = load_diabetes()
X_train, X_test, y_train, y_test = train_test_split(db.data, db.target)

# Create and train models.
rf = RandomForestRegressor(n_estimators = 100, max_depth = 6, max_features = 3)
rf.fit(X_train, y_train)

# Use the model to make predictions on the test dataset.
predictions = rf.predict(X_test)
autolog_run = mlflow.last_active_run()

Automatic Logging

Eksperimen LightGBM

Mari kita bereksperimen dengan klasifikasi LightGBM dari dataset iris mata.

Pertama, siapkan server Pelacakan MLflow.

lightgbm_experiment.py
$ mlflow server \
  --backend-store-uri ./mlruns \
  --default-artifact-root gs://GCS_BUCKET/mlruns \
  --host 0.0.0.0

Kemudian jalankan kode berikut dua kali.

lightgbm_experiment.py
from datetime import datetime
import lightgbm as lgb
from sklearn import datasets
from sklearn.model_selection import train_test_split
import mlflow

params = dict(
    test_size=0.2,
    random_state=42,
)

iris = datasets.load_iris()
X, y = iris.data, iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, **params)

lgb_params = dict(
    learning_rate=0.05,
    n_estimators=500,
)
model = lgb.LGBMClassifier(**lgb_params)

def mlflow_callback():
    def callback(env):
        for name, loss_name, loss_value, _ in env.evaluation_result_list:
            mlflow.log_metric(key=loss_name, value=loss_value, step=env.iteration)
    return callback

mlflow.set_tracking_uri("http://127.0.0.1:5000")
mlflow.set_experiment("EXP-1")

with mlflow.start_run(run_name=str(datetime.now())):
    mlflow.log_params({**params, **lgb_params})
    model.fit(
        X_train,
        y_train,
        eval_set=(X_test, y_test),
        eval_metric=["softmax"],
        callbacks=[
            lgb.early_stopping(10),
            mlflow_callback(),
        ])
    # Log an artifact (output file)
    with open("output.txt", "w") as f:
        f.write("Hello world!")
    mlflow.log_artifact("output.txt")
$ lightgbm_experiment.py
$ lightgbm_experiment.py

Ketika Anda membuka http://127.0.0.1:5000, Anda akan melihat dua Run dalam Eksperimen yang disebut EXP-1.

mlflow ui | 4

Referencsi

https://www.mlflow.org/docs/latest/quickstart.html
https://mlflow.org/docs/latest/tracking.html

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!