Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

모델 저장소와 소비 코드 이전 절차

foundry_ml의 데이터셋 기반 모델 대신 palantir_models 모델 리소스를 게시합니다. 기존 저장소를 바꾸거나 새 저장소 및 Jupyter 작업 공간에서 다시 만들 수 있습니다. Code Workbook에서 작성한 모델은 새 Code Repository 또는 Jupyter Code Workspace로 옮겨야 합니다.

모델을 학습한 저장소나 작업 공간에서 추론하면 어댑터 의존성을 함께 사용할 수 있어 편합니다. 다른 저장소에서 소비할 때에는 어댑터 라이브러리를 가져오거나 sidecar를 사용합니다.

기존 저장소를 유지할 때

  1. foundry_ml을 참조하는 코드를 제거합니다. 전환 도중 주석 처리한 코드는 최종 코드에서 정리합니다.
  2. Libraries에서 foundry_ml 라이브러리를 제거합니다.
  3. 저장소를 최신 구성으로 업그레이드합니다.
  4. Run with와 Build with에서 Recommended를 선택하여 Python 3.10 이상으로 맞춥니다. conda_recipe/meta.yaml을 편집하는 경우 build와 run을 모두 갱신하며 Python 3.11 이상 또는 필요한 경우 3.10 계열로 구성합니다.
  5. Libraries에서 권장 palantir_models를 설치합니다. meta.yaml에 패키지 이름만 직접 넣으면 필요한 backing repository를 가져오지 않으므로 이 설치 절차를 사용합니다.

기존 Pipeline 형식의 저장소에 어댑터를 두는 이전 경로도 최신 저장소 구성으로 업그레이드해야 현재 모델링 기능을 사용할 수 있습니다. 특히 직접 모델 배포를 사용하려면 업그레이드가 필요합니다.

새 Model Training 저장소

새 저장소를 만드는 경우 What are you building?에서 Models를 선택하고 Model Training 템플릿으로 초기화합니다.

어댑터와 학습 모듈을 분리한 기본 구조를 사용합니다.

어댑터 작성

이 예제의 기존 학습 알고리즘은 median_income, housing_median_age와 total_rooms를 표준화한 뒤 median_house_value를 선형 회귀로 예측합니다. 이전에는 각 처리 단계를 foundry_ml의 Model 및 Stage로 감싸 저장했다면, 새 방식은 같은 학습 파이프라인을 ModelAdapter로 감싸 게시합니다.

model_adapters/adapter.py의 어댑터는 저장 및 로드, API와 추론 동작을 제공합니다. 여기서는 DillSerializer가 모델 저장과 복원을 처리합니다.

import palantir_models as pm
from palantir_models.serializers import DillSerializer


class SklearnRegressionAdapter(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=columns)}, \
                {'df_out': pm.Pandas(columns=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

학습 변환

model_training/model_training.py에서 학습 논리를 작성합니다. 경량 실행은 불필요한 Spark 로드와 Pandas 변환을 피합니다. Spark ML처럼 Spark 입력이 필요한 모델은 해당 실행 엔진을 사용합니다. 경량 실행에는 최신 저장소 구성과 foundry-transforms-lib-python이 필요합니다.

from transforms.api import transform, Input
from palantir_models.transforms import ModelOutput
from main.model_adapters.adapter import SklearnRegressionAdapter
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

def train_model(training_df):
    numeric_features = ["median_income", "housing_median_age", "total_rooms"]
    pipeline = Pipeline([
        ("scaler", StandardScaler()),
        ("regressor", LinearRegression()),
    ])
    pipeline.fit(training_df[numeric_features], training_df["median_house_value"])
    return pipeline

@transform.using(
    training_data_input=Input("/Housing/data/housing_train_data"),
    model_output=ModelOutput("/Housing/models/linear_regression_model"),
)
def compute(training_data_input, model_output):
    model = train_model(training_data_input.pandas())
    model_output.publish(model_adapter=SklearnRegressionAdapter(model))

입력과 모델 경로는 실제 리소스로 바꿉니다. 새 모델 리소스를 게시하는 것이며 이전 데이터셋 리소스의 종류를 그 자리에서 바꾸는 작업은 아닙니다. CBAC 환경에서는 출력 모델을 미리 생성하고 분류를 설정합니다. Build로 학습과 게시를 실행합니다.

추론 변환

model_training/run_inference.py는 새 모델을 ModelInput으로 읽습니다. 입력 및 출력 데이터셋과 모델 경로를 실제 값으로 맞춥니다. 아래 모델 경로는 앞에서 게시한 경로와 같습니다.

from transforms.api import transform, Input, Output
from palantir_models.transforms import ModelInput

@transform.using(
    testing_data_input=Input("/Housing/data/housing_test_data"),
    model_input=ModelInput("/Housing/models/linear_regression_model"),
    predictions_output=Output("/Housing/data/housing_testing_data_inferences"),
)
def compute(testing_data_input, model_input, predictions_output):
    inference_outputs = model_input.transform(testing_data_input)
    predictions_output.write_pandas(inference_outputs.df_out)

다른 저장소에서 만들었다면 use_sidecar=True로 어댑터와 의존성을 별도 환경에 로드하는 것을 권장합니다. 경량 @lightweight 또는 @transform.using에서 sidecar는 palantir_models 0.2010.0 이상이 필요합니다. sidecar를 사용하지 않으면 현재 저장소에 어댑터 및 의존성을 정의하거나 가져와야 합니다.

지표와 모든 소비 리소스

학습 과정의 기록은 Experiments, 특정 모델 버전의 평가는 Evaluations로 연결할 수 있습니다. Plotly Figure와 이미지를 지원하므로 기존 그래프 데이터로 새 플롯을 만들 수 있습니다. MetricSet의 자체 차트 객체를 그대로 log_plot에 전달하지는 않습니다.

기존 목표에서 MetricSet을 유지하려면 foundry_ml_metrics를 추가하고 model_input.model_version_rid에서 UUID 부분을 추출하여 모델에 연결합니다. 이 속성은 palantir_models 0.1602.0 이상에서 제공합니다. MetricSet 호환 예제와 실제 회귀 지표 코드는 계산한 값과 평가 데이터 트랜잭션을 보존합니다.

새 모델을 게시한 뒤에는 그것을 사용하는 변환, 배포와 목표의 제출물 및 지표 연결을 새 모델로 전환합니다. 기존 지표는 새 모델 및 데이터 버전에 맞춰 다시 빌드합니다. 대체 모델을 지정하는 캠페인 상태와 소비 코드의 실제 전환을 각각 확인합니다.