MLflow

-·2022년 1월 17일
1

강의정리 - MLOps

목록 보기
14/18

이번에도 마찬가지로 강의영상은 없이 강의자료를 통해 정리를 하려고 한다.
저번 Logging 강의자료에서 느꼈지만 강의자료만으로 인터넷 검색이 거의 불필요했다. 몹시 쉽게 잘 정리된 강의자료라서 이해도 잘되고 기초를 쌓기 좋았다. Logging의 경우 실습을 진행하지 않았는데, 후에 한 번에 실습을 진행하며 인터넷을 뒤져보고, 익히며 따로 정리해보겠다.
github repo를 보며 따라가는 정도?!

이 글은 네이버 부스트캠프 ai tech 변성윤님의 강의자료를 정리한 글입니다. 문제가 있거나 틀린점이 있다면 말씀해주세요! :)

목차

  • MLflow 개념 잡기
    -- MLflow란
    -- MLflow 실습하며 알아보기
    -- MLflow 아키텍처

  • MLflow 서버로 배포하기
    -- Tracking Server와 외부 스토리지 사용하기
    -- MLflow 실제 활용 사례

MLflow 개념잡기

MLflow가 없던 시절

  • 사람들이 각자 자신의 코드를 Jupyter Notebook에서 작성
  • 머신러닝 모델 학습시 사용한 Parameter, Metric을 따로 기록
  • 구글 스프레드시트 활용하여 모델,파라미터 등등 활용
  • 개인컴퓨터, 연구실 서버를 사용하다가 메모리 초과로 Memory Exceed 오류 발생 -> 기록 못했다.
  • 학습하며 생긴 Weight File을 저장해 다른 동료들에게 공유
  • Weight File 이름으로 Model Versioning을 하거나 아예 Versioning을 하지 않음

MLflow가 해결하려고 했던 Pain Point

  • 실험을 추적하기 어렵다.
  • 코드를 재현하기 어렵다.
  • 모델을 패키징하고 배포하는 방법이 어렵다.
  • 모델을 관리하기 위한 중앙 저장소가 없다.

MLflow란

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

관련 오픈소스 중 제일 빠르게 성장 중
맛보기
CLI, GUI(웹 인터페이스) 지원

Code 예시

import numpy as np 
from sklearn.linear_model import LinearRegression
import mlflow

def main():
	#enable autologging
    mlflow.autolog(log_input_examples=True)
    
    #prepare training data
    x= np.array([[1,1],[1,2],[2,2],[2,3]])
    y= np.dot(X,np.array(1,2))+3
    
    #train a model
    model= LinearRegression()
    with mlflow.start_run() as run:
    	model.fit(X,y)
        print("Logged data and model in run {}".format(run.info.run_id))

if __name__=="__main__":
	main()

with mlflow.start_run() as run: 과 run.info.run_id를 통해 간단하게 기록할 수 있다.

예전 모델서빙 강의 초반부에 타코집 예시에서 (나는 옷가게에 비교하려했었다.)
집에서 요리만들때, 레시피를 기록해야 어떤 조합이 좋은지 알 수 있음(파라미터, 모델 구조 등) => mlflow
여러 시행착오를 겪으며 요리함(머신러닝 모델링도 많은 실험을 함!) => mlflow
이 레시피에서 제일 맛있었던(성능이 좋았던)레시피를 레스토랑에 사용한다 => mlflow
요리 만드는 과정에서 생기는 부산물 저장!(=모델 Artifact, 이미지 등) => mlflow
타코(모델)은 다양한 종류가 있으므로 언제 만든 타코인지(=모델 생성일), 얼마나 맛있었는지(모델 성능), 유통기한 등(=모델 메타 정보)을 기록해둘 수 있음 => mlflow
언제부터 닭고기 타코, 돼지고기 타코, 부리또를 만들어 판매(=여러 모델 운영) => mlflow

위의 기능들,, 혹시 WandB의 상위호환 버전인가?!

MLflow 핵심 기능 !

1. Experiment Management & Tracking

  • 머신러닝 관련 "실험"들을 관리하고, 각 실험의 내용들을 기록할 수 있음
    -- 예를 들어, 여러 사람이 하나의 MLflow 서버위에서 각자 자기 실험을 만들고 공유할 수 있음
  • 실험을 정의하고, 실험을 실행할 수 있음. 이 실행은 머신러닝 훈련 코드를 실행한 기록
    -- 각 실행에 사용한 소스 코드, 하이퍼 파라미터, Metric, 부산물(모델 Artifact, Chart Image)등을 저장

2. Model Registry

  • MLflow로 실행한 머신러닝 모델을 Model Registry(모델 저장소)에 등록할 수 있음

  • 모델 저장소에 모델이 저장될 때마다 해당 모델에 버전이 자동으로 올라감(Version 1->2->3..)

  • Model Registry에 등록된 모델은 다른 사람들에게 쉽게 공유 가능하고, 쉽게 활용할 수 있음

Git과 docker와 유사하다?!

