로컬 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을 확인합니다. 실제 결과는 입력 및 학습된 모델에 따라 계산됩니다.
배포의 유지 비용과 시작 및 종료 조건은 운영 배포에서 확인합니다.