사용자 지정 ML 모델을 MLflow 형식 모델로 변환
이 문서에서는 사용자 지정 ML 모델을 MLflow 형식으로 변환하는 방법을 알아봅니다. MLflow는 기계 학습 실험의 수명 주기를 관리하기 위한 오픈 소스 라이브러리입니다. 경우에 따라 기본 제공 MLflow 모델 버전 지원 없이 기계 학습 프레임워크를 사용할 수 있습니다. 기본 제공 MLflow 모델 버전이 없으므로 MLflow 모델 흐름 API를 사용하여 모델을 로그하거나 등록할 수 없습니다. 이 문제를 해결하려면 Azure Machine Learning 및 MLflow 모델의 이점을 적용할 수 있는 MLflow 형식으로 모델을 변환하면 됩니다.
Azure Machine Learning을 사용하면 MLflow 모델에서 다음과 같은 추가 이점을 얻을 수 있습니다.
- 코드 없는 배포
- 오픈 소스 표준 형식으로서의 이식성
- 로컬 및 클라우드 모두에 배포하는 기능
MLflow는 scikit-learn, Keras, Pytorch와 같은 다양한 기계 학습 프레임워크에 대한 지원을 제공합니다. MLflow가 모든 사용 사례를 다루지 못할 수도 있습니다. 예를 들어, MLflow가 기본적으로 지원하지 않는 프레임워크를 사용하여 MLflow 모델을 만들려고 할 수도 있습니다. 작업을 실행할 때 모델의 사전 처리 또는 사후 처리 방식을 변경하려고 할 수도 있습니다. MLflow 모델에 대해 자세히 알아보려면 MLflow의 아티팩트에서 모델로를 참조하세요.
MLFlow를 사용하여 모델을 학습하지 않았고 Azure Machine Learning의 MLflow 코드 없는 배포 제품을 사용하려는 경우 사용자 지정 모델을 MLFLow로 변환해야 합니다. 자세한 내용은 사용자 지정 Python 모델을 참조하세요.
필수 조건
mlflow
패키지를 설치합니다.
모델에 사용되는 Python 래퍼 만들기
모델을 MLflow 지원 형식으로 변환하려면 모델에 사용되는 python 래퍼를 만들어야 합니다. 다음 코드에서는 sklearn
모델에 사용되는 Python 래퍼를 만드는 방법을 보여줍니다.
# Load training and test datasets
from sys import version_info
import sklearn
import mlflow.pyfunc
PYTHON_VERSION = "{major}.{minor}.{micro}".format(major=version_info.major,
minor=version_info.minor,
micro=version_info.micro)
# Train and save an SKLearn model
sklearn_model_path = "model.pkl"
artifacts = {
"sklearn_model": sklearn_model_path
}
# create wrapper
class SKLearnWrapper(mlflow.pyfunc.PythonModel):
def load_context(self, context):
import pickle
self.sklearn_model = pickle.load(open(context.artifacts["sklearn_model"], 'rb'))
def predict(self, model, data):
return self.sklearn_model.predict(data)
Conda 환경 만들기
다음으로, 모든 필수 종속성을 포함하는 새 MLflow 모델에 대한 Conda 환경을 만듭니다. 표시되지 않으면 환경이 현재 설치에서 유추됩니다. 그렇지 않으면 지정할 수 있습니다.
import cloudpickle
conda_env = {
'channels': ['defaults'],
'dependencies': [
'python={}'.format(PYTHON_VERSION),
'pip',
{
'pip': [
'mlflow',
'scikit-learn=={}'.format(sklearn.__version__),
'cloudpickle=={}'.format(cloudpickle.__version__),
],
},
],
'name': 'sklearn_env'
}
MLflow 형식 모델 로드 및 테스트 예측
환경이 준비되면 SKlearnWrapper
, Conda 환경 및 새로 만든 아티팩트 사전을 mlflow.pyfunc.save_model()
메서드에 전달합니다. 이렇게 하면 모델이 디스크에 저장됩니다.
mlflow_pyfunc_model_path = "sklearn_mlflow_pyfunc_custom"
mlflow.pyfunc.save_model(path=mlflow_pyfunc_model_path, python_model=SKLearnWrapper(), conda_env=conda_env, artifacts=artifacts)
새로 저장된 MLflow 형식의 모델이 저장 중에 변경되지 않았는지 확인하려면 모델을 로드하고 테스트 예측을 인쇄하여 원본 모델과 비교합니다.
다음 코드는 mlflow 포맷 모델로부터 테스트 예측을 출력하고 sklearn 모델로부터 테스트 예측을 출력합니다. 비교를 위해 테스트 예측을 디스크에 저장합니다.
loaded_model = mlflow.pyfunc.load_model(mlflow_pyfunc_model_path)
input_data = "<insert test data>"
# Evaluate the model
import pandas as pd
test_predictions = loaded_model.predict(input_data)
print(test_predictions)
# load the model from disk
import pickle
loaded_model = pickle.load(open(sklearn_model_path, 'rb'))
result = loaded_model.predict(input_data)
print(result)
MLflow 형식 모델 등록
모델이 올바르게 저장되었는지 확인한 후 테스트 실행을 만들 수 있습니다. MLflow 포맷의 모델을 모델 레지스트리에 등록하고 저장합니다.
mlflow.start_run()
mlflow.pyfunc.log_model(artifact_path=mlflow_pyfunc_model_path,
loader_module=None,
data_path=None,
code_path=None,
python_model=SKLearnWrapper(),
registered_model_name="Custom_mlflow_model",
conda_env=conda_env,
artifacts=artifacts)
mlflow.end_run()
Important
경우에 따라 기본 제공 MLflow 모델 버전 지원 없이 기계 학습 프레임워크를 사용할 수 있습니다. 예를 들어 vaderSentiment
라이브러리는 감정 분석에 사용되는 표준 NLP(자연어 처리) 라이브러리입니다. 기본 제공 MLflow 모델 버전이 없으므로 MLflow 모델 흐름 API를 사용하여 모델을 로그하거나 등록할 수 없습니다. 지원되는 기본 제공 MLflow 모델 플레이버가 없는 모델을 저장, 기록 및 등록하는 방법에 대한 예는 지원되지 않는 기계 학습 모델 등록을 참조하세요.