Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

Code Repositories에서 모델 학습과 추론

Model Training 템플릿은 어댑터와 Python 학습 변환을 같은 저장소에서 개발합니다. 여러 저장소에서 재사용할 어댑터는 Model Adapter Library로 게시하여 가져올 수 있습니다. 기존 Pipeline 형식 저장소에 어댑터를 두는 마이그레이션 경로는 저장소 업그레이드 조건을 따릅니다. 최신 모델링 기능, 특히 직접 배포를 사용하려면 현재 구성으로 업그레이드해야 합니다.

어댑터 모듈 분리

학습 코드와 어댑터는 서로 다른 Python 모듈에 둡니다. 기본 템플릿의 model_training과 model_adapters가 이 역할을 나눕니다. 이 구분으로 하위 변환에서 학습 코드와 분리해 어댑터를 사용할 수 있습니다.

src/main/model_adapters/adapter.py에 다음 어댑터를 둡니다. median_income, housing_median_age와 total_rooms로 학습한 실제 회귀 모델을 받습니다.

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

어댑터의 다른 입력 종류는 API 정의, 분류 예제는 scikit-learn 이진 분류에서 확인합니다.

학습 변환

src/main/model_training/model_training.py에서 입력을 읽고 학습한 모델을 어댑터로 감싸 ModelOutput.publish에 전달합니다. 아래 경로는 같은 프로젝트에서 준비한 실제 데이터셋과 모델 출력 경로로 바꿉니다. 학습 데이터에는 세 특성 외에 median_house_value 정답이 있어야 하며 scikit-learn, pandas와 dill 의존성이 필요합니다.

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

@transform.using(
    training_data=Input("/Housing/data/housing_training_data"),
    model_output=ModelOutput("/Housing/models/linear_regression_model"),
)
def compute(training_data, model_output):
    frame = training_data.pandas()
    features = ["median_income", "housing_median_age", "total_rooms"]
    model = Pipeline([
        ("imputer", SimpleImputer(strategy="median")),
        ("scaler", StandardScaler()),
        ("regressor", LinearRegression()),
    ])
    model.fit(frame[features], frame["median_house_value"])
    model_output.publish(model_adapter=LinearRegressionModelAdapter(model))

일반 환경에서는 Commit 또는 Build에서 변환 검사를 실행할 때 지정 경로의 모델 리소스를 생성할 수 있습니다. CBAC를 사용하는 환경에서는 변환이 자신의 출력 리소스를 만들 수 없습니다. 대상 폴더의 + New > Model로 모델을 미리 만들고 필요한 파일 분류를 설정한 뒤 그 경로를 사용합니다. Output 데이터셋도 미리 만들어야 합니다. 출력이 없으면 CBAC 환경에서 데이터셋 생성이 허용되지 않는다는 오류로 실패합니다.

CPU, 메모리 및 GPU 같은 실행 자원은 해당 실행 방식의 자원 설정과 Spark 프로필에 맞춰 구성합니다. @configure로 프로필을 지정할 수 있으며 GPU는 별도 조건을 충족해야 합니다. 선택적으로 학습 실험에 매개변수와 지표를 기록합니다.

미리보기

Preview는 전체 빌드 전에 로직을 확인하는 경로입니다. @configure로 지정한 실제 빌드보다 작은 자원 프로필에서 실행할 수 있습니다.

ModelOutput 미리보기는 학습뿐 아니라 모델 직렬화, 역직렬화와 API 구현을 확인합니다.

ModelInput 미리보기는 기존 모델의 추론을 확인합니다. Code Repositories 미리보기에서는 ModelInput 하나마다 5 GB 크기 제한이 있습니다.

빌드와 게시

Build는 Python 및 모델 의존성을 해결한 뒤 학습 로직을 실행합니다. ModelOutput.publish를 호출하면 auto_serialize 또는 save가 실행되어 새 모델 버전에 필요한 상태를 저장합니다.

다른 저장소에서 추론

모델을 만든 저장소 밖에서 사용한다면 ModelInput에 use_sidecar=True를 권장합니다. 모델 어댑터와 의존성을 별도 환경에 자동 로드합니다. @lightweight 또는 @transform.using의 비 Spark 추론에서 이 기능은 palantir_models 0.2010.0 이상이 필요합니다.

sidecar를 사용하지 않으면 어댑터와 의존성을 현재 저장소에 정의하거나 라이브러리로 가져와야 합니다. UI의 경고에서 라이브러리를 가져올 수 있고 모델 페이지에서 버전별 어댑터 라이브러리와 버전을 확인할 수 있습니다.

다음은 앞의 df_out 출력을 사용하는 경량 변환입니다. 다른 어댑터를 소비한다면 모델 버전의 API에서 출력 이름을 확인합니다. 예를 들어 일부 Hugging Face 어댑터는 output_data를 사용합니다.

from transforms.api import transform, Input, Output, LightweightInput, LightweightOutput
from palantir_models.transforms import ModelInput
from palantir_models import ModelAdapter

@transform.using(
    inference_input=Input("/Housing/data/inference_input"),
    model=ModelInput("/Housing/models/linear_regression_model", use_sidecar=True),
    inference_output=Output("/Housing/data/inference_output"),
)
def compute(inference_input: LightweightInput, model: ModelAdapter,
            inference_output: LightweightOutput):
    inference_output.write_pandas(model.transform(inference_input).df_out)

Modeling Objective에 제출하면 자동 평가, 배치 배포 또는 온라인 호스팅으로 소비할 수도 있습니다.

리소스 입력과 출력 객체

ModelInput은 모델 경로 또는 RID와 선택 버전을 받아 변환 실행 전에 해당 버전의 어댑터를 초기화합니다. load 또는 auto_serialize로 상태를 복원하므로 변환 함수가 받은 값은 모델 상태와 어댑터 메서드를 가진 인스턴스입니다.

ModelOutput은 모델 경로 또는 RID를 받습니다. 변환 함수에서는 WritableModel을 제공하며 publish(model_adapter=...)로 새 버전을 게시합니다. 게시할 때 어댑터가 state_writer에 모델 파일 또는 체크포인트를 기록합니다. 출력 리소스의 자동 생성은 앞의 CBAC 제한을 따릅니다.