Mlflow 8. Models
Contents
- Model 저장
- signature 추가하기
- 입 & 출력 예시 추가하기
- 최종 코드
1. Model 저장
모델을 저장하는 2가지 방법
- (1)
mlflow.sklearn.save_model()
- (2)
mlflow.sklearn.log_model()
- (1) 과의 차이점 : 저장되는 위치가 “
run
내부”
- (1) 과의 차이점 : 저장되는 위치가 “
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