3. Model Serving

  • Model Registry에 등록한 모델을 REST API형태의 서버로 Serving 할 수 있음
  • Input = Model의 Input
  • Output = Model의 Output
  • 직접 Docker Image 만들지 않아도 생성할 수 있음

MLflow Component

1. MLflow Tracking

  • 머신러닝 코드 실행, 로깅을 위한 API, UI
  • MLflow Tracking을 사용해 결과를 Local, Server에 기록해 여러 실행과 비교할 수 있음
  • 팀에선 다른 사용자의 결과와 비교하며 협업할 수 있음

2. MLflow Project

  • 머신러닝 프로젝트 코드를 패키징하기 위한 표준
  • Project
    -- 간단하게 소스코드가 저장된 폴더
    -- Git Repo
    -- 의존성과 어떻게 실행해야 하는지 저장
  • MLflow Tracking API를 사용하면 MLflow는 프로젝트 버전을 모든 파라미터와 자동으로 로깅

3. MLflow Model

  • 모델은 모델파일과 코드로 저장
  • 다양한 플랫폼에 배포할 수 있는 여러 도구 제공
  • MLflow Tracking API를 사용하면 MLflow는 자동으로 해당 프로젝트에 대한 내용을 사용함

4. MLflow Registry

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

MLflow 실습하며 알아보기

pip install mlflow

Experiment(실험)

  • MLflow에서 제일 먼저 Experiment를 생성
  • 하나의 Experiment는 진행하고 있는 머신러닝 프로젝트 단위로 구성
    -- 예) "개/고양이 이미지 분류 실험", "택시 수요량 예측 분류 실험"
  • 정해진 Metric으로 모델을 평가
    -- 예) RMSE, MSE, MAE, Accuracy
  • 하나의 Experiment는 여러 Run(실행)을 가짐
mlflow experiments create --experiment-name my-first-experiment
ls -al

을 사용해 폴더 확인하면 mlruns라는 폴더가 생김


mlruns/0/meta.yaml
mlruns/1/meta.yaml
생성됨. 얘넨 초기세팅으로 주는듯 하다.

역시 까불지말고 강의 좀 들을걸.

mlflow experiments list

실행하면

로 실험중인 리스트를 확인할 수 있었고, 0은 default 1은 방금 내가 만든 experiment !

폴더를 생성한 후, 머신러닝 코드 생성
JODONG2 참고

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

MLflow Project
프로젝트(MLProject)

  • MLflow를 사용한 코드의 프로젝트 메타 정보 저장
  • 프로젝트를 어떤 환경에서 어떻게 실행시킬지 정의
  • 패키지 모듈의 상단에 위치

MLProject생성
MLProject 생성
vi logistic_regression/MLProject

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 : 모델 파라미터
  • Metrics : 모델의 평가 지표, Metric을 시각화할 수 있음
  • Tags : 관련된 Tag
  • Artifacts : 실행 과정에서 생기는 다양한 파일들(이미지, 모델 Pickle 등)

Run으로 실행하기

mlflow run logistic_regression --experiment-name jodong2-first-experiment --no-conda
강의자료 pdf파일에서 예시로 들어준 LogisticRegression의 penalty = 'elasticnet'은 
ValueError:Solver lbfgs supports only 'l2' or 'none' penalties, got elasticnet penalty.
를 띄워준다. LogistrRegression의 default solver는 lbfgs인데 
sklearn의 docs(?)를 확인해보면 

Warning The choice of the algorithm depends on the penalty chosen: Supported penalties by solver:
‘newton-cg’ - [‘l2’, ‘none’]

‘lbfgs’ - [‘l2’, ‘none’]

‘liblinear’ - [‘l1’, ‘l2’]

‘sag’ - [‘l2’, ‘none’]

‘saga’ - [‘elasticnet’, ‘l1’, ‘l2’, ‘none’]
위와 같이 lbfgs는 'l2'와 'none'을 지원해주고 elasticnet은 지원해주지 않는다.
따라서 예시코드의 lr = LogisticRegression(solver='saga',penalty=penalty,l1_ratio=l1_ratio)
로 설정해줘야 elasticnet을 활용 가능하다. jodong2/practice-mlflow 참고

MLflow Tracking - UI

UI실행

  • mlflow ui

  • 실행한 Run 정보등 확인 가능
    -- Run Command, Duration, Parameter, metric, server,..., 등..

  • Artifacts 확인 :

MLflow Tracking - Experimnet/Run 관계

MLflow autolog

파라미터를 매번 명시해야 할까?

결국 적는 autolog 활용 전 예제 코드

import numpy as np
from sklearn.linear_model import LogistRegression

import mlflow
import mlflow.sklearn

if __name__=="__main__":
	X=np.random.randint(5,size=(80,)).reshape(20,4)
	y=np.random.randint(2,size=(20,))
    
	penalty='elasticnet'
	l1_ratio=0.1
	LR=LogisticRegression(solver='saga',penalty=penalty, l1_ratio=l1_ratio)
	
	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_model(LR,"model")

autolog 활용 후 예제 코드

