Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

Jupyter에서 모델 학습 및 게시

프로젝트 준비 후 빠른 대화형 모델 개발에 사용할 Jupyter Code Workspace를 구성합니다. 운영 학습 파이프라인을 코드 저장소에서 관리하는 대안은 Code Repositories 실습입니다.

워크스페이스와 데이터

code 폴더에서 + New > Jupyter Code Workspace를 선택하고 median_house_price_model_notebook으로 만듭니다. Continue로 기본 자원과 저장소 설정을 사용하고 Create로 엽니다.

Launcher에서 Python [user-default] 커널을 선택하고 노트북 이름을 model_training.ipynb로 정합니다.

Data 탭의 Add dataset > Read existing datasets에서 housing_features_and_labels를 추가하고 별칭을 training_data로 설정합니다. 제공된 가져오기 코드를 셀에 넣고 Shift+Enter로 실행합니다.

from foundry.transforms import Dataset

training_data = Dataset.get("training_data").read_table(format="pandas")

학습 및 시험 분리

새 셀에서 80%를 학습, 나머지를 시험으로 나눕니다. 실제 평가에는 학습에 쓰지 않은 데이터가 필요합니다.

train_df = training_data.sample(frac=0.8,random_state=200)
test_df = training_data.drop(train_df.index)
train_df

Add > Write data to a new dataset에서 data 폴더의 housing_test_data를 만들고 Tabular dataset 및 변수 test_df를 선택합니다. 생성한 코드로 시험 집합을 저장합니다.

from foundry.transforms import Dataset

housing_test_data = Dataset.get("housing_test_data")
housing_test_data.write_table(test_df)

의존성과 학습

Conda 및 pip 의존성은 관리 환경에 설치합니다. 모델에는 해결된 의존성과 노트북 작업 공간의 Python 파일들이 패키징됩니다. 이 예시는 pandas, scikit-learn, dill과 palantir_models를 사용합니다.

Launcher의 +에서 Terminal을 열고 다음 Maestro 명령을 사용합니다. Packages 탭으로 패키지 기반 저장소를 추가하여 같은 명령을 실행하는 경로도 있습니다.

maestro env conda install scikit-learn pandas dill "palantir_models>=0.1795.0"

새 셀에서 결측값 중앙값 대체, 표준화와 선형 회귀 파이프라인을 학습합니다. ModuleNotFoundError나 ImportError가 나타나면 Kernel > Restart Kernel...으로 환경 변경을 반영하고 필요한 입력 및 학습 셀을 다시 실행합니다.

from sklearn.impute import SimpleImputer
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

numeric_features = ['median_income', 'housing_median_age', 'total_rooms']
numeric_transformer = Pipeline(
    steps=[
        ("imputer", SimpleImputer(strategy="median")),
        ("scaler", StandardScaler())
    ]
)

model = Pipeline(
    steps=[
        ("preprocessor", numeric_transformer),
        ("classifier", LinearRegression())
    ]
)
X_train = train_df[numeric_features]
y_train = train_df['median_house_value']
model.fit(X_train, y_train)
model

학습 중 지표와 매개변수를 남기려면 실험 기록을 사용할 수 있습니다.

모델 리소스와 어댑터

Models > Add model > Create new model에서 linear_regression_model을 models 폴더에 생성합니다.

어댑터는 노트북 안이 아니라 별도 .py 파일에 정의하여 가져와야 합니다. 이 별칭은 linear_regression_model_adapter.py와 LinearRegressionModelAdapter 클래스를 생성합니다. 다른 별칭을 썼다면 파일, 클래스와 게시 코드 import를 모두 맞춥니다.

생성된 파일의 미구현 메서드를 실제 코드로 바꿉니다. 추가 파일에만 구현하고 게시 import를 그대로 두면 이전 파일의 NotImplementedError가 계속 발생합니다. 아래 구현은 DillSerializer로 저장/로드를 처리하고 api 및 predict를 정의합니다.

import palantir_models as pm
from palantir_models.serializers import DillSerializer


class LinearRegressionModelAdapter(pm.ModelAdapter):

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

    @classmethod
    def api(cls):
        columns = [
            ('median_income', float),
            ('housing_median_age', float),
            ('total_rooms', float),
        ]
        return {"df_in": pm.Pandas(columns)}, \
               {"df_out": pm.Pandas(columns + [('prediction', float)])}

    def predict(self, df_in):
        df_in['prediction'] = self.model.predict(
            df_in[['median_income', 'housing_median_age', 'total_rooms']]
        )
        return df_in

생성된 파일을 이 내용으로 저장한 뒤 모델 사이드바의 Publish model version > Publish to Foundry 코드를 노트북으로 가져옵니다. 실제 학습 변수 model을 사용합니다. 게시 전에 어댑터 transform으로 시험 입력의 출력을 확인할 수 있습니다.

# Load the autoreload extension and automatically reload all modules
%load_ext autoreload
%autoreload 2
from palantir_models.code_workspaces import ModelOutput
from linear_regression_model_adapter import LinearRegressionModelAdapter # Update if class or file name changes

# Wrap the trained model in a model adapter for Foundry
linear_regression_model_adapter = LinearRegressionModelAdapter(model)
linear_regression_model_adapter.transform(test_df).df_out

검토한 어댑터를 모델 리소스에 게시합니다.

# Get a writable reference to your model resource.
model_output = ModelOutput("linear_regression_model")
model_output.publish(linear_regression_model_adapter) # Publishes the model to Foundry

예약 작업과 목표 제출

노트북을 변환으로 실행하는 추론 또는 재학습 작업을 만들고 예약할 수 있습니다. .ipynb를 Foundry 빌드로 실행하므로 계보와 권한을 추적하며 장시간 학습 중에도 대화형 개발을 이어갈 수 있습니다. Code Repositories, Pipeline Builder의 배치/스트리밍 추론 또는 직접 온라인 배포에서도 모델을 사용할 수 있습니다.

View model version에서 모델을 열고 Submit to a Modeling Objective로 준비한 목표에 제출합니다. 제출 이름은 linear_regression_model, 소유자는 실습 사용자로 지정합니다.

게시 오류

Model adapter api not defined가 나오면 오류에 적힌 생성 파일의 api와 predict를 구현했는지 확인합니다. 파일을 따로 만들었다면 구현을 생성 파일로 옮기거나 게시 import를 올바른 파일/클래스로 바꿉니다.

코드를 고쳤는데도 같다면 %load_ext autoreload, %autoreload 2 실행 여부를 확인하거나 커널을 다시 시작하고 import 및 필요한 셀을 재실행합니다. predict method not defined는 입력 시그니처와 반환값이 api에 맞는 predict 구현이 필요하다는 뜻입니다.

어댑터 import 오류는 파일 이름과 클래스 이름, 노트북과 같은 디렉터리에 저장되었는지를 확인합니다. 의존성을 방금 설치했다면 커널 재시작이 필요할 수 있습니다.

Jupyter, JupyterLab과 관련 로고는 NumFOCUS의 상표 또는 등록 상표입니다. 다른 제3자 상표도 각 소유자에게 속하며 제휴나 보증을 뜻하지 않습니다.