다음을 통해 공유


MLflow의 아티팩트 및 모델

이 문서에서는 MLflow 아티팩트 및 MLflow 모델과 MLflow 모델이 다른 아티팩트와 어떻게 다른지 설명합니다. 또한 이 문서에서는 Azure Machine Learning이 MLflow 모델의 특성을 사용하여 간소화된 배포 워크플로를 사용하도록 설정하는 방법을 설명합니다.

아티팩트 및 모델

MLflow에서는 간단한 파일 아티팩트 로깅과 MLflow 모델 로깅 간에 몇 가지 기본적인 차이점이 있습니다.

아티팩트

아티팩트란 실험의 실행 또는 작업에서 생성되고 캡처된 파일입니다. 아티팩트가 피클 파일로 직렬화된 모델, PyTorch 또는 TensorFlow 모델의 가중치 또는 선형 회귀 계수를 포함하는 텍스트 파일일 수 있습니다. 일부 아티팩트에서는 모델 자체와는 아무 상관이 없지만 실행 구성, 전처리 정보 또는 샘플 데이터를 포함합니다. 아티팩트 형식은 다양할 수 있습니다.

다음 예제에서는 파일 아티팩트를 기록합니다.

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

mlflow.log_artifact(filename)

모델

MLflow 모델은 저장된 파일과 그 의미 간에 명확한 계약을 제공하는 더 강력한 가정을 하는 아티팩트입니다. 그러나 모델의 파일을 단순히 아티팩트로 기록하는 경우 각 파일의 의미와 유추를 위해 로드하는 방법을 알아야 합니다.

MLflow SDK를 사용하여 MLflow 모델을 기록할 수 있습니다. 예를 들면 다음과 같습니다.

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

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

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

MLmodel 형식

단순 아티팩트 파일로 기록된 모델의 경우 유추를 위해 모델을 로드하기 전에 모델 작성기에서 각 파일에 대해 무엇을 의도했는지 알고 있어야 합니다. 그러나 MLflow 모델의 경우 MLmodel 형식사용하여 아티팩트와 아티팩트 간에 계약을 지정하여 모델을 로드합니다.

MLmodel 형식은 특정 명명 요구 사항이 없는 폴더에 자산을 저장합니다. 자산 중에는 모델을 로드하고 사용하는 방법에 대한 단일 소스인 MLmodel이라는 파일이 있습니다.

다음 이미지는 Azure Machine Learning 스튜디오 credit_defaults_model MLflow 모델 폴더를 보여 줍니다. 폴더에는 MLmodel 파일 및 기타 모델 아티팩트가 포함됩니다.

MLmodel 파일을 포함한 샘플 MLflow 모델의 자산을 보여 주는 스크린샷.

다음 예제에서는 다음을 사용하여 학습된 컴퓨터 비전 모델에 대한 MLmodel 파일을 보여 줍니다 fastai.

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의 자동 로그 기능은 자동으로 서명을 유추하는 데 가장 적합합니다. 그러나 유추된 서명이 필요한 서명이 아닌 경우 모델을 수동으로 기록할 수 있습니다. 자세한 내용은 서명을 사용하여 모델을 기록하는 방법을 참조하세요.

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

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

다음 예제에서는 학습된 Computer Vision 모델에 대한 섹션을 보여 signature 줍니다 fastai. 이 모델은 RGB 표현을 부호 없는 정수로 사용하여 셰이프 (300, 300, 3) 의 텐서로 표시되는 이미지 일괄 처리를 받습니다. 모델은 두 클래스에 대한 확률로 예측의 일괄 처리를 출력합니다.

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() 하여 수동으로 나타낼 수 있습니다. MLflow가 사용자 환경에 포함된 라이브러리가 사용하려는 라이브러리가 아닌 경우 메서드를 호출하면 유용할 수 있습니다.

다음 conda.yaml 예제에서는 프레임워크를 사용하여 만든 모델에 대한 환경을 보여 줍니다 fastai .

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 CLI를 사용하여 이 동작을 재정의하고 특정 Azure Machine Learning 환경에 MLflow 모델을 배포할 수 있습니다.

Predict 함수

모든 MLflow 모델에는 코드 없는 배포를 predict 사용하여 모델을 배포할 때 호출되는 함수가 포함됩니다. predict 클래스, 확률 또는 예측과 같이 함수가 반환하는 값은 학습에 사용되는 프레임워크 또는 버전에 따라 달라집니다. 각 맛의 설명서에서는 반환되는 내용을 설명합니다.

함수를 predict 사용자 지정하여 유추 실행 방식을 변경할 수 있습니다. 다른 동작으로 모델을 기록하거나 사용자 지정 모델 버전을 기록할 수 있습니다.

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

다음 위치에서 MLflow 모델을 로드할 수 있습니다.

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

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

모델을 로드하는 워크플로에는 다음 두 가지가 있습니다.

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

  • 유추를 실행하기 위해 모델을 다시 로드합니다. MLflow SDK를 사용하여 모델을 로드하고 보장된 predict 함수가 있는 래퍼를 가져올 수 있습니다. 모든 MLflow 모델에 predict 함수가 있기 때문에 어떤 맛을 사용하는지는 중요하지 않습니다.

    MLflow는 모델 서명에 따라 형식 pandas.DataFramenumpy.ndarray또는 dict[string, numpyndarray]형식의 인수를 사용하여 이 함수를 호출할 수 있도록 보장합니다. MLflow는 모델이 예상하는 입력 형식으로 형식 변환을 처리합니다. mlflow.pyfunc.load_model()을 사용하여 유추를 실행하기 위해 모델을 다시 로드합니다.