새소식

부스트캠프 AI Tech 4기

[Product Serving Part.3] MLFlow

  • -

ML 실험을 하면서 발생하는 문제점은 아래와 같다.

 

1) 실험을 추적하기 어렵다

2) 코드를 재현하기 어렵다

3) 모델을 패키징하고 배포하는 방법이 어렵다

4) 모델을 관리하기 위한 중앙 저장소가 없다

 

MLflow

위와 같은 문제점을 해결하기 위해 등장한 머신러닝 실험, 배포를 쉽게 관리할 수 있는 오픈소스

  • Experiment Management & Tracking
    • 머신러닝 관련 “실험”들을 관리하고, 각 실험의 내용들을 기록할 수 있음
      예를 들어, 여러 사람이 하나의 MLflow 서버 위에서 각자 자기 실험을 만들고 공유할 수 있음
    • 실험을 정의하고, 실험을 실행할 수 있음.
      이 실행은 머신러닝 훈련 코드를 실행한 기록 - 각 실행에 사용한 소스 코드, 하이퍼 파라미터, Metric, 부산물(모델 Artifact, Chart Image) 등을 저장
  • Model Registry
    • MLflow로 실행한 머신러닝 모델을 Model Registry(모델 저장소)에 등록할 수 있음
    • 모델 저장소에 모델이 저장될 때마다 해당 모델에 버전이 자동으로 올라감(Version 1 -> 2 -> 3)
    • Model Registry에 등록된 모델은 다른 사람들에게 쉽게 공유 가능하고, 쉽게 활용할 수 있음
  • Model Serving 
    • Model Registry에 등록한 모델을 REST API 형태의 서버로 Serving 할 수 있음
    • Input = Model의 Input
    • Output = Model의 Output
    • 직접 Docker Image 만들지 않아도 생성할 수 있음

 


MLflow 설치

pip install mlflow

or

conda install -c anaconda protobuf

https://bobbyhadz.com/blog/python-no-module-named-google-protobuf

 

▮ MLflow Tracking - Experiment

1. Experiment 생성

$ mlflow experiments create --experiment-name test

Created experiment 'test' with id 1

 

mlruns 폴더가 생기고 하위 폴더에 1이라는 폴더가 생김

 

2. Experiment 리스트 확인

$ mlflow experiments list

 

▮ MLflow 머신러닝 코드 작성

1. 폴더를 생성한 후 학습 코드와 MLProject 파일 생성

MLProject : 프로젝트 메타 정보 저장/ 프로젝트를 어떤 환경에서 실행시킬지 정의/ 패키지 모듈의 상단에 위치

 

폴더구조

logistic_regression
├── MLproject
└── train.py
# MLProject
name: tutorial

entry_points:
  main:
    command: "python train.py"
# train.py
import numpy as np
from sklearn.linear_model import LogisticRegression

import mlflow
import mlflow.sklearn

if __name__ == "__main__":
    X = np.array([-2, -1, 0, 1, 2, 1]).reshape(-1, 1)
    y = np.array([0, 0, 1, 1, 1, 0])

    penalty = "elasticnet"
    l1_ratio = 0.1
    lr = LogisticRegression(penalty=penalty, l1_ratio=l1_ratio, solver="saga")

    lr.fit(X, y)

    score = lr.score(X, y)
    print(f"Score: {score}")

    mlflow.log_param("penalty", penalty)
    mlflow.log_param("l1_ratio", l1_ratio)
    mlflow.log_metric("score", score)
    mlflow.sklearn.log_model(lr, "model")

 

▮ MLflow Tracking - Run

Run

  • 모델 학습 코드를 1번 실행

Run에서 로깅하는 것들

  • Source : 실행한 Project의 이름
  • Version : 실행 Hash 
  • Start & end time 
  • Parameters : 모델 파라미터 
  • Metrics : 모델의 평가 지표, Metric을 시각화할 수 있음
  • Tags : 관련된 Tag
  • Artifacts : 실행 과정에서 생기는 다양한 파일들(이미지, 모델 Pickle 등)

 

mlflow run logistic_regression --experiment-name test --no-conda
C:\Users\User\Desktop\mlflow\venv_mlflow\lib\site-packages\click\core.py:2322: FutureWarning: `--no-conda` is deprecated and will be removed in a future MLflow release. Use `--env-manager=local` instead.
  value = self.callback(ctx, self, value)
