MLflow에 대해서 알아보자 - Models

MLflow Models 에 대해서 알아보자.

MLflow 모델은 다양한 다운 스트림 도구에서 사용할 수 있는 기계 학습 모델을 패키징 하기 위한 표준 형식이다. (예: REST API를 통한 실시간 제공 또는 Apache Spark의 일괄 추론). 이 형식은 다른 다운 스트림 도구에서 이해할 수 있는 다른 “flavors” 로 모델을 저장할 수 있는 규칙을 정의한다.

Storage Format

각 MLflow 모델은 임의의 파일을 포함하는 디렉토리이며, 디렉토리의 루트에 MLmodel 파일도 존재한다. MLmodel 파일은 모델을 볼 수 있는 여러 flavors를 정의할 수 있다.

flaovrs는 MLflow 모델을 강력하게 만드는 핵심 개념이다. 배포 도구가 모델을 이해하는 데 사용할 수 있는 규칙이므로 각 도구를 각 라이브러리와 통합하지 않고도 모든 ML 라이브러리의 모델과 함께 작동하는 도구를 작성할 수 있다. MLflow 모델을 Python 함수로 실행하는 방법을 설명하는 ‘Python 함수’ 버전과 같이 모든 기본 제공 배포 도구가 지원하는 몇 가지 ‘표준’버전을 정의한다. 그러나 라이브러리는 다른 flavors를 정의하고 사용할 수도 있다. 예를들어, MLflow의 mlflow.sklearn 라이브러리는 scikit-learn Pipeline 객체로써 백업을 할 수 있다. 또는 Python 함수를 사용하여 모델에 적용할 수 있다.(예를들어, mlflow sagemaker tool로 Amazon SageMaker에 배포할 수 있다. )

특정 모델이 지원하는 모든 flavors는 MLmodel YAML 형식으로 해당 파일에 정의 된다. 예를들어 mlflow.sklearn 은 다음과 같이 모델을 출력한다.

# Directory written by mlflow.sklearn.save_model(model, "my_model")
my_model/
├── MLmodel
├── model.pkl
├── conda.yaml
└── requirements.txt

그리고 MLmodel 파일은 두 가지 특징을 설명한다.

time_created: 2018-05-25T17:28:53.35

flavors:
  sklearn:
    sklearn_version: 0.19.1
    pickled_model: model.pkl
  python_function:
    loader_module: mlflow.sklearn

이 모델은 sklearn 또는 python_function 모델 flavor를 지원하는 모든 도구와 함께 사용할 수 있다. 예를들어 아래 명령은 python_fuction 또는 crate (R함수)로 모델을 제공할 수 있다.

mlflow models serve -m my_model

또한, CLI 도구는 python_function flavors를 지원하는 한, AWS SageMaker에 모델을 패키징하고 배포할 수 있다.

mlflow sagemaker deploy -m my_model [other options]

MLmodel format의 필드

모델 특징을 나열하는 특징(flavor) 필드 외에도 MLmodel YAML 형식에는 다음 필드가 포함될 수 있다.

time_created

모델이 생성 된 날짜 및 시간이다. (UTC ISO 8601 형식)

run_id

모델이 MLflow Tracking을 사용하여 저장된 경우 모델을 생성 한 실행의 ID이다.

signature

JSON 형식의 모델 서명

input_example

입력 예제 가있는 이슈에 대한 참조 .

databricks_runtime

모델이 Databricks 노트북 또는 작업에서 학습 된 경우 Databricks 런타임 버전 및 유형이다.

추가 로그 파일

환경 레크리에이션을 위해 모델이 기록될 때마다 자동으로 conda.yaml 파일과 requirement.txt 파일을 기록한다. 이러한 파일은 conda 또는 pip 사용하여 종속성을 다시 설치하는 데 사용할 수 있다.

conda.yaml