import numpy as np
from sklearn.linear_model import LogistRegression

import mlflow
import mlflow.sklearn

if __name__=="__main__":
	mlflow.sklearn.autolog()
	X=np.random.randint(5,size=(80,)).reshape(20,4)
	y=np.random.randint(2,size=(20,))
	
	penalty='elasticnet'
	l1_ratio=0.1
	LR=LogisticRegression(solver='saga',penalty=penalty, l1_ratio=l1_ratio)
	
	with mlflow.start_run() as run:
		LR.fit(X,y)
    
	score=LR.score(X,y)
	print(f"Score:{score}")

실행
dir name : logistic_regression_with_autolog
실행하기 위한 명령어는 똑같음.
우리가 지정한 파라미터, Metric뿐아니라 기본적으로 제공되는 파라미터, Metric값들을 모두 저장한다.

mlflow run logistic_regression_with_autolog --experimnet-name my-first-experiment --no-conda

주의사항

  • 모든 프레임워크에서 사용 가능한 것은 아님
  • MLflow에서 지원해주는 프레임워크들이 존재
    -- 예) pytorch.nn.Module은 지원하지 않음(반면 Pytorch Lightning은 지원)
  • 자세한 내용은 https://mlflow.org/docs/latest/tracking.html#id2 에서 확인

MLflow Parameter

parameter를 활용하면 파라미터들을 생략할 수 있다.
parameter 활용 전
(train.py)

~~~
penalty = 'elasticnet'
l1_ratio=0.1
LR=LogisticRegression(solver='saga',penalty=penalty,l1_ratio=0.1)
~~~

(MLProject)

name: tutorial

entry_points:
	main:
		command: "python train.py"

parameter 활용 후
(train.py)

import argparse
import sys
~~~

LR=LogisticRegression(sover=sys.argv[1],penalty=sys.argv[2],l1_ratio=float(sys.argv[3])
~~~

(MLProject)

name: tutorial

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

실행하는 커맨드
커맨드가 몹시 길어졌다..
P 옵션을 사용하지 않는다면 MLProject의 default값이 대입된다.

mlflow run logistic_regression_with_autolog_and_params 
-P solver="saga" 
-P penalty="elastic" 
-P l1_ratio=0.01 
--experiment-name jodong2-first-experiment --no-conda

MLflow Hyper Parameter Tuning

autolog와 하이퍼 파라미터 튜닝도 같이 할 수 있음

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()

kernel에 "linear","rbf"
C에 1, 10
의 파라미터가 존재한다. 총 경우의 수는 4개이고 4번 실행 된 것을 확인할 수 있다.

mlflow run svc_with_hyperparams_tuning --experiment-name jodong2-first-experiment --no-conda

MLflow 아키텍처

파이썬코드(with MLflow package)

  • 모델을 만들고 학습하는 코드
  • mlflow run으로 실행
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()

Tracking Server

  • 파이썬 코드가 실행되는 동안 Parameter,Metric,Model 등 메타 정보 저장
  • 파일 혹은 DB에 저장

Artifact Store

  • 파이썬 코드가 실행되는 동안 생기는 Model File, Image등의 아티팩트를 저장
  • 파일 혹은 스토리지에 저장

MLflow 서버로 배포하기

MLflow Tracking Server와 외부 스토리지 사용하기

위의 MLflow architecture에서 Tracking Server는 DB에 연결
mlflow server 명령어로 Backend Store URI 지정

mlflow server --backend-store-uri sqlite:///mlflow.db --default-artifact-root $(pwd)/artifacts

환경변수 지정

export MLFLOW_TRACKING_URI="http://127.0.0.1:5000"

Experiments를 생성한 후, Run

experiments create --experiments-name jodong2-second-experiment

mlflow run svm --experiment-name jodong2-second-experiment --no-conda

데이터 확인 가능

  1. mlflow run
  2. 기록 요청(Tracking Server)
  3. DB에 기록(Tracking Server ->DB)
  4. 아티팩트 저장 (파이썬 코드 -> Artifact Store)
ls -al

artifacts와 mlflow.db를 확인할 수 있음

MLflow 실제 활용 사례

MLflow Tracking Server는 하나로 통합 운영

  • Tracking Server를 하나 배포하고, 팀 내 모든 Researcher가 이 Tracking Server에 실험 기록
    -- 배포할때는 Docker Image, Kubernetes 등에 진행(회사의 인프라에 따라 다름)

  • 로그나 모델이 한 곳에 저장되므로, 팀 내 모든 실험을 공유할 수 있음
    -- Artifact Storage는 GCS나 S3같은 스토리지 이용
    -- DB는 CloudSQL이나 AuroraRDS 같은 DB이용
    -이 두 저장소는 Tracking Server에 의해 관리

Special Mission

  1. 개인의 Local에 MLflow 환경 설정(pip install)
  2. 개인의 Local에 MLflow 환경 설정(Docker)
  3. 팀에서 공통적으로 사용할 MLflow Tracking Server GCP에 배포하기
profile
-

0개의 댓글