2022/11/11 14:57:57 INFO mlflow.projects.utils: === Created directory C:\Users\User\AppData\Local\Temp\tmpx8ygjxin for downloading remote URIs passed to arguments of type 'path' ===
2022/11/11 14:57:57 INFO mlflow.projects.backend.local: === Running command 'python train.py' in run with ID '06cefd3e8ca943bbbe2838650473544e' ===       
Score: 0.6666666666666666
2022/11/11 14:58:02 INFO mlflow.projects: === Run (ID '06cefd3e8ca943bbbe2838650473544e') succeeded ===

 

▮ MLflow Tracking - UI

ui 실행

mlflow ui

localhost:5000로 MLflow UI 접속할 수 있다.

 

 

▮ MLflow - Autolog

그러나 위 train.py처럼 모든 파라미터를 명시할 필요없이 아래처럼 작성하면 autolog를 해준다.

# train.py

import numpy as np
from sklearn.linear_model import LogisticRegression

import mlflow
import mlflow.sklearn

if __name__ == "__main__":
    mlflow.sklearn.autolog()

    X = np.array([-2, -1, 0, 1, 2, 1]).reshape(-1, 1)
    y = np.array([0, 0, 1, 1, 1, 0])

    penalty = "elasticnet"
    l1_ratio = 0.1
    lr = LogisticRegression(penalty=penalty, l1_ratio=l1_ratio, solver="saga")

    with mlflow.start_run() as run:
        lr.fit(X, y)

    score = lr.score(X, y)
    print(f"Score: {score}")

 

 

mlflow run logistic_regression_autolog --experiment-name test --no-conda

그러나 모든 라이브러리들의 auto logging을 지원해주지는 않는다.

지원해주는 라이브러리는 아래 docs를 참고

MLflow Tracking — MLflow 1.30.0 documentation

 

 

▮ MLflow - Parameter

MLProject 파일에 parameter를 명시해주면 사용할 수 있다.

name: tutorial

entry_points:
  main:
    parameters:
      solver:
        type: string
        default: "saga"
      penalty:
        type: string
        default: "l2"
      l1_ratio:
        type: float
        default: 0.1
    command: "python train.py {solver} {penalty} {l1_ratio}"
# train.py

import argparse
import sys

import numpy as np
from sklearn.linear_model import LogisticRegression

import mlflow
import mlflow.sklearn

if __name__ == "__main__":
    mlflow.sklearn.autolog()

    X = np.array([-2, -1, 0, 1, 2, 1]).reshape(-1, 1)
    y = np.array([0, 0, 1, 1, 1, 0])

    lr = LogisticRegression(solver=sys.argv[1], penalty=sys.argv[2], l1_ratio=float(sys.argv[3]))

    with mlflow.start_run() as run:
        lr.fit(X, y)

    score = lr.score(X, y)
    print("Score: %s" % score)

 

 

 

▮ MLflow - Hyperparameter tuning

하이퍼파라미터 튜닝도 가능하다.

from sklearn import svm, datasets
from sklearn.model_selection import GridSearchCV

import mlflow

def main():
    mlflow.sklearn.autolog()

    iris = datasets.load_iris()
    parameters = {"kernel": ("linear", "rbf"), "C": [1, 10]}
    svc = svm.SVC()
    clf = GridSearchCV(svc, parameters)

    with mlflow.start_run() as run:
        clf.fit(iris.data, iris.target)

if __name__ == "__main__":
    main()

 

 

 


Docker로 MLflow 환경 띄우기

 

MLflow는 도커 이미지를 공식적으로 제공해주지는 않아서 직접 만듬

# Dockerfile

FROM python:3.9.10-slim-buster

COPY requirements.txt mlflow/requirements.txt
WORKDIR mlflow

RUN apt-get update && \
    pip install pip --upgrade && \
    pip install -r requirements.txt
   
CMD ["mlflow", "ui", "-h", "0.0.0.0", "-p", "5000"]
# requirements.txt
mlflow==1.24.0

 

도커 이미지 빌드

docker build -t mlflow:1.24.0 .

도커 컨테이너 실행

docker run --name mlflow -p 5000:5000 -v $(pwd):/mlflow --rm mlflow:1.24.0

 

 

Docker-compose로도 할 수 있음

# docker-compose.yml
version: "3.7"

services:
  web_ui:
    image: mlflow:1.24.0
    ports:
      - 5000:5000
    volumes:
      - ./:/mlflow

 

그러면 해당 주소로 접근이 가능하다

127.0.0.1:5000/#/

 

 

728x90

'부스트캠프 AI Tech 4기' 카테고리의 다른 글

[WEEK08] CI  (0) 2022.11.14
[WEEK08] 회고  (0) 2022.11.14
[Product Serving Part.3] Docker  (0) 2022.11.10
[Product Serving Part.2] Streamlit  (0) 2022.11.08
[Product Serving Part.2] Voila  (0) 2022.11.08
Contents