모델을 저장할 때 MLflow는 모델에서 사용하는 종속성을 포함할 수 있는 conda 환경 매개변수를 전달하는 옵션을 제공한다. conda 환경이 제공되지 않으면 모델의 특징에 따라 기본 환경이 생성된다. 이러한 conda 환경은 conda.yaml 파일에 저장된다.

requirements.txt

requirements 파일로부터 생성되는 PIP 부분의 conda.yaml 환경 사양. 추가 pip 종속성은 requirements.txt conda 환경에서 pip 종속성으로 포함하고 환경과 함께 모델을 로깅하여 추가 할 수 있다.

다음은 수동으로 지정된 conda 환경으로 모델을 저장하는 예이고, 생성된 conda.yamlrequirements.txt 파일 내용을 보여준다.

conda_env = {
    'channels': ['conda-forge'],
    'dependencies': [
        'python=3.8.8',
        'pip'],
    'pip': [
        'mlflow',
        'scikit-learn==0.23.2',
        'cloudpickle==1.6.0'
    ],
    'name': 'mlflow-env'
}
mlflow.sklearn.log_model(model, "my_model", conda_env=conda_env)

작성된 conda.yaml 파일

channels:
  - conda-forge
  dependencies:
  - python=3.8.8
  - pip
  - pip:
    - mlflow
    - scikit-learn==0.23.2
    - cloudpickle==1.6.0
name: mlflow-env

작성된 requirements.txt 파일

mlflow
scikit-learn==0.23.2
cloudpickle==1.6.0

Model Signature and Input Example

ML 모델로 작업할 때 종종 “어떤 입력이 예상되나” 그리고 “어떤 결과물이 생성되나?” 와 같이 현재 모델의 몇 가지 기본 기능 속성을 알아야 한다. MLflow 모델에는 다운 스트림 도구에서 사용할 수 있는 모델 입력 및 출력에 대한 다음과 같은 추가 메타 데이터가 포함될 수 있다.

  • 모델 서명 - 모델의 입력 및 출력에 대한 설명이다.
  • 모델 입력 예 - 유효한 모델 입력의 예

Model Signature

모델 서명은 모델의 입력 및 출력 스키마를 정의한다. 모델 입력 및 출력은 열 기반(column-based) 또는 텐서 기반(tensor-based)일 수 있다. 열 기반 입력 및 출력의 유형은 .NET Framwrok 중 하나로 지정된 이름이 열의 시퀀스(optional) 로 설명할 수 있다. 텐서 기반 입력 및 출력은 유형이 numpy 데이터 유형 중 하나로 지정된(optional) 텐서의 시퀀스로 설명될 수 있다. 서명은 다른 모델의 메타 데이터와 함께 JSON 형식으로 MLmodel 파일에 저장된다. MLflow data types

모델 서명은 표준 MLflow 모델 배포 도구에 의해 인식되고 적용된다. 예를들어 모델을 REST API로 배포하는 mlflow 모델 제공 도구는 모델의 서명을 기반으로 입력의 유효성을 검사합니다.

Column-based Signature Example

모든 flavors는 열 기반 서명을 지원한다.

각 열기반 입력 및 출력은 다음 중 하나에 해당하는 유형 및 선택적 이름으로 표시된다. 다음 예제는 Iris 데이터 세트에서 훈련 된 분류 모델에 대한 모델 서명이 포함된 MLmodel 파일 발췌를 표시한다. 입력은 4개의 명명된 숫자 열이 있고, 출력은 예측된 클래스를 지정하는 이름없는 정수이다. MLflow data types

signature:
    inputs: '[{"name": "sepal length (cm)", "type": "double"}, {"name": "sepal width
      (cm)", "type": "double"}, {"name": "petal length (cm)", "type": "double"}, {"name":
      "petal width (cm)", "type": "double"}]'
    outputs: '[{"type": "integer"}]'

Tensor-based Signature Example

DL flavor만 텐서 기반 서명 (예: TensorFlow, Keras, PyTorch, Onnx 및 Glun)을 지원

