Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

로컬 Iris 분류 모델 업로드

Iris 데이터의 sepal_length, sepal_width, petal_length와 petal_width 네 특성으로 품종을 분류하는 예제입니다. 로컬에서 K-nearest neighbors 모델을 학습하여 pickle 파일로 저장하고 Foundry에서 어댑터와 함께 게시합니다. 예제 환경은 Python 3.8.0 및 scikit-learn 1.3.2입니다.

로컬 학습 파일

데이터를 시험 비율 0.4 및 random_state 4로 나누고 이웃 수 5인 KNeighborsClassifier를 학습합니다. 결과를 iris_model.pkl에 저장합니다.

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier

import pickle

iris = load_iris()
X = iris.data
y = iris.target

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.4, random_state=4)

knn = KNeighborsClassifier(n_neighbors = 5)
knn.fit(X_train, y_train)

with open("iris_model.pkl", "wb") as f:
    pickle.dump(knn, f)

비정형 데이터셋과 저장소

파일 가져오기 절차에 따라 iris_model.pkl을 비정형 데이터셋으로 올립니다.

Model Integration 종류와 Model Training 언어 템플릿의 저장소를 만들고 scikit-learn 1.3.2를 의존성에 추가합니다. palantir_models와 dill도 사용할 수 있어야 합니다.

어댑터와 게시 변환

src/main/model_adapters/adapter.py에 다음 어댑터를 둡니다. 학습한 배열과 같은 순서로 네 특성을 전달합니다. 결과 target은 예측 클래스 인덱스입니다. 평가 정답이 함께 있으면 actual_target처럼 다른 열에 보관해야 예측이 정답을 덮어쓰지 않습니다.

import palantir_models as pm
from palantir_models.serializers import DillSerializer

class IrisModelAdapter(pm.ModelAdapter):
    FEATURE_COLUMNS = ["sepal_length", "sepal_width", "petal_length", "petal_width"]

    @pm.auto_serialize(
        model=DillSerializer(),
        prediction_column_name=DillSerializer(),
    )
    def __init__(self, model, prediction_column_name):
        self.model = model
        self.prediction_column_name = prediction_column_name

    @classmethod
    def api(cls):
        columns = [(name, float) for name in cls.FEATURE_COLUMNS]
        return (
            {"df_in": pm.Pandas(columns=columns)},
            {"df_out": pm.Pandas(columns=columns + [("target", int)])},
        )

    def predict(self, df_in):
        values = df_in[self.FEATURE_COLUMNS].to_numpy()
        df_in[self.prediction_column_name] = self.model.predict(values)
        return df_in

이 API는 출력 이름을 target으로 선언하므로 prediction_column_name에도 target을 전달합니다. 다른 이름으로 바꾸려면 API 선언도 함께 바꿉니다.

src/main/model_training/publish_model.py에서 파일을 읽고 게시합니다. 경로를 실제 비정형 데이터셋과 출력 모델로 바꾸며 CBAC 환경에서는 모델 출력을 미리 생성합니다.

import pickle
from transforms.api import transform, Input
from palantir_models.transforms import ModelOutput
from main.model_adapters.adapter import IrisModelAdapter

@transform(
    model_files=Input("/Iris/imported/model_files"),
    model_output=ModelOutput("/Iris/models/iris_model"),
)
def compute(model_files, model_output):
    with model_files.filesystem().open("iris_model.pkl", "rb") as model_file:
        model = pickle.load(model_file)
    model_output.publish(model_adapter=IrisModelAdapter(model, "target"))

목표에 제출

프로젝트 폴더의 New > Modeling Objective로 목표를 만듭니다.

Model Submissions > Submit a Model에서 Add Model을 선택합니다.

Submit model from Foundry > Next에서 게시한 모델을 선택합니다.

목표 개요의 Model submissions에 제출 정보가 나타납니다.

릴리스와 온라인 배포

제출한 모델을 선택하여 상세 페이지를 엽니다.

오른쪽 위 Create new release로 릴리스를 만듭니다.

왼쪽 위 목표 이름으로 개요에 돌아가 Deployments > Create deployment를 선택합니다.

설정 양식을 작성하고 Create deployment를 선택합니다. 목표의 Deployments에서 생성한 배포를 엽니다.

Query 탭에서 네 수치 특성을 입력하고 출력 target을 확인합니다. 실제 결과는 입력 및 학습된 모델에 따라 계산됩니다.

배포의 유지 비용과 시작 및 종료 조건은 운영 배포에서 확인합니다.