이번 시간에는 지난 포스트에 이어, MLflow로 Model Registry를 이용해 모델을 관리하고 사용하는 여러 사례를 살펴본다.
개발자 커뮤니티 SQLER.com - Azure Databricks - MLflow를 이용한 머신러닝(1)
개발자 커뮤니티 SQLER.com - Azure Databricks - MLflow를 이용한 머신러닝(2) - Tracking
개발자 커뮤니티 SQLER.com - Azure Databricks - MLflow를 이용한 머신러닝(3) - Project
개발자 커뮤니티 SQLER.com - Azure Databricks - MLflow를 이용한 머신러닝(4) - Model Registry
개발자 커뮤니티 SQLER.com - Azure Databricks - MLflow를 이용한 머신러닝(5) - Model 배포
Azure Databricks - MLflow를 이용한 머신러닝(4) - Model Registry
MLflow Model Registry example - Azure Databricks | Microsoft Docs 문서의 내용을 참조.
이 포스팅에서 사용되는 전체 코드는 아래 github 리포지토리에서 확인 가능.
CloudBreadPaPa/pyspark-basic: pyspark basic self-study repo (github.com)
Model Registry(모델 레지스트리)는 무엇이고 왜 사용하는가?
Model Registry(모델 레지스트리)는 MLflow 모델들을 저장하고 사용하기 위한 API들과 UI를 포함하는 전체 라이프사이클 관리를 제공한다. Model Registry는 모델 리지니(Lineage), 모델 버저닝(Versioning), 스테이지 전환(Stage transition), 주석(Annotation)과 배포 관리를 제공한다.
The MLflow Model Registry component is a centralized model store, set of APIs, and UI, to collaboratively manage the full lifecycle of MLflow Models. It provides model lineage (which MLflow Experiment and Run produced the model), model versioning, stage transitions, annotations, and deployment management.
예전에 포스팅한 문서, 개발자 커뮤니티 SQLER.com - MLaaS - (1) 12가지의 머신러닝을 먼저 도입한 기업들의 고민 부분에서 아래와 같은 질문이 있었다.
6. 모델관리
머신러닝을 우리가 수행하는 이유는 이 "모델"을 잘 만들기 위해서 입니다. 그런데, 만들어진 모델을 어떻게 관리하시나요? 이 모델이 어느 데이터셋으로, 어느 환경에서, 어느 알고리즘으로, 어떤 하이퍼 파라미터로 만들어졌는지 알고 있습니까?네, 어쩌면, 모델 파일명에 이 모델에 대한 정보를 넣어 길게 작성하는 경우도 있습니다만, 부족하죠.
- 모델 메타데이터 정보 확인(사용된 데이터셋, Compute 환경, 트레이닝 실행환경, 기록/검색, 버전관리)
머신러닝 트레이닝이 완료되면 모델을 안전한 저장소에 등록하고 모델의 버전 별 다양한 메타데이터 정보와 함께 저장해 관리할 수 없을까요?
Model Registry는 머신러닝 작업에서 가장 중요한 최종 산출물인 Model에 대해 다양한 메타데이터와 함께 통합 관리가 가능하다. 특히, MLflow나 여러 MLaaS 서비스가 제공하는 Tracking 기능과 연계되어 메타데이터 저장과 Versioning이 가능해 모델의 관리 편의성이 높아지고, 모델을 배포(Deploy)할 경우에도 이 Model Registry로부터 배포하여 일관된 모델 관리가 가능해진다.
추가적으로 Model Registry 역시, MLaaS와 MLOps 처리가 될 경우 가장 높은 효율을 제공한다. MLOps 관련 내용은 이후 포스팅에서 논의하고, 이 문서에서는 Model Registry 관련해 조금 더 리뷰.
Model Registry를 위한 데이터셋 로드
Model Registry 노트북에서는 GPU를 사용하는 Deep Learning 예제를 다룬다. Azure Databricks에서 GPU compute를 생성하고 이곳에서 실행하거나, 일반 CPU Compute를 사용해도 가능하다(시간이 더 소요된다.).
간략히, 풍력(Wind power)을 예측하는 데이터셋이고 관련 정보는 이곳에서 볼 수 있다.
... import pandas as pd wind_farm_data = pd.read_csv("https://github.com/dbczumar/model-registry-demo-notebook/raw/master/dataset/windfarm_data.csv", index_col=0) def get_training_data(): training_data = pd.DataFrame(wind_farm_data["2014-01-01":"2018-01-01"]) X = training_data.drop(columns="power") y = training_data["power"] return X, y def get_validation_data(): validation_data = pd.DataFrame(wind_farm_data["2018-01-01":"2019-01-01"]) X = validation_data.drop(columns="power") y = validation_data["power"] return X, y ...
MLflow Tracking을 적용한 모델 트레이닝
지난 포스팅에서 진행했던 mlflow tracking을 이용해 모델 트레이닝 과정을 로깅한다.
일반적인 tensorflow-keras를 이용하는 Deep Learning 과정이다.
... def train_keras_model(X, y): model = Sequential() model.add(Dense(100, input_shape=(X_train.shape[-1],), activation="relu", name="hidden_layer")) model.add(Dense(1)) model.compile(loss="mse", optimizer="adam") model.fit(X_train, y_train, epochs=100, batch_size=64, validation_split=.2) return model ... with mlflow.start_run(): # Automatically capture the model's parameters, metrics, artifacts, # and source code with the `autolog()` function mlflow.tensorflow.autolog() train_keras_model(X_train, y_train) run_id = mlflow.active_run().info.run_id
만약, CPU 트레이닝일 경우 fit 함수의 epoch를 적절히 낮게 조절해 트레이닝 시간을 절약할 수 있다.
이렇게 MLflow의 tracking을 이용해야 Model Registry에 등록(Register) 가능하다.
모델을 MLflow Model Registry에 등록(Register)
트레이닝이 완료된 model을 MLflow Model Registry에 Register 해야 한다. 이때, mlflow.register_model 함수를 이용한다.
model_name = "power-forecasting-model" # Replace this with the name of your registered model, if necessary. ... # The default path where the MLflow autologging function stores the model artifact_path = "model" model_uri = "runs:/{run_id}/{artifact_path}".format(run_id=run_id, artifact_path=artifact_path) model_details = mlflow.register_model(model_uri=model_uri, name=model_name)
결과 ------------------
Successfully registered model 'power-forecasting-model'. 2021/02/04 20:13:51 INFO mlflow.tracking._model_registry.client: Waiting up to 300 seconds for model version to finish creation.
Model name: power-forecasting-model, version 1 Created version '1' of model 'power-forecasting-model'.
이렇게 Model을 등록하면, 기본 Version "1"으로 등록되고, 등록된 모델에 대한 정보를 mlflow 함수를 통해 가져올 수 있다.
이 과정을 Databricks UI에서도 진행할 수 있다.
이렇게, Experiment 항목을 보면, 마지막 Artifacts - model 부분을 선택하면, 자동으로 model을 인식하고 "Register Model"을 진행 가능하다. Databricks 개발 과정 대부분의 경우, Python code를 SDK와 API를 이용해 진행하게 되니, UI는 참고로만 활용하자.
Registered Model에 정보 추가
등록된 모델에 여러 정보를 추가할 수 있다. 예를 들어, 모델에 사용된 데이터셋 정보나 트레이닝에 사용된 특정 머신러닝 기술 정보 등을 원하는 대로 추가해 관리할 수 있다. tag와 description을 잘 활용하면, 모델에 대한 여러 정보를 추가해, 이후 관리와 모델에 대한 다양한 정보를 쉽게 관리할 수 있다.
... client = MlflowClient() client.update_registered_model( name=model_details.name, description="This model forecasts the power output of a wind farm based on weather data. The weather data consists of three features: wind speed, wind direction, and air temperature." )
모델의 특정 버전에 정보 추가
client.update_model_version( name=model_details.name, version=model_details.version, description="This model version was built using TensorFlow Keras. It is a feed-forward neural network with one hidden layer." )
Azure Databricks UI에서 "Model" 항목을 확인하면 이렇게 모델 정보 및 버전별로 정보가 추가된 것을 확인 가능하다.
Model stage 전환(transition)
Model Registry의 stage는 다음과 같은 종류가 있다.
- None: stage를 지정하지 않을 경우
- Staging: 일반적으로 개발 및 테스트 과정에 지정
- Production: 일반적으로 deploy 및 실제 서비스 환경에 지정
- Archived: 일반적으로 불필요 하거나 사용하지 않을 경우 지정(삭제와 다름).
이 stage들은 메타정보이며, 강제적인 제한이 아니다. staging일 경우에는 deploy가 불가하거나 제약이 있는 것은 아니다. mlflow API에서도 메타정보 처리 형태와 같이 수정된다.
transition_model_version_stage 함수를 이용해 지정할 수 있고, get_model_version을 이용해 현재 stage 정보를 받아올 수 있다.
client.transition_model_version_stage( name=model_details.name, version=model_details.version, stage='Production', ) ... model_version_details = client.get_model_version( name=model_details.name, version=model_details.version, ) print("The current model stage is: '{stage}'".format(stage=model_version_details.current_stage))
Azure Databricks Model Registry UI에서도 확인 가능하다.
Model Registry로부터 모델을 로드
Model registry에 저장한 모델을 특정 버전 또는 특정 스테이지에 맞춰 가져와 어플리케이션에서 Load 할 수 있다.
위에서 작성한 tensorflow-keras 모델은 이런 형태로 mlflow에서 불러올 수 있다.
... model_version_uri = "models:/{model_name}/1".format(model_name=model_name) print("Loading registered model version from URI: '{model_uri}'".format(model_uri=model_version_uri)) model_version_1 = mlflow.pyfunc.load_model(model_version_uri)
결과 ---------------------
Loading registered model version from URI: 'models:/power-forecasting-model/1'
WARNING:tensorflow:From /databricks/python/lib/python3.7/site-packages/mlflow/keras.py:461: set_learning_phase (from tensorflow.python.keras.backend) is deprecated and will be removed after 2020-10-11.
Instructions for updating: Simply pass a True/False value to the `training` argument of the `__call__` method of your layer or model.
모델 스테이지를 지정해 Load 할 수도 있다.
model_production_uri = "models:/{model_name}/production".format(model_name=model_name) print("Loading registered model version from URI: '{model_uri}'".format(model_uri=model_production_uri)) model_production = mlflow.pyfunc.load_model(model_production_uri)
결과 -------------------------
Loading registered model version from URI: 'models:/power-forecasting-model/production'
모델을 불러오고, prediction을 수행한 다음, matplotlib으로 플롯을 그릴 수 있다.
def plot(model_name, model_stage, model_version, power_predictions, past_power_output): ... display(plt.show()) def forecast_power(model_name, model_stage): ... client = MlflowClient() model_version = client.get_latest_versions(model_name, stages=[model_stage])[0].version model_uri = "models:/{model_name}/{model_stage}".format(model_name=model_name, model_stage=model_stage) model = mlflow.pyfunc.load_model(model_uri) weather_data, past_power_output = get_weather_and_forecast() power_predictions = pd.DataFrame(model.predict(weather_data)) power_predictions.index = pd.to_datetime(weather_data.index) print(power_predictions) plot(model_name, model_stage, int(model_version), power_predictions, past_power_output) # Production stage 모델을 가져와 prediction 후, plot 생성 forecast_power(model_name, "Production")
Model Registry에서 모델 삭제
Model을 삭제할 경우에는 delete_model_version 함수를 이용한다.
client.delete_model_version( name=model_name, version=1, )
이렇게 Model Registry를 관리하고, 모델을 로드해 사용하는 방법 역시 확인해 보았다.
Q. 머신러닝 트레이닝이 완료되면 모델을 안전한 저장소에 등록하고 모델의 버전별 다양한 메타데이터 정보와 함께 저장해 관리할 수 없을까요?
최초 질문에 대한 Azure Databricks의 답은, MLflow Model Registry를 이용해 다양한 모델 및 모델의 버전, 메타 정보를 중앙집중화해 관리할 수 있으며, 등록된 모델을 로드해 다양한 어플리케이션에 배포, 예측에 사용할 수 있다.
GPU Worker 생성 과정에서 Quota 에러 상황
Azure Databricks Cluster 생성 과정 또는, Compute 생성 과정에서 지원하는 GPU로 활성화된 Worker가 선택 가능하다. 생성 과정에서 Terminated 라고 뜨면서 quota 오류를 보여준다.
이렇게 terminated 되었다고 표시되며 중지된다.
subscription 메뉴의 quota 부분에서 체크해 해당 Region과 Data Center내의 GPU 종류와 사용 가능한 Quota를 확인하고, 필요할 경우 Quota 증가를 요청한다.
현재 Azure에서 제공하는 Databricks 지원 GPU는 아래 링크에서 확인.
Azure Databricks supports the following instance types:
- NC instance type series: Standard_NC12, Standard_NC24
- NC v2 instance type series: Standard_NC6s_v2, Standard_NC12s_v2, Standard_NC24s_v2, Standard_NC24rs_v2
- NC T4 v3 instance type series: Standard_NC4as_T4_v3, Standard_NC8as_T4_v3, Standard_NC16as_T4_v3, Standard_NC64as_T4_v3
GPU-enabled clusters - Azure Databricks | Microsoft Docs - 2021년 10월 기준
참고링크
MLflow Model Registry — MLflow 1.4.0 documentation
MLflow Model Registry example - Azure Databricks | Microsoft Docs
MLflow Model Serving on Azure Databricks - Azure Databricks | Microsoft Docs
MLflow Model Registry example - Databricks (microsoft.com)
개발자 커뮤니티 SQLER.com - Azure Databricks - MLflow를 이용한 머신러닝(1)
개발자 커뮤니티 SQLER.com - Azure Databricks - MLflow를 이용한 머신러닝(2) - Tracking
개발자 커뮤니티 SQLER.com - Azure Databricks - MLflow를 이용한 머신러닝(3) - Project
개발자 커뮤니티 SQLER.com - Azure Databricks - MLflow를 이용한 머신러닝(4) - Model Registry
개발자 커뮤니티 SQLER.com - Azure Databricks - MLflow를 이용한 머신러닝(5) - Model 배포