MLflow

홍찬우·2023년 7월 30일
1

MLflow 개념 잡기

MLflow가 없던 시절

  • 사람들이 각자 자신의 코드를 Jupyter에 작성

  • ML model 학습시 사용한 파라미터, metric을 따로 기록

⇒ 실험 추적, 코드 재현, 모델 패키징·배포가 모두 어려움


MLflow

  • 머신러닝 실험, 배포를 쉽게 관리할 수 있는 오픈소스

  • CLI, GUI (웹 인터페이스) 환경 지원

  • 코드 예시


MLflow 핵심 기능

  1. Experiment Management & Tracking

    • 머신러닝 실험들을 관리하고, 각 실험 내용 기록 가능

    • 여러 사람이 하나의 MLflow 서버 위에서 각자 자기 실험을 만들고 공유 가능

    • 실험을 정의하고, 실행

      • 각 실행에 사용한 소스 코드, 하이퍼 파라미터, metric, artifact 저장 가능
  2. Model Registry

    • MLflow로 실행한 ML model을 Model Registry(모델 저장소)에 등록 가능

    • 모델 저장소에 모델이 저장될 때마다 해당 모델에 버전이 자동으로 올라감

    • 등록된 모델은 다른 사람들에게 쉽게 공유 가능

  3. Model Serving

    • Model Registry에 등록한 모델을 REST API 형태의 서버로 Serving 가능

MLflow Component

  1. MLflow Tracking

    • 머신러닝 코드 실행, 로깅을 위한 API, UI

    • MLflow Tracking을 사용해 결과를 로컬, 서버에 기록해 여러 실행과 비교 가능

    • 팀에선 다른 사용자의 결과와 비교하며 실험

  2. MLflow Project

    • 머신러닝 프로젝트 코드를 패키징하기 위한 표준

    • Project

      • 간단하게 소스 코드가 저장된 폴더

      • 의존성과 어떻게 실행해야 하는지 저장

    • MLflow Tracking API를 사용해 MLflow는 프로젝트 버전을 모든 파라미터와 자동으로 로깅

  3. MLflow Model

    • 모델은 모델 파일과 코드로 저장

    • 다양한 플랫폼에 배포할 수 있는 도구 제공

  4. MLflow Registry

    • MLflow Model의 전체 lifecycle에서 사용할 수 있는 중앙 모델 저장소

MLflow Tracking - Experiment

  • MLflow에서 제일 먼저 Experiment 생성

  • 하나의 Experiment는 진행하고 있는 머신러닝 프로젝트 단위로 구성

    • e.g., 개/고양이 분류 실험, 택시 수요량 예측 분류 실험
  • 정해진 Metric으로 모델 평가

    • e.g., RMSE, MSE
  • 하나의 Experiment는 여러 Run을 가짐


Experiment Code

  • Experiment 생성

    • mlflow experiments create --experiment-name “실험 이름”

    • mlflow experiments list 명령어로 experiment 리스트 확인

  • 머신러닝 코드

    • autolog가 아닌, 각각을 log_param으로 로깅

MLflow Project

  • 프로젝트 (MLProject)

    • MLProject라는 고정된 이름으로 사용해야 함

    • MLflow를 사용한 코드의 프로젝트 메타 정보 저장

    • 프로젝트를 어떤 환경에서 어떻게 실행시킬지 정의

    • 패키지 모듈 상단에 위치

name: tutorial

entry_points:
  main:
    command: "python train.py"
  • command: 실행할 코드 파일 이름

MLflow Tracking - Run

  • Run (실행)

    • 하나의 Run은 코드 1번 실행한 것 의미

    • 보통 Run은 모델 학습 코드 실행

    • 한 번의 코드 실행 = 하나의 Run 생성

    • Run을 하면 여러 내용이 기록 됨

  • Run에서 로깅하는 것들

    1. Source: 실행 Project 이름

    2. Version: 실행 hash

    3. Start & End time

    4. Parameters: model parameter

    5. Metrics: 모델 평가 지표, 시각화 가능

    6. Tags: 관련 tag

    7. Artifacts: 이미지, 모델 pickle과 같은 부산물

  • mlflow run “MLflow 디렉토리 이름” --experiment-name “실험 이름”


MLflow Tracking - UI

  • mlflow ui

  • localhost:5000 으로 접속

  • Artifacts에 requirements, model pkl 등 저장되어 있음


MLflow Tracking - Experiment & Run 관계

  • 한 실험 안에 여러 Run이 있으며, 각 Run의 파라미터는 모두 다를 수 있음

MLflow autolog

  • autolog 활용 전
    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("Score: %s" % score)
       
        mlflow.log_param("penalty", penalty)
        mlflow.log_param("l1_ratio", l1_ratio)
        mlflow.log_metric("score", score)
        mlflow.sklearn.log_model(lr, "model")

  • autolog 활용 후
    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("Score: %s" % score)
    • 일일이 파라미터를 log param으로 기록할 필요가 없어짐

MLflow Parameter

  • parameter 활용 전

    • 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__":
          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("Score: %s" % score)

  • parameter 활용 후
    • MLProject
      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 run “MLflow 디렉토리 이름” --experiment-name “실험 이름” -P solver="", -P penalty="", -P l1_ratio= 와 같은 명령어로 실행

MLflow Hyper Parameter 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()



MLflow 서버로 배포하기

MLflow Architecture

  1. Python code

    • 모델을 만들고 학습하는 코드

    • mlflow run으로 실행

  2. Tracking Server

    • 파이썬 코드가 실행되는 동안 파라미터, metric, 모델 등 메타 정보 저장

    • 파일 혹은 DB에 저장

  3. Artifact Store

    • 파이썬 코드가 실행되는 동안 생기는 model file, image 등의 아티팩트 저장

    • 파일 혹은 스토리지에 저장


MLflow Tracking Server와 외부 Storage 사용

  • localhost:5000은 로컬에 존재하는 외부 스토리지

    • 실제론 외부 db를 이용






※ 모든 이미지 및 코드 출처는 네이버 커넥트재단 부스트캠프 AI Tech 5기입니다. ※

profile
AI-Kid

0개의 댓글

관련 채용 정보