모델을 운영에 배포하기
프로젝트, 학습 모델과 Modeling Objective 제출물을 준비한 뒤 진행합니다. 평가는 운영 품질 판단에 권장됩니다. 배치 배포는 여러 레코드의 예측 결과를 데이터셋으로 만들고 온라인 배포는 REST 요청에 응답합니다. 목표 없이 Python 변환으로 직접 소비하거나 직접 모델 배포를 만드는 경로도 있습니다.
릴리스
목표의 staging과 production은 서로 다른 릴리스 환경입니다. staging에 새 모델을 릴리스하면 staging 배포만 바뀌고 production은 유지됩니다. 모델과 릴리스한 사용자 이력이 기록됩니다.
목표 홈의 Releases에서 Release to staging을 선택하여 검토한 뒤 화살표로 production 릴리스를 진행합니다. 예시 번호는 1.0입니다. 해당 환경을 따르는 배포는 새 릴리스로 갱신됩니다.
배치 배포
Create deployment에서 production 배치를 선택합니다. 예시 이름은 Batch deployment, 설명은 Production batch deployment입니다. 입력은 housing_inference_data, data 폴더의 새 출력은 house_price_predictions로 구성합니다.
배포 목록에서 배치를 선택하고 출력 데이터셋을 엽니다.
All actions > Manage schedules에서 Create new schedule > When multiple time or event conditions are met를 선택합니다. house_price_predictions가 New logic을 받으면 빌드하도록 저장합니다. 이 일정은 새 릴리스로 로직이 갱신될 때 결과를 다시 계산하는 경로입니다.
첫 결과는 Run now로 생성하고 완료 후 데이터셋의 prediction 열을 확인합니다.
온라인 추론 배포
온라인 엔드포인트는 Workshop/Slate의 모델 함수, 외부 앱 또는 curl에서 호출할 수 있습니다. 생성 권한은 배치 배포와 별도로 관리할 수 있으므로 옵션이 없으면 Support에 확인합니다.
목표 홈의 Create Deployment에서 production live 배포를 만들고 예시 이름 Live deployment 및 설명 Production live deployment를 지정합니다.
초기화와 업그레이드가 끝나면 배포의 Query 탭에서 모델 API에 맞는 요청을 시험할 수 있습니다. 아래 df_in은 이 실습의 코드 기반 어댑터 입력 이름입니다. 다른 학습기나 API를 사용했다면 실제 입력 이름과 필드를 확인합니다.
{
"df_in": [
{
"housing_median_age": 33.4,
"total_rooms": 1107.0,
"total_bedrooms": 206,
"population": 515.3,
"households": 200.9,
"median_income": 4.75
}
]
}
외부 HTTP 호출
Query 탭에서 요청을 복사하여 환경 URL과 완전한 배포 RID를 확인합니다. 신규 연결에는 이름 있는 입력을 받는 multi I/O v2 엔드포인트를 사용합니다. 아래 명령은 외부에서 안전하게 제공한 호스트, RID와 토큰을 사용하며 Authorization에 Bearer 접두사를 포함합니다.
: "${FOUNDRY_URL:?Set the HTTPS origin from the deployment Query tab}"
: "${DEPLOYMENT_RID:?Set the full live deployment RID}"
: "${FOUNDRY_TOKEN:?Provide your Foundry access token securely}"
curl --http2 --request POST --header "Content-Type: application/json" --header "Authorization: Bearer ${FOUNDRY_TOKEN}" --data '{"df_in":[{"housing_median_age":33.4,"total_rooms":1107.0,"total_bedrooms":206,"population":515.3,"households":200.9,"median_income":4.75}]}' "${FOUNDRY_URL%/}/foundry-ml-live/api/inference/transform/${DEPLOYMENT_RID}/v2"
기존 single I/O 경로는 /v2가 없는 엔드포인트이며 Modeling Objective 배포의 단일 입력/출력 모델에서만 지원되는 종료 예정 경로입니다. 그 요청은 모델 입력 이름 대신 requestData와 requestParams를 사용합니다. 신규 구현에는 v2를 권장합니다.
{
"requestData": [{
"housing_median_age": 33.4,
"total_rooms": 1107.0,
"total_bedrooms": 206,
"population": 515.3,
"households": 200.9,
"median_income": 4.75
}],
"requestParams": {}
}
실행 비용과 후속 모델
Modeling Objective의 staging 및 production 온라인 배포는 계속 실행되는 서버를 사용하며 자동 종료되지 않습니다. 실습 후 필요 없으면 배포의 Actions에서 비활성화하거나 삭제합니다. 직접 모델 배포는 0으로 축소하도록 구성할 수 있지만 다시 시작하는 첫 요청에는 준비 지연이 생길 수 있습니다.
다른 후보를 비교하려면 다음 random forest 학습을 수행할 수 있습니다. housing_age_per_income 특성을 내부 전처리에서 파생하므로 앞선 어댑터 API를 바꾸지 않습니다. 모델을 평가하고 새 production 릴리스로 갱신하는 절차를 반복합니다.
from transforms.api import transform, Input
from palantir_models.transforms import ModelOutput
from main.model_adapters.adapter import SklearnRegressionAdapter
def derive_housing_age_per_income(X):
X['housing_age_per_income'] = X['housing_median_age'] / X['median_income']
return X
def train_model(training_df):
from sklearn.ensemble import RandomForestRegressor
from sklearn.impute import SimpleImputer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, FunctionTransformer
numeric_features = ['median_income', 'housing_median_age', 'total_rooms']
numeric_transformer = Pipeline(
steps=[
("rooms_per_person_transformer", FunctionTransformer(derive_housing_age_per_income, validate=False)),
("imputer", SimpleImputer(strategy="median")),
("scaler", StandardScaler())
]
)
model = Pipeline(
steps=[
("preprocessor", numeric_transformer),
("regressor", RandomForestRegressor())
]
)
X_train = training_df[numeric_features]
y_train = training_df['median_house_value']
model.fit(X_train, y_train)
return model
@transform.using(
training_data_input=Input("<YOUR_PROJECT_PATH>/data/housing_training_data"),
model_output=ModelOutput("<YOUR_PROJECT_PATH>/models/random_forest_regressor_model"),
)
def compute(training_data_input, model_output):
training_df = training_data_input.pandas()
model = train_model(training_df)
# Wrap the trained model in a ModelAdapter
foundry_model = SklearnRegressionAdapter(model)
# Publish and write the trained model to Foundry
model_output.publish(
model_adapter=foundry_model
)
실습 결론에서 계보와 실제 업무 적용을 확인합니다.