각 텐서 기반 입력 및 출력은 numpy 데이터 유형, 모양 및 선택적 이름 중 하나에 해당하는 dtype으로 표시된다. 모양을 지정할 때 크기가 가변적일 수 있는 축에 -1 이 사용된다. 다음 예제는 MNIST 데이터 세트에서 훈련된 분류 모델에 대한 모델 서명이 포함된 MLmodel 파일 발췌를 표시한다. 입력에는 이름이 지정된 텐서가 하나 있으며 입력 샘플은 float32 숫자의 28x28x1 배열로 표현되는 이미지다. 출력은 10개의 클래스 각각에 해당하는 가능성을 지정하는 10개의 단위가 있는 이름 없는 텐서이다. 입출력의 첫번째 차원은 배치 크기이므로 가변 배치 크기를 허용하기 위해 -1로 설정된다.

signature:
    inputs: '[{"name": "images", "dtype": "uint8", "shape": [-1, 28, 28, 1]}]'
    outputs: '[{"shape": [-1, 10], "dtype": "float32"}]'

Signature Enforcement

스키마 적용은 모델의 서명에 대해 제공된 입력이 호환되지 않는 경우 예외를 발생시킨다. 이 시행(Enforcement)은 기본 모델 구현을 호출하기 전에 MLflow에 적용된다. 이 적용은 MLflow 모델 배포 도구를 사용을 사용 하거나 모델을 python_fuction. 특히 네이티브 형식 (예: mlflow.sklearn.load_model() 호출)로 로드된 모델에는 적용되지 않는다.

Name Ordering Enforcement

입력 Name은 모델 서명에 대해 확인된다. 누락된 입력이 있는 경우 MLflow는 예외를 발생시킨다. 서명이 선언되지 않은 추가 입력으 무시된다. 서명의 입력 스키마가 입력 이름을 정의하는 경우 입력 일치는 이름별로 수행되고 입력은 서명과 일치하도록 재정렬 된다. 입력 스키마에 입력 이름이 없으면 위치별로 일치가 수행된다. (즉, MLflow는 입력 수만 확인한다)

Input Type Enforcement

입력 유형은 서명에 대해 확인된다.

열 기반 서명이 있는 모델의 경우 MLflow는 필요한 경우 안전한 유형 변환을 수행한다. 일반적으로는 무손실이 보장되는 변환만 허용된다. 예를들어, int -> long 또는 int -> double 변환은 괜찮고, long -> double 변환은 그렇지 않다. 유형을 호환 가능하게 만들 수 없는 경우 MLflow는 오류를 발생시킨다. 텐서 기반 서명이 있는 모델의 경우 유형 검사가 엄격하다. (즉, 입력 유형이 스키마에 지정된 유형과 일치하지 않으면 예외가 발생한다)

Handling Integers With Missing Values

누락된 값이 있는 정수 데이터는 일반적으로 Python에서 부동 소수점으로 표시된다. 따라서 Python에서 정수 열의 데이터 유형은 데이터 샘플에 따라 다를 수 있다. 정수와 부동 소수점이 호환되는 유형이 아니기 때문에 이러한 유형 차이는 런타임 시 스키마 적용 오류를 일으킬 수 있다. 예를들어 훈련 데이터에 정수 열c에 대한 결측값이 없는 경우 해당 유형은 정수가 된다. 그러나 c열에 누락된 값이 포함된 데이터 샘플에 점수를 매기려고 하면 해당 유형이 부동 소수점이 된다. 모델 서명이 c를 정수 유형으로 지정한 경우 MLflow는 float를 int로 변환할 수 없기 때문에 오류를 발생시킨다. MLflow는 python을 사용하여 모델을 제공하고 Spark에 모델을 배포하므로 대부분의 모델 배포에 영향을 미칠 수 있다.

Handling Data and Timestamp

