Post

[MLOps] MLflow 사용법

머신러닝 라이프 사이클을 관리해주는 오픈 소스 플랫폼인 MLflow의 사용법을 알아보자

✅ MLflow

MLflow는 머신러닝 라이프 사이클을 관리해주는 오픈 소스 플랫폼이다.

  • 모델의 실행을 추적(tracking)하고, 모델링 결과를 저장, 관리 하며, 모델 배포를 관리하는 오픈 소스 플랫폼이다.

✅ MLflow 사용법

✔️ 설치

  • 먼저 설치를 해준다.
1
pip install mlflow

✔️ MLflow 설정

  • 코드에서 MLflow 설정을 해준다.
    • SQLite에 기록, mlflow.db가 생성된다.
1
2
mlflow_uri = "sqlite:///mlflow.db"
mlflow.set_tracking_uri(mlflow_uri)

✔️ 실험 만들기

  • create_experiment를 통해 실험을 만들 수 있고, 실험 ID를 주어 해당 실험에 Tracking 할 수 있다.
1
exp_id = mlflow.create_experiment("exp1")

✔️ 모델링 & Tracking

  • with mlflow.start_run(): 구문으로 추적을 시작하고
  • mlflow.log_~를 통해 metric이나 결과물들을 저장할 수 있다.
    • mlflow.log_param : 하이퍼파라미터 값
    • mlflow.log_metric : 성능 지표 값
    • mlflow.log_tag : 관리를 위해 필요한 정보
    • mlflow.sklearn.log_model : 모델 등록
    • mlflow.log_artifact : 그 외 산출물 (그래프, csv 등)
    • 자세한 것은 mlflow api 문서에서 확인해서 사용하면 된다.
    • 뒤에서 얘기하겠지만 AutoLog를 이용하고 추가적으로 저장하고 싶은 값들을 저장하면 될 듯 하다.
1
2
3
4
5
6
7
8
9
10
11
with mlflow.start_run(experiment_id = exp_id):  # 추적 시작 지정

    model = DecisionTreeClassifier()
    model.fit(x_train, y_train)

    pred = model.predict(x_val)

    accuracy = accuracy_score(y_val, pred)

    mlflow.log_metric("accuracy", accuracy)
    mlflow.sklearn.log_model(model, "model", registered_model_name="Test_Model")

✔️ MLflow 서버 실행

  • 터미널을 열고 현재 폴더 위치에서 아래의 명령어를 실행하고 로컬 포트로 들어가보자.
1
mlflow server --backend-store-uri sqlite:///mlflow.db --default-artifact-root ./artifacts

그럼 아래와 같은 창을 확인할 수 있다.

image

이번 글에서는 설명은 따로 안하겠지만, Experiments 별로 모델을 관리할 수 있고, Run Name을 눌러 저장한 값들을 확인할 수 있다. 그리고 Model 별로 버전관리도 할 수 있으며, 결과값을 쉽게 비교할 수 있다.

✔️ run_name

  • 기본적으로 run_name은 랜덤하게 생성되지만, 지정해주면 지정된 이름으로 run_name이 생성된다.
1
with mlflow.start_run(experiment_id=exp_id, run_name='DecisionTreeClf'):

✔️ AutoLog()

  • AutoLog를 사용하면 자동적으로 필요한 부분들을 다 Log 해준다.
1
2
3
4
5
6
7
with mlflow.start_run(experiment_id=exp_id):
	# autolog 시작
    mlflow.sklearn.autolog()
	...
	...
	# autolog 종료
	mlflow.sklearn.autolog(disable=True)

✔️ Grid Search 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Grid Search
with mlflow.start_run(experiment_id=exp_id, run_name='gridsearch_tuning01'):
    
    # autolog 시작!
    mlflow.sklearn.autolog()
    
    # 튜닝 코드
    params = {'n_neighbors' : range(1, 51), 'metric' : ['euclidean', 'manhattan']}
    model = GridSearchCV(KNeighborsRegressor(), params, cv=5)
    model.fit(x_train_s, y_train)
    
    result = pd.DataFrame(model.cv_results_)
        
    # 수동등록 : 그래프
    sns.scatterplot(x='param_n_neighbors', y='mean_test_score', data=result, hue='param_metric')
    plt.title('KNN GridSearch Tuning')
    plt.grid()
    plt.savefig('KNN_GridSearch_Tuning.png')
    mlflow.log_artifact('KNN_GridSearch_Tuning.png')
    
    # 수동등록 : best 모델 기록하기
    mlflow.sklearn.log_model(model.best_estimator_, "model", registered_model_name="KNN_Tuning")
    
    # autolog 종료
    mlflow.sklearn.autolog(disable=True)

✅ 배포관리

  • MLflow에서 모델의 라이프 사이클을 네 가지 단계로 관리
  • 실무에서도 비슷하게 사용된다고 함
None
  • 모델을 처음 등록하면, None 상태
Staging
  • 개발중인 모델이나 실험을 진행중인 모델이 저장되는 단계
  • 아직 모델을 운영 환경에서 사용하기에는 부적합할 수 있음
Production
  • 실제 운영 환경에서 사용할 수 있는 모델을 저장하는 단계
  • 모델의 성능이 검증되고, 품질이 우수하며, 모델의 예측 결과가 안정적인 것으로 확인되어야 한다.
Archived
  • 운영 환경에서 더 이상 사용하지 않는 모델을 저장하는 단계
  • 모델의 이전 버전을 저장하고 추적, 검토
  • 문제가 발생했을 때 복구를 위해 사용할 수 있다.

✔️ 모델 불러오기

  • model_uri = "models:/{실험명}/{가져올 버전}"
1
2
3
4
5
6
7
8
9
10
11
# 버전으로 가져오기
model_uri = "models:/CarSeat/1" 
model1 = mlflow.sklearn.load_model(model_uri)

# 최신버전으로 가져오기
model_uri = "models:/CarSeat/latest" 
model2 = mlflow.sklearn.load_model(model_uri)

# 운영중인 버전 가져오기
model_uri = "models:/CarSeat/production" 
model3 = mlflow.sklearn.load_model(model_uri)

✔️ 기타

mlflow에서는 각 라이브러리 별로 따로 코드가 존재하기 때문에 라이브러리에 맞춰서 코드를 불러와야한다.

그게 무슨말이냐.. 별 다른 건 없고

이전 예시들에선 mlflow.sklearn. ~~ 으로 했는데, 만약 pytorch를 이용한다면 mlflow.pytorch. ~~이런 식으로 작성해야한다는 말이다. 자세한건 mlflow api 문서를 확인해보자.

This post is licensed under CC BY 4.0 by the author.

-

-