Share via


사용자 지정 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를 사용하여 모델을 학습하지 않았고 Azure Machine Learning의 MLflow 코드 없는 배포 제품을 사용하려는 경우 사용자 지정 모델을 MLFLow로 변환해야 합니다. 사용자 지정 Python 모델 및 MLflow를 자세히 알아봅니다.

필수 조건

사용자 지정 모델을 MLflow 형식으로 변환하려면 설치된 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 모델 버전이 없는 모델을 저장, 로그 및 등록하는 방법에 대한 예를 참조하세요.

다음 단계