이번에도 마찬가지로 강의영상은 없이 강의자료를 통해 정리를 하려고 한다.
저번 Logging 강의자료에서 느꼈지만 강의자료만으로 인터넷 검색이 거의 불필요했다. 몹시 쉽게 잘 정리된 강의자료라서 이해도 잘되고 기초를 쌓기 좋았다. Logging의 경우 실습을 진행하지 않았는데, 후에 한 번에 실습을 진행하며 인터넷을 뒤져보고, 익히며 따로 정리해보겠다.
github repo를 보며 따라가는 정도?!
이 글은 네이버 부스트캠프 ai tech 변성윤님의 강의자료를 정리한 글입니다. 문제가 있거나 틀린점이 있다면 말씀해주세요! :)
MLflow 개념 잡기
-- MLflow란
-- MLflow 실습하며 알아보기
-- MLflow 아키텍처
MLflow 서버로 배포하기
-- Tracking Server와 외부 스토리지 사용하기
-- MLflow 실제 활용 사례
MLflow가 없던 시절
MLflow가 해결하려고 했던 Pain Point
머신러닝 실험, 배포를 쉽게 관리할 수 있는 오픈소스
관련 오픈소스 중 제일 빠르게 성장 중
맛보기
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의 상위호환 버전인가?!
1. Experiment Management & Tracking
2. Model Registry
MLflow로 실행한 머신러닝 모델을 Model Registry(모델 저장소)에 등록할 수 있음
모델 저장소에 모델이 저장될 때마다 해당 모델에 버전이 자동으로 올라감(Version 1->2->3..)
Model Registry에 등록된 모델은 다른 사람들에게 쉽게 공유 가능하고, 쉽게 활용할 수 있음
Git과 docker와 유사하다?!
3. Model Serving
1. MLflow Tracking
2. MLflow Project
3. MLflow Model
4. MLflow Registry
pip install mlflow
Experiment(실험)
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)
MLProject생성
MLProject 생성
vi logistic_regression/MLProject
name: tutorial
entry_points:
main:
command: "python train.py"
MLflow Tracking - Run
Run(실행)
Run에서 로깅하는 것들
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 참고
UI실행
mlflow ui
실행한 Run 정보등 확인 가능
-- Run Command, Duration, Parameter, metric, server,..., 등..
Artifacts 확인 :
파라미터를 매번 명시해야 할까?
결국 적는 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
주의사항
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
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
파이썬코드(with MLflow package)
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
Artifact Store
위의 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
데이터 확인 가능
ls -al
artifacts와 mlflow.db를 확인할 수 있음
MLflow Tracking Server는 하나로 통합 운영
Tracking Server를 하나 배포하고, 팀 내 모든 Researcher가 이 Tracking Server에 실험 기록
-- 배포할때는 Docker Image, Kubernetes 등에 진행(회사의 인프라에 따라 다름)
로그나 모델이 한 곳에 저장되므로, 팀 내 모든 실험을 공유할 수 있음
-- Artifact Storage는 GCS나 S3같은 스토리지 이용
-- DB는 CloudSQL이나 AuroraRDS 같은 DB이용
-이 두 저장소는 Tracking Server에 의해 관리