Mlflow 8. Models

Contents

  1. Model 저장
  2. signature 추가하기
  3. 입 & 출력 예시 추가하기
  4. 최종 코드


1. Model 저장

모델을 저장하는 2가지 방법

  • (1) mlflow.sklearn.save_model()
  • (2) mlflow.sklearn.log_model()
    • (1) 과의 차이점 : 저장되는 위치가 “run 내부”


example) mlflow.sklearn.log_model()

import mlflow

model = ... 
mlflow.sklearn.save_model(model, "my_model")

결과 :

my_model/
├── MLmodel
└── model.pkl


MLmodel 파일 : 모델에 대한 메타 정보

# MLmodel

time_created: 2022-05-01T13:18:33.25

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


2. signature 추가하기

앞서 말했듯, MLmodel 파일을 통해, 모델에 대한 대략적인 정보를 얻을 수 있다.

하지만 이 보다 자세히 알고 싶은 경우 ( ex. 모델의 입/출력 정보 ), signature를 추가해주면 된다.


example 1) signature 추론

  • by from mlflow.models.signature import infer_signature
import pandas as pd
from sklearn import datasets
from sklearn.ensemble import RandomForestClassifier
import mlflow
import mlflow.sklearn
from mlflow.models.signature import infer_signature

iris = datasets.load_iris()
iris_train = pd.DataFrame(iris.data, columns=iris.feature_names)
clf = RandomForestClassifier(max_depth=7, random_state=0)
clf.fit(iris_train, iris.target)

# signature 추가
signature = infer_signature(iris_train, clf.predict(iris_train))
mlflow.sklearn.log_model(clf, "iris_rf", signature=signature)


infer_signature() 함수

  • 인자 : input & output

  • 역할 : signature를 “추론” 해준다.


example 2) signature 직접 지정

  • by from mlflow.models.signature import ModelSignature
from mlflow.models.signature import ModelSignature
from mlflow.types.schema import Schema, ColSpec

input_schema = Schema([
  ColSpec("double", "sepal length (cm)"),
  ColSpec("double", "sepal width (cm)"),
  ColSpec("double", "petal length (cm)"),
  ColSpec("double", "petal width (cm)"),
])

output_schema = Schema([ColSpec("long")])

signature = ModelSignature(inputs=input_schema, 
                           outputs=output_schema)


위 코드 실행 결과 :

  • MLmodel 파일에, 추가적인 정보가 입력된다.
artifact_path: iris_rf
flavors:
  python_function:
    env: conda.yaml
    loader_module: mlflow.sklearn
    model_path: model.pkl
    python_version: 3.8.7
  sklearn:
    pickled_model: model.pkl
    serialization_format: cloudpickle
    sklearn_version: 0.24.2
run_id: 8f7e5d6b6e4e4a69a06ad1fd9e1eeafd
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": "tensor", "tensor-spec": {"dtype": "int64", "shape": [-1]}}]'
utc_time_created: '2022-05-02 15:41:25.361321'


3. 입 & 출력 예시 추가하기

해당 모델이 어떻게 작동되는지 보다 잘 이해하기 위해, 실제 인풋과 아웃풋이 어떤식으로 생겼는지를 알면된다. 그러기 위하, 아래와 같이 예시를 추가할 수 있다.

  • by ``mlflow.sklearn.log_model() 함수의 input_example` 인자
input_example = {
  "sepal length (cm)": 5.1,
  "sepal width (cm)": 3.5,
  "petal length (cm)": 1.4,
  "petal width (cm)": 0.2
}

mlflow.sklearn.log_model(clf, "iris_rf", 
                         input_example = input_example)


위와 같은 코드를 실행할 경우, artifacts/iris_rf 경로 하에, 아래의

input_example.json 파일이 생성된다.

{
    "columns": [
        "sepal length (cm)", 
        "sepal width (cm)",
        "petal length (cm)", 
        "petal width (cm)"
    ], 
    "data": [
        [5.1, 3.5, 1.4, 0.2]
    ]
}


4. 최종 코드

import pandas as pd
from sklearn import datasets
from sklearn.ensemble import RandomForestClassifier
import mlflow
import mlflow.sklearn
from mlflow.models.signature import infer_signature, ModelSignature
from mlflow.types.schema import Schema, ColSpec

iris = datasets.load_iris()
iris_train = pd.DataFrame(iris.data, columns=iris.feature_names)
clf = RandomForestClassifier(max_depth=7, random_state=0)
clf.fit(iris_train, iris.target)

#--------------------------------------------------#
# [방법 1] signature 직접 정의
input_schema = Schema([
  ColSpec("double", "sepal length (cm)"),
  ColSpec("double", "sepal width (cm)"),
  ColSpec("double", "petal length (cm)"),
  ColSpec("double", "petal width (cm)"),
])
output_schema = Schema([ColSpec("long")])
signature = ModelSignature(inputs=input_schema, 
                           outputs=output_schema)

#--------------------------------------------------#
# [방법 2] signature 추론
signature = infer_signature(iris_train, 
                            clf.predict(iris_train))

#--------------------------------------------------#
# input/output 예시
input_example = {
  "sepal length (cm)": 5.1,
  "sepal width (cm)": 3.5,
  "petal length (cm)": 1.4,
  "petal width (cm)": 0.2
}

#--------------------------------------------------#
# 모델 저장 ( log_model )
mlflow.sklearn.log_model(
    clf,
    "iris_rf", 
    signature = signature, 
    input_example = input_example
)


위의 코드를 실행할 경우, 아래와 같은 아티팩트들이 생성된다.

artifacts
└── iris_rf
    ├── MLmodel
    ├── conda.yaml
    ├── input_example.json
    └── model.pkl

참고 : https://dailyheumsi.tistory.com