아티팩트에서 MLflow 모델로

다음 문서에서는 MLflow 아티팩트와 MLflow 모델 간의 차이점과 서로 간에 전환하는 방법에 대해 설명합니다. 또한 Azure Machine Learning에서 MLflow 모델의 개념을 사용하여 간소화된 배포 워크플로를 사용하도록 설정하는 방법도 설명합니다.

아티팩트와 모델의 차이점은?

MLflow에 익숙하지 않은 경우 아티팩트 또는 파일 로깅과 MLflow 모델 로깅의 차이점을 이해하지 못할 수 있습니다. 서로 간에 몇 가지 근본적인 차이점이 있습니다.

아티팩트

아티팩트는 실험의 실행 또는 작업에서 생성(및 캡처)된 모든 파일입니다. 아티팩트는 Pickle 파일로 직렬화된 모델, PyTorch 또는 TensorFlow 모델의 가중치 또는 선형 회귀 계수가 포함된 텍스트 파일을 나타낼 수도 있습니다. 일부 아티팩트도 모델 자체와 아무 상관이 없을 수 있습니다. 오히려 모델을 실행하는 구성이나 전처리 정보 또는 샘플 데이터 등을 포함할 수 있습니다. 아티팩트는 다양한 형식일 수 있습니다.

아티팩트가 이미 로깅되었을 수 있습니다.

filename = 'model.pkl'
with open(filename, 'wb') as f:
  pickle.dump(model, f)

mlflow.log_artifact(filename)

모델

MLflow의 ‘모델’도 아티팩트입니다. 그러나 여기서는 이 유형의 아티팩트에 대해 더 강력하게 가정합니다. 이러한 가정은 저장된 파일과 그 의미 사이에 명확한 계약을 제공합니다. 모델을 아티팩트(단순 파일)로 로그하는 경우 유추를 위해 모델을 로드하는 방법을 이해하기 위해 각 파일에 대한 모델 작성기의 의미를 알아야 합니다. 반대로 MLflow 모델은 형식으로 지정된 계약을 사용하여 로드할 수 있습니다.

Azure Machine Learning에서 로깅 모델에는 다음과 같은 이점이 있습니다.

  • 채점 스크립트나 환경을 제공하지 않고도 실시간 또는 일괄 처리 엔드포인트에 배포할 수 있습니다.
  • 모델을 배포할 때 Swagger가 자동으로 생성되고 Azure Machine Learning 스튜디오에서 테스트 기능을 사용할 수 있습니다.
  • 모델을 파이프라인 입력으로 직접 사용할 수 있습니다.
  • 모델에 책임 있는 AI 대시보드를 사용할 수 있습니다.

MLflow SDK를 사용하여 모델을 기록할 수 있습니다.

import mlflow
mlflow.sklearn.log_model(sklearn_estimator, "classifier")

MLmodel 형식

MLflow는 아티팩트와 아티팩트가 나타내는 항목 간의 계약을 만드는 방법으로 MLmodel 형식을 채택합니다. MLmodel 형식은 자산을 폴더에 저장합니다. 이러한 자산 중에는 이름이 MLmodel인 파일이 있습니다. 이 파일은 모델을 로드하고 사용하는 방법에 대한 단일 정보 원본입니다.

다음 스크린샷은 Azure Machine Learning 스튜디오의 샘플 MLflow 모델 폴더를 보여 줍니다. 모델은 credit_defaults_model라는 폴더에 배치됩니다. 이 폴더의 이름 지정에 대한 구체적인 요구 사항은 없습니다. 이 폴더에는 다른 모델 아티팩트 간에 MLmodel 파일이 포함되어 있습니다.

A screenshot showing assets of a sample MLflow model, including the MLmodel file.

다음 코드는 fastai로 학습시킨 컴퓨터 비전 모델에 대한 MLmodel 파일의 예입니다.

MLmodel

artifact_path: classifier
flavors:
  fastai:
    data: model.fastai
    fastai_version: 2.4.1
  python_function:
    data: model.fastai
    env: conda.yaml
    loader_module: mlflow.fastai
    python_version: 3.8.12
model_uuid: e694c68eba484299976b06ab9058f636
run_id: e13da8ac-b1e6-45d4-a9b2-6a0a5cfac537
signature:
  inputs: '[{"type": "tensor",
             "tensor-spec": 
                 {"dtype": "uint8", "shape": [-1, 300, 300, 3]}
           }]'
  outputs: '[{"type": "tensor", 
              "tensor-spec": 
                 {"dtype": "float32", "shape": [-1,2]}
            }]'

모델 버전

사용할 수 있는 다양한 기계 학습 프레임워크를 고려하여 MLflow는 모든 기계 학습 프레임워크에서 작동하는 고유한 계약을 제공하는 방법으로 버전 개념을 도입했습니다. 버전은 특정 프레임워크를 사용하여 만든 특정 모델에 대해 예상되는 항목을 나타냅니다. 예를 들어 TensorFlow에는 TensorFlow 모델을 유지하고 로드하는 방법을 지정하는 고유한 버전이 있습니다. 각 모델 버전은 지정된 프레임워크에 대해 모델을 유지하고 로드하는 방법을 나타내므로 MLmodel 형식은 모든 모델에서 지원해야 하는 단일 직렬화 메커니즘을 적용하지 않습니다. 이러한 결정을 통해 각 버전은 MLmodel 표준과의 호환성을 손상시키지 않고 모범 사례에 따라 최상의 성능 또는 최상의 지원을 제공하는 방법을 사용할 수 있습니다.

fastai 모델에 대한 flavors 섹션의 예제는 다음 코드와 같습니다.

flavors:
  fastai:
    data: model.fastai
    fastai_version: 2.4.1
  python_function:
    data: model.fastai
    env: conda.yaml
    loader_module: mlflow.fastai
    python_version: 3.8.12

모델 서명

MLflow의 모델 서명은 모델과 모델을 실행하는 서버 간의 데이터 계약 역할을 하므로 모델 사양의 중요한 부분입니다. 또한 모델 서명은 배포 시 모델의 입력 형식을 구문 분석하고 적용하는 데 중요합니다. 서명을 사용할 수 있는 경우 데이터가 모델에 제출될 때 MLflow에서 입력 형식을 적용합니다. 자세한 내용은 MLflow 서명 적용을 참조하세요.

서명은 모델이 기록될 때 표시되며 MLmodel 파일의 signature 섹션에 유지됩니다. MLflow의 Autolog 기능은 최상의 방법으로 서명을 자동으로 유추합니다. 그러나 유추된 서명이 필요한 서명이 아닌 경우 모델을 수동으로 기록해야 할 수 있습니다. 자세한 내용은 서명을 사용하여 모델을 기록하는 방법을 참조하세요.

서명에는 두 가지 유형이 있습니다.

  • 열 기반 서명: 이 서명은 테이블 형식 데이터에 작동합니다. 이 형식의 서명이 있는 모델의 경우 MLflow는 pandas.DataFrame 개체를 입력으로 제공합니다.
  • 텐서 기반 서명: 이 서명은 n차원 배열 또는 텐서로 작동합니다. 이 서명이 있는 모델의 경우 MLflow는 numpy.ndarray를 입력으로 제공합니다(또는 명명된 텐서의 경우 numpy.ndarray 사전).

다음 예제는 fastai를 사용하여 학습된 컴퓨터 비전 모델에 해당합니다. 이 모델은 RGB 표현(부호 없는 정수)과 함께 (300, 300, 3) 셰이프의 텐서로 표현되는 이미지의 일괄 처리를 받습니다. 모델은 두 클래스에 대한 예측(확률)의 일괄 처리를 출력합니다.

MLmodel

signature:
  inputs: '[{"type": "tensor",
             "tensor-spec": 
                 {"dtype": "uint8", "shape": [-1, 300, 300, 3]}
           }]'
  outputs: '[{"type": "tensor", 
              "tensor-spec": 
                 {"dtype": "float32", "shape": [-1,2]}
            }]'

Azure Machine Learning은 사용 가능한 서명을 사용하여 MLflow 모델 배포를 위한 swagger 파일을 생성합니다. 이렇게 하면 Azure Machine Learning 스튜디오를 사용하여 배포를 더 쉽게 테스트할 수 있습니다.

모델 환경

실행할 모델에 대한 요구 사항은 conda.yaml 파일에 지정됩니다. MLflow는 종속성을 자동으로 검색하거나 mlflow.<flavor>.log_model() 메서드를 호출하여 수동으로 나타낼 수 있습니다. 환경에 포함된 라이브러리가 사용하려는 라이브러리가 아닌 경우 후자가 유용할 수 있습니다.

fastai 프레임워크를 사용하여 만든 모델에 사용되는 환경의 예제는 다음 코드와 같습니다.

conda.yaml

channels:
- conda-forge
dependencies:
- python=3.8.5
- pip
- pip:
  - mlflow
  - astunparse==1.6.3
  - cffi==1.15.0
  - configparser==3.7.4
  - defusedxml==0.7.1
  - fastai==2.4.1
  - google-api-core==2.7.1
  - ipython==8.2.0
  - psutil==5.9.0
name: mlflow-env

참고 항목

MLflow 환경과 Azure Machine Learning 환경 간의 차이점은 무엇인가요?

MLflow 환경은 모델 수준에서 작동하지만 Azure Machine Learning 환경은 작업 영역(등록된 환경의 경우) 또는 작업/배포(익명 환경의 경우)의 수준에서 작동합니다. Azure Machine Learning에서 MLflow 모델을 배포하는 경우 모델의 환경이 빌드되고 배포에 사용됩니다. 또는 Azure Machine Learning CLI v2를 사용하여 이 동작을 재정의하고, 특정 Azure Machine Learning 환경을 사용하여 MLflow 모델을 배포할 수 있습니다.

Predict 함수

모든 MLflow 모델에는 predict 함수가 포함되어 있습니다. 이 함수는 코드 없는 배포 환경을 사용하여 모델을 배포할 때 호출됩니다. predict 함수가 반환하는 값(예: 클래스, 확률 또는 예측)은 학습에 사용되는 프레임워크(즉, 버전)에 따라 달라집니다. 반환하는 항목을 이해하려면 각 버전의 문서를 참조하세요.

동일한 경우에서 유추를 실행하는 방법을 변경하려면 이 predict 함수를 사용자 지정해야 할 수도 있습니다. 이러한 경우 predict 메서드에서 다른 동작을 사용하여 모델을 로그하거나 사용자 지정 모델의 버전을 로그해야 합니다.

MLflow 모델을 로드하기 위한 워크플로

다음을 포함하여 여러 위치에서 MLflow 모델로 만든 모델을 로드할 수 있습니다.

  • 모델이 기록된 실행에서 직접
  • 모델이 저장된 파일 시스템에서
  • 모델이 등록된 모델 레지스트리에서

MLflow는 위치에 관계없이 해당 모델을 로드하는 일관된 방법을 제공합니다.

모델을 로드하는 데 사용할 수 있는 두 가지 워크플로가 있습니다.

  • 기록된 것과 동일한 개체 및 형식 다시 로드: MLflow SDK를 사용하여 모델을 로드하고 학습 라이브러리에 속하는 형식이 있는 모델의 인스턴스를 가져올 수 있습니다. 예를 들어 ONNX 모델은 ModelProto를 반환하지만 scikit-learn으로 학습시킨 의사 결정 트리 모델은 DecisionTreeClassifier 개체를 반환합니다. mlflow.<flavor>.load_model()를 사용하여 기록된 동일한 모델 개체 및 형식을 다시 로드합니다.

  • 유추를 실행하기 위해 모델 다시 로드: MLflow SDK를 사용하여 모델을 로드하고 MLflow가 predict 함수를 보증하는 래퍼를 가져올 수 있습니다. 사용 중인 버전은 중요하지 않으며 모든 MLflow 모델에는 predict 함수가 있습니다. 또한 MLflow는 pandas.DataFrame, numpy.ndarray 또는 dict[string, numpyndarray] 유형(모델의 서명에 따라)의 인수를 사용하여 이 함수를 호출할 수 있음을 보증합니다. MLflow는 모델이 예상하는 입력 형식으로 형식 변환을 처리합니다. mlflow.pyfunc.load_model()을 사용하여 유추를 실행하기 위해 모델을 다시 로드합니다.