본문 바로가기

AI/MLflow

[MLflow] 개요

728x90
반응형

 

 

MLflow는 Machine Learning Lifecycle Platform으로 ML Lifecycle을 관리한다.

오픈소스 플랫폼이며 ML 학습 프로젝트의 전체 수명 주기에 중점을 두어 각 단계를 관리, 추적 및 재현할 수 있도록 보장한다.

 

주요기능 4가지

  • MLflow Tracking : ML을 학습할 때 생기는 각종 Parameters, Training 후 metric의 결과 등을 logging하고 logging 기록을 Web UI로 확인할 수 있다.
  • MLflow Projects : Anaconda, docker 등을 사용해서 만들어 둔 모델을 재현하고 실행할 수 있도록 코드 패키지 형식으로 지원, 이 형식으로 만들어진 환경을 재사용할 수 있다. 
  • MLflow Models : 동일한 모델을 Docker, Apache Spark, AWS 등에서 쉽게 배치할 수 있도록 지원
  • MLflow Model Registry : MLflow 모델의 전체 Lifecycle을 공동 관리하기 위한 centralized model store, set of API, UI

 

 

MLflow 시작하기

먼저 mlflow를 설치한다.

pip install mlflow

 

데이터 전처리 및 모델을 트레이닝하는 코드를 작성한다.

- 데이터는 iris 데이터를 사용해 보겠다.

from sklearn import datasets
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.ensemble import RandomForestClassifier
import tensorflow as tf
# Data Load


def dataLoad():
    X, y = datasets.load_iris(return_X_y=True, as_frame=True)
    return X, y

# model Training


class Iris_Model:
    def __init__(self) -> None:
        self.scaler = StandardScaler()
        # train
        self.train_X = self.train_y = None
        # valid
        self.valid_X = self.valid_y = None
        # test
        self.test_X = self.test_y = None
        # models
        self.sk_model = None
        self.ks_model = None

    def preprocessing(self, X, y, size=0.6) -> None:
        # split
        self.train_X, X_, self.train_y, y_ = train_test_split(
            X, y, train_size=size, random_state=42)
        self.valid_X, self.test_X, self.valid_y, self.test_y = train_test_split(
            X, y, train_size=0.5, random_state=42)
        # data scale
        self.train_X = self.scaler.fit_transform(self.train_X)
        self.valid_X = self.scaler.transform(self.valid_X)
        self.test_X = self.scaler.transform(self.test_X)

    def sklearn_model(self, n_estimator: int) -> dict:
        X, y = dataLoad()
        self.preprocessing(X, y)
        
        self.sk_model = RandomForestClassifier(
            n_estimators=n_estimator, max_depth=5)
        self.sk_model.fit(self.train_X, self.train_y)
        # tpre = self.sk_model.predict(self.train_X)
        vpre = self.sk_model.predict(self.valid_X)
        model_info = {
            'score': {
                'model_score': accuracy_score(y_true=self.valid_y, y_pred=vpre)
            },
            'params':
                self.sk_model.get_params()

        }
        return model_info

    def keras_model(self, epoch: int) -> dict:
        X, y = dataLoad()
        self.preprocessing(X, y)

        input_layer = tf.keras.Input(
            shape=(self.train_X.shape[1],), name="Inp_Layer")
        dense_1 = tf.keras.layers.Dense(
            32, activation='relu', name='d1')(input_layer)
        dense_2 = tf.keras.layers.Dense(
            10, activation='relu', name='d2')(dense_1)
        output = tf.keras.layers.Dense(
            3, activation='softmax', name='output')(dense_2)

        self.ks_model = tf.keras.Model(inputs=input_layer, outputs=output)
        self.ks_model.compile(
            loss='categorical_crossentropy', optimizer='adam', metrics=['acc'])
        y = pd.get_dummies(self.train_y).astype('int')
        self.ks_model.fit(
            self.train_X, y, epochs=epoch, batch_size=10
        )
        y = pd.get_dummies(self.valid_y).astype('int')
        model_info = {
            'score': {
                'model_score': np.float64(round(self.ks_model.evaluate(self.valid_X, y)[1], 2))
            },
            'params': {'epochs': epoch, 'batch_size': 10}
        }
        return model_info

 

MLflow와 함께 전체 코드를 실행하는 코드를 작성한다.

- 모델 훈련부터 검증 까지는 함수로 구현해줘야함.

from train import Iris_Model, dataLoad
# mlflow
import mlflow
from mlflow import sklearn as ml_sklearn
from mlflow import keras as ml_keras
from mlflow import log_artifacts, log_metric, log_metrics, log_param, log_params


def start(is_keras=1, n_estimator=20):
    iris = Iris_Model()
    X, y = dataLoad()
    if is_keras:
        tf_model, model_info = iris.keras_model(X, y, n_estimator)
        log_metrics(model_info['score'])
        log_params(model_info['params'])
        ml_keras.log_model(tf_model, 'DNN_keras')
        print("Model saved in run %s" % mlflow.active_run().info.run_uuid)
    else:
        model, model_info = iris.sklearn_model(X, y, n_estimator)
        log_metrics(model_info['score'])
        log_params(model_info['params'])
        ml_sklearn.log_model(model, 'RandomforestClassifier')
        print("Model saved in run %s" % mlflow.active_run().info.run_uuid)


if __name__ == "__main__":
    start(1)

 

MLflow - Tracking

 

log_metric(or log_metrics)

  • ML or DL 모델의 metric을 logging
  • accuarcy, f1-score, precision, recall ....

 

log_param(or log_params)

  • 모델에서 사용되는 파라미터 값을 저장
  • log_param은 하나하나 저장할 때 사용하며, json 형태로 저장하고 싶으면 log_params 사용

 

log_model(or log_model)

  • ML or DL 모델 저장

 

이렇게 코드를 실행하고 저장된 결과를 모니터링하는 방법은 터미널에 "mlflow ui"를 치면 된다.

mlflow ui

 

host를 변경할 수도 있다.

mlflow ui --host 0.0.0.0

or 

mlflow server --host 0.0.0.0
728x90
반응형

'AI > MLflow' 카테고리의 다른 글

[MLflow] Autologging  (0) 2024.02.28
[MLflow] MLflow Model Registry  (0) 2024.02.28
[MLflow] MLflow Models  (0) 2024.02.28
[MLflow] MLflow Project  (0) 2024.02.27
[MLflow] MLflow Tracking  (0) 2024.02.27