날짜 시간 값의 Python에는 유형에 정밀도가 내장되어 있다. 예를들어, 일 정밀도가 있는 datatime 값에는 Numpy 유형 datatime64[D]이 있고 나노초 정밀도를 가진 값에는 유형이 datatime64[ns] 있다. 열 기반 모델 서명에서는 날짜 시간 정밀도가 무시되지만 텐서 기반 서명에는 적용된다.

서명을 사용하여 모델을 기록하는 방법

모델에 서명을 포함하려면 적절한 long_model 호출에 인수로 전달 합니다. (예: 모델 서명 객체는 손으로 만들거나 유효한 모델 입력 (예: 대상 열이 생략 된 훈련 데이터 세트) 및 유효한 모델 출력 (예: 훈련 데이터 세트에서 생성 된 모델 예측)이 있는 데이터 세트에서 생성할 수 있습니다. )

자세한 사용법은 공식홈페이지를 참조

모델 API

여러 방법으로 MLflow 모델을 저장하고 로드 할 수 있다. 첫째, MLflow는 여러 공통 라이브러리와의 통합을 포함한다. 예를들어, mlflow.sklearn 포함 save_model, log_model 및 load_model 대한 기능 모델을 scikit-learn. 둘째, mlflow.models.Model 클래스를 이용하여 모델을 만들고 작성할 수 있다. 이 클래스에는 4가지 주요 기능이 있다.

  • add_flavor 모델에 특징을 추가한다. 각 flavor는 문자열 이름과 key-value 속성 딕셔너리가 있다. 여기서 값은 YAML로 직렬화할 수 있는 모든 객체가 될 수 있다.
  • save 모델을 로컬 디렉토리에 저장한다.
  • log MLflow Tracking을 사용하여 모델을 현재 실행에서 아티팩트로 로깅한다.
  • load 로컬 디렉토리 또는 이전 실행의 아티팩트에서 모델을 로드한다.

Built-in Model Flavors

MLflow는 애플리케이션에 유용할 수 있는 몇 가지 표준 특징을 제공한다. 특히, 많은 배포 도구가 이러한 특징을 지원하므로 이러한 모든 도구의 이점을 누리기 위해 이러한 특징 중 하나로 자신의 모델을 내보낼 수 있음

Model Customization

MLflow의 기본 제공 모델 지속성 유틸리티는 널리 사용되는 다양한 ML 라이브러리의 모델을 MLflow 모델 형식으로 패키징 하는데 편리하지만 모든 사용 사례를 다루지 않는다. 예를들어 MLflow의 기본 제공 특징에서 명시적으로 지원하지않는 ML 라이브러리의 모델을 사용할 수 있다. 또는 사용자 지정 추론 코드 및 데이터를 패키징하여 MLflow 모델을 생성할 수 있다. 다행히 MLflow는 이러한 작업을 수행하는 데 사용할 수 있는 두 가지 솔루션 인 Custom Python ModelsCustom Flavors를 제공 한다.

Custom Python Models

mlflow.pyfunc 모듈은 save_model()log_model()을 제공한다. 모듈은 사용자 지정코드와 의존성 파일을 포함하는 python_function flavor로 MLflow Models를 만든다.

MLflow 모델을 생성하는 유틸리티 python_function사용자 지정 코드를 포함 풍미 이슈 (파일) 의존성. 이러한 아티팩트 종속성에는 Python ML 라이브러리에서 생성 된 직렬화 된 모델이 포함될 수 있다.

이러한 사용자 지정 모델에는 특징이 포함되어 있기 때문에 python_function SageMaker, AzureML 또는 로컬 REST 엔드 포인트와 같은 MLflow의 지원되는 프로덕션 환경에 배포 할 수 있다.

다음 예제는 mlflow.pyfunc모듈을 사용하여 사용자 지정 Python 모델을 만드는 방법을 보여줍니다 . MLflow의 python_function유틸리티 를 사용한 모델 사용자 지정에 대한 추가 정보 는 python_function 사용자 지정 모델 문서를 참조해라.

Categories:

Updated: