MLflow가 없던 시절
사람들이 각자 자신의 코드를 Jupyter에 작성
ML model 학습시 사용한 파라미터, metric을 따로 기록
⇒ 실험 추적, 코드 재현, 모델 패키징·배포가 모두 어려움
머신러닝 실험, 배포를 쉽게 관리할 수 있는 오픈소스
CLI, GUI (웹 인터페이스) 환경 지원
코드 예시
Experiment Management & Tracking
머신러닝 실험들을 관리하고, 각 실험 내용 기록 가능
여러 사람이 하나의 MLflow 서버 위에서 각자 자기 실험을 만들고 공유 가능
실험을 정의하고, 실행
Model Registry
MLflow로 실행한 ML model을 Model Registry(모델 저장소)에 등록 가능
모델 저장소에 모델이 저장될 때마다 해당 모델에 버전이 자동으로 올라감
등록된 모델은 다른 사람들에게 쉽게 공유 가능
Model Serving
MLflow Tracking
머신러닝 코드 실행, 로깅을 위한 API, UI
MLflow Tracking을 사용해 결과를 로컬, 서버에 기록해 여러 실행과 비교 가능
팀에선 다른 사용자의 결과와 비교하며 실험
MLflow Project
머신러닝 프로젝트 코드를 패키징하기 위한 표준
Project
간단하게 소스 코드가 저장된 폴더
의존성과 어떻게 실행해야 하는지 저장
MLflow Tracking API를 사용해 MLflow는 프로젝트 버전을 모든 파라미터와 자동으로 로깅
MLflow Model
모델은 모델 파일과 코드로 저장
다양한 플랫폼에 배포할 수 있는 도구 제공
MLflow Registry
MLflow Tracking - Experiment
MLflow에서 제일 먼저 Experiment 생성
하나의 Experiment는 진행하고 있는 머신러닝 프로젝트 단위로 구성
정해진 Metric으로 모델 평가
하나의 Experiment는 여러 Run을 가짐
Experiment Code
Experiment 생성
mlflow experiments create --experiment-name “실험 이름”
mlflow experiments list
명령어로 experiment 리스트 확인
머신러닝 코드
MLflow Project
프로젝트 (MLProject)
MLProject라는 고정된 이름으로 사용해야 함
MLflow를 사용한 코드의 프로젝트 메타 정보 저장
프로젝트를 어떤 환경에서 어떻게 실행시킬지 정의
패키지 모듈 상단에 위치
name: tutorial
entry_points:
main:
command: "python train.py"
MLflow Tracking - Run
Run (실행)
하나의 Run은 코드 1번 실행한 것 의미
보통 Run은 모델 학습 코드 실행
한 번의 코드 실행 = 하나의 Run 생성
Run을 하면 여러 내용이 기록 됨
Run에서 로깅하는 것들
Source: 실행 Project 이름
Version: 실행 hash
Start & End time
Parameters: model parameter
Metrics: 모델 평가 지표, 시각화 가능
Tags: 관련 tag
Artifacts: 이미지, 모델 pickle과 같은 부산물
mlflow run “MLflow 디렉토리 이름” --experiment-name “실험 이름”
MLflow Tracking - UI
mlflow ui
localhost:5000 으로 접속
Artifacts에 requirements, model pkl 등 저장되어 있음
MLflow Tracking - Experiment & Run 관계
MLflow 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")
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)
MLflow Parameter
parameter 활용 전
name: tutorial
entry_points:
main:
command: "python 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)
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}"
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()
Python code
모델을 만들고 학습하는 코드
mlflow run
으로 실행
Tracking Server
파이썬 코드가 실행되는 동안 파라미터, metric, 모델 등 메타 정보 저장
파일 혹은 DB에 저장
Artifact Store
파이썬 코드가 실행되는 동안 생기는 model file, image 등의 아티팩트 저장
파일 혹은 스토리지에 저장
MLflow Tracking Server와 외부 Storage 사용
localhost:5000은 로컬에 존재하는 외부 스토리지
※ 모든 이미지 및 코드 출처는 네이버 커넥트재단 부스트캠프 AI Tech 5기입니다. ※