모델 저장소와 소비 코드 이전 절차
foundry_ml의 데이터셋 기반 모델 대신 palantir_models 모델 리소스를 게시합니다. 기존 저장소를 바꾸거나 새 저장소 및 Jupyter 작업 공간에서 다시 만들 수 있습니다. Code Workbook에서 작성한 모델은 새 Code Repository 또는 Jupyter Code Workspace로 옮겨야 합니다.
모델을 학습한 저장소나 작업 공간에서 추론하면 어댑터 의존성을 함께 사용할 수 있어 편합니다. 다른 저장소에서 소비할 때에는 어댑터 라이브러리를 가져오거나 sidecar를 사용합니다.
기존 저장소를 유지할 때
- foundry_ml을 참조하는 코드를 제거합니다. 전환 도중 주석 처리한 코드는 최종 코드에서 정리합니다.
- Libraries에서 foundry_ml 라이브러리를 제거합니다.
- 저장소를 최신 구성으로 업그레이드합니다.
- Run with와 Build with에서 Recommended를 선택하여 Python 3.10 이상으로 맞춥니다. conda_recipe/meta.yaml을 편집하는 경우 build와 run을 모두 갱신하며 Python 3.11 이상 또는 필요한 경우 3.10 계열로 구성합니다.
- 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 호환 예제와 실제 회귀 지표 코드는 계산한 값과 평가 데이터 트랜잭션을 보존합니다.
새 모델을 게시한 뒤에는 그것을 사용하는 변환, 배포와 목표의 제출물 및 지표 연결을 새 모델로 전환합니다. 기존 지표는 새 모델 및 데이터 버전에 맞춰 다시 빌드합니다. 대체 모델을 지정하는 캠페인 상태와 소비 코드의 실제 전환을 각각 확인합니다.