mlflow는 머신러닝 및 딥러닝 모델링의 전 수명 주기에 걸쳐 관리하는 기능을 제공하는 오픈소스 플랫폼이다.
일반적으로 머신러닝 모델을 API 형태로 제공할 때, API는 클라이언트에서 동작하게 하고, 모델은 AWS 서버에 저장하여 요청에 따른 응답(모델 예측값)을 받는 형식으로 관리한다.
mlflow는 버전 관리 및 배포될 모델을 쉽게 지정할 수 있도록 해준다.
registered_model_name
옵션을 통해 사용자가 동일한 이름을 지정했을 때만 같은 모델 이름으로 관리된다.mlflow_url = "sqlite:///mlflow.db"
# sqlite:// + /mlflow.db (현재 디렉토리의 mlflow.db 파일)
mlflow.set_tracking_uri(mlflow_url)
mlflow.start_run()
을 선언하고 블럭 안에서 모델링을 하면 해당 과정이 mlflow에 의해 추적된다.start_run()
과 end_run()
을 각각 선언해주어야 한다.with mlflow.start_run(): # 추적 시작 지정
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_uri에 성능과 모델이 로그로 기록 됨
mlflow.sklearn.log_model(model, "model", registered_model_name="Test_Model")
mlflow server --backend-store-uri sqlite:///mlflow.db --default-artifact-root ./artifacts
위 명령어를 이용하면 로컬에서 작동하는 mlflow UI 서버를 만들 수 있다.
mlflow.log_param
: 하이퍼 파라미터 값mlflow.log_metric
: 성능 지표 값mlflow.log_tag
: 관리를 위해 필요한 정보mlflow.sklearn.log_model
: sklaern 모델 등록mlflow.keras.log_model
: keras 모델 등록mlflow.log_artifact
: 산출물 (그래프, 환경, csv 등)from sklearn.ensemble import RandomForestRegressor
with mlflow.start_run(experiment_id = exp_id):
model = RandomForestRegressor()
model.fit(x_train, y_train)
pred = model.predict(x_val)
rmse = mean_squared_error(y_val, pred, squared=False)
mae = mean_absolute_error(y_val, pred)
mlflow.log_metric("rmse", rmse)
mlflow.log_metric("mae", mae)
mlflow.sklearn.log_model(model, "model1", registered_model_name="CarSeat")
mlflow.start_run(experiment_id = exp_id)
: 실험의 id를 지정해주어야 한다.mlflow.log_metric("rmse", rmse)
: 어떤 성능지표를 사용할지 지정한다.mlflow.sklearn.log_model(model, "model1", registered_model_name="CarSeat")
registered_model_name
" : 모델을 구분하는 모델 이름이다. (같은 이름을 사용해야 버전 관리가 가능) fit()
메서드가 호출될 때 fitting 과정에서 일어나는 모든 중간 단계(학습 과정)과 결과를 자동으로 로그로 남길 수 있다.# 자동 로깅
with mlflow.start_run():
mlflow.sklearn.autolog()
# ... 모델링 및 fit 코드 ...
mlflow.sklearn.autolog(disable=True)
autolog()
로 시작을 선언하여, autolog(disable=True)
로 로깅을 중단한다..cv_results
)이다.plt.plot('param_n_estimators', 'mean_test_score', data = result, marker = '.' )
plt.title('RF GridSearch Tuning')
plt.ylabel('r2 score')
plt.xlabel('n_estimators')
plt.grid()
plt.savefig('RF_GridSearch_Tuning.png')
mlflow.log_artifact("RF_GridSearch_Tuning.png")
예를 들어 이 코드를 autolog 블럭 안에 포함시키면 plt로 그린 그림을 이미제로 변환하여 mlflog로그에 저장할 수 있다.
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 = KNeighborsRegressor()
grid = GridSearchCV(model, param_grid=params, cv=5)
grid.fit(x_train_s, y_train)
# 수동등록 : 그래프
result = grid.cv_results_
sns.lineplot(x='param_n_neighbors', y='mean_test_score', data=result, hue='param_metric')
plt.title('KNN Grid Search Tuning')
plt.xlabel('n_neighbors')
plt.ylabel('r2 score')
plt.grid()
plt.savefig('KNN_GridSearch.png')
mlflow.log_artifact('KNN_GridSearch.png')
# 수동등록 : best 모델 기록하기
mlflow.sklearn.log_model(grid.best_estimator_, "model", registered_model_name="KNN_Tuning_Model")
# autolog 종료
mlflow.sklearn.autolog(disable=True)
sklearn
대신 keras
를 선언하면 된다.Models
메뉴를 통해 어떤 버전의 모델이 어떤 상태에있는지 확인할 수 있다.models:/<등록된 모델이름>/<버전>
: 특정 버전을 불러온다models:/<등록된 모델이름>/상태
: 특정 상태를 불러온다 (주로 운영상태인 것을 가져옴)models:/<등록된 모델이름>/latest
: 최신 버전을 불러온다# 운영중인 버전 가져오기
model_uri = "models:/CarSeat/production"
model3 = mlflow.sklearn.load_model(model_uri)
그동안 모델의 결과를 체계적으로 저장하지 못하거나, 이전에 학습시켰던 모델을 저장하지 않아 오랜기간에 걸쳐 재학습해야하는 등 문제가 많았는데, mlflow
를 사용하면 정말 편리하게 관리할 수 있겠단느 것을 깨달았다.
다만 아직 어떻게 서버에 무거운 모델을 탑재하지 않고 API를 이용해 모델을 돌릴 수 있을 지 모르겠다.
남은 미니프로젝트 과정에서 이를 배울 수 있으면 좋겠다.