본문 바로가기

AI/MLflow

[MLflow] MLflow Project

728x90
반응형

 

 

MLflow Project는 주로 규칙을 기반으로 재사용 및 재현 가능한 방식으로 데이터 과학 코드를 패키징 하기 위한 형식이다.

프로젝트 구성 요소에는 프로젝트 실행을 위한 API 및 명령줄 도구가 포함되어 있어 프로젝트를 workflow와 함께 연결할 수 있다.

 

YAML 형식의 텍스트 파일을 추가하여 프로젝트를 더 자세히 설명할 수 있다. 각 프로젝트는 여러 속성을 지정할 수 있다.

 

MLproject File

MLproject File은 MLflow 프로젝트의 구성 파일로, 프로젝트의 메타데이터와 실행 단계를 정의하는 데 사용된다.

MLproject 파일은 MLflow에서 프로젝트를 실행하고 관리하는 데 필요한 정보를 제공한다.

 

일반적으로 Project Root 디렉토리에 존재하며, YAML 형식으로 작성된다. (이름, 환경, 실행 단계 등을 명시한다.)

 

name : 프로젝트의 이름을 지정한다.

 

python(or conda or docker)_env : 환경 파일의 경로를 지정, 프로젝트 실행에 필요한 패키지와 종속성을 정의, mlflow는 이 환경을 사용하여 실행환경 구성

 

entry_points : 프로젝트의 실행 단계를 정의, 각 실행 단계는 이름과 명령을 가지며, 해당 명령은 프로젝트 실행 시 실행

name: DNN_iris_Classifier
conda_env: conda.yaml
# or
# python_env : python_env.yaml
# or
# docker_env :
#     image : mlflow-docker-example

entry_points:
    main:
        parameters:
            num_epochs: { type:int, default:20 }
        command: "python3 main.py --num_epochs {num_epochs}"

 

이제 학습과 tracking 하는 코드를 작성해보자.

# train.py
import mlflow
import tensorflow as tf
import pandas as pd
import numpy as np
from mlflow.tensorflow import MLflowCallback
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split


def tf_model(train_x, train_y, val_x, val_y, run, epoch=100, batch_size=8):
    inp_layer = tf.keras.Input(shape=(train_x.shape[1],))
    d1 = tf.keras.layers.Dense(16, activation='relu')(inp_layer)
    d2 = tf.keras.layers.Dense(8, activation='relu')(d1)
    out = tf.keras.layers.Dense(3, activation='softmax')(d2)

    model = tf.keras.Model(inputs=inp_layer, outputs=out,
                           name="Iris_Classifier_Model")
    model.compile(optimizer='adam',
                  loss='categorical_crossentropy', metrics=['acc'])
    history = model.fit(train_x, train_y, epochs=epoch,
                        batch_size=batch_size, callbacks=[MLflowCallback(run=run)])
    history = pd.DataFrame(history.history)
    metrics = {
        'score': {
            'model_score': np.float64(round(model.evaluate(val_x, val_y)[1], 2))
        },
        'params': {'epochs': epoch, 'batch_size': batch_size}
    }
    return model, history, metrics


if __name__ == "__main__":
    dataset = pd.read_csv("./dataset.csv")
    X = dataset.iloc[:, 0:-3]
    y = dataset.iloc[:, -3:]

    train_x, val_x, train_y, val_y = train_test_split(
        X, y, test_size=0.2, random_state=42)
    scaler = StandardScaler()
    sxtrain = scaler.fit_transform(train_x)
    sxval = scaler.transform(val_x)

    # tf_model(sxtrain, train_y, sxval, val_y, run=run)

# main.py
from datetime import datetime
import mlflow
import mlflow.keras
from train import tf_model
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split


def train(num_epochs: int):
    dataset = pd.read_csv("./dataset.csv")
    X = dataset.iloc[:, 0:-3]
    y = dataset.iloc[:, -3:]

    train_x, val_x, train_y, val_y = train_test_split(
        X, y, test_size=0.2, random_state=42)
    scaler = StandardScaler()
    sxtrain = scaler.fit_transform(train_x)
    sxval = scaler.transform(val_x)

    # 모델을 아티팩트로 기록
    # mlflow.create_experiment("Iris Classifier")
    # mlflow.set_experiment(name)
    with mlflow.start_run() as run:

        model, history, metrics = tf_model(
            sxtrain, train_y, sxval, val_y, run=run, epoch=num_epochs)

        mlflow.log_metrics(metrics['score'])
        mlflow.log_params(metrics['params'])
        tags = {
            "Version": "0.0.1",
            "Type": "Classifier",
            "Algorithm": "Keras, Dense"
        }
        mlflow.set_tags(tags)
        # 모델 저장
        mlflow.keras.log_model(
            model, "Iris_Classifier_DNN", input_example=sxval)
    mlflow.end_run()


if __name__ == "__main__":
    # 명령줄 인수에서 num_epochs 값을 가져옴
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument("--num_epochs", type=int, default=10,
                        help="Number of epochs for training")

    args = parser.parse_args()
    # 훈련 실행
    train(args.num_epochs)
# conda.yaml
channels:
    - conda-forge
dependencies:
    - python=3.9.0
    - pip<=23.3.2
    - pip:
          - mlflow==2.10.0
          - cloudpickle==3.0.0
          - numpy==1.22.0
          - tensorflow-macos==2.13.0
          - tensorflow==2.13.0
name: mlflow-env

 

이제 mlflow project를 생성한다.

git repository가 없으면 프로젝트 경로를 입력한다.(예시는 프로젝트 경로)

mlflow run -e main -P num_epochs=100 --experiment-name="Iris Classifier" --run-name="iris_DNN" /Users/pupba/Documents/study/mlflowstudy/DNN_iris
  • --experiment-name : 실험 이름 설정 
  • --run-name : run_name 설정

 

* Mac m1에서 MLflow 와 tensorflow 간의 버전 충돌을 있으므로 잘 확인해서 사용하기

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 Tracking  (0) 2024.02.27
[MLflow] 개요  (0) 2024.02.27