데이터 파티션 전체에서 모델 학습시키기¶
다중 모델 학습(MMT)을 사용하여 데이터 파티션에서 여러 머신 러닝 모델을 효율적으로 학습시킬 수 있습니다. 여기에서는 분산 오케스트레이션, 모델 저장소, 아티팩트 지속성을 자동으로 처리합니다.
MMT는 지정된 열을 기준으로 Snowpark DataFrame를 분할하고 각 파티션에서 각 모델을 병렬로 학습시킵니다. MMT가 인프라 복잡성을 처리하고 자동으로 확장하는 동안 모델 학습 논리에 집중하세요.
MMT를 사용하면 다양한 데이터 세그먼트에서 여러 모델을 효율적으로 학습시킬 수 있습니다. 이 도구는 리전별 판매 예측 모델을 학습시키거나, 각 고객 그룹에 자체 모델이 필요한 개인 설정 권장 시스템을 빌드하거나, 세그먼트별로 예측 모델 만드는 경우 등의 시나리오에 이상적입니다. MMT는 분산 모델 학습을 자동으로 처리하여 분산 컴퓨팅 인프라 관리의 복잡성을 없애 줍니다.
MMT를 사용하면 오픈 소스 머신 러닝 모델과 프레임워크(예: XGBoost, scikit-learn, PyTorch, TensorFlow)를 이용해 모델을 학습시킬 수 있습니다. MMT는 모델 아티팩트를 자동으로 직렬화하므로, 추론 시점에 모델 아티팩트에 액세스할 수 있습니다.
또한 ModelSerde 인터페이스를 구현하여 사용자 지정 모델을 학습시키거나 지원되지 않는 ML 프레임워크를 사용할 수 있습니다. 이렇게 하면 사용하는 모든 머신 러닝 프레임워크 또는 사용자 지정 모델 아키텍처와 MMT를 통합할 수 있습니다.
중요
MMT를 사용하기 전에 다음을 갖추고 있는지 확인하세요.
Container Runtime 환경: MMT를 사용하려면 Snowflake ML Container Runtime 환경이 필요합니다.
스테이지 액세스 허가: MMT가 모델 아티팩트를 Snowflake 스테이지에 자동으로 저장합니다. 지정된 스테이지에 액세스할 수 있는 적절한 권한이 있는지 확인하세요.
ML 프레임워크 지원: XGBoost, scikit-learn, PyTorch, TensorFlow에 대한 기본 통합 기능이 제공됩니다. 사용자 지정 모델에서는 ModelSerde 인터페이스를 구현하세요.
다음 섹션에서는 예제 워크플로에서 MMT를 사용하는 방법을 설명합니다.
MMT로 모델 학습시키기¶
이 섹션에서는 5가지 주요 단계의 전체 MMT 워크플로를 보여줍니다.
데이터 가져오기 - Snowpark를 사용해 학습 데이터를 로드합니다.
학습 함수 정의하기 - 학습 함수를 정의합니다.
파티션 전체에서 모델 학습시키기 - MMT를 사용하여 각 파티션에서 병렬로 모델을 학습시킵니다.
학습된 모델에 액세스하기 - 각 파티션에서 학습된 모델을 검색하고 사용합니다.
모델 지속성 및 검색 - 모델을 스테이지에 저장했다가 나중에 복원합니다.
워크플로는 데이터 파티션 전체에서 분산 학습, 모델 직렬화 및 아티팩트 저장소를 자동으로 처리합니다.
데이터 가져오기¶
Snowpark 세션을 사용하여 데이터 가져오기를 시작합니다. 다중 모델 학습 함수는 사용자가 지정한 열을 이용해 가져온 데이터를 다른 파티션으로 분할합니다.
MMT를 사용하기 전에 Snowpark 세션을 만듭니다. 자세한 내용은 Snowpark Python 세션 만들기 섹션을 참조하세요.
다음 코드는 Snowpark 세션을 사용하여 학습 데이터를 가져옵니다.
# Example: sales_data with columns: region, feature1, feature2, feature3, target
sales_data = session.table("SALES_TRAINING_DATA")
학습 함수 정의하기¶
데이터를 가져온 후 MMT를 사용하여 파티션 전체의 모델을 학습시키는 학습 함수를 정의합니다. 학습 함수는 데이터 커넥터와 학습 중인 데이터 파티션을 가리키는 컨텍스트 오브젝트를 수신합니다. 이 섹션에는 XGBoost를 학습시키기 위한 학습 함수를 정의하는 예제와 TensorFlow 및 PyTorch를 활용하는 예제가 포함되어 있습니다.
학습 함수에는 정확한 서명((data_connector, context)
)이 있어야 합니다. MMT가 각 데이터 파티션에서 다음 인자가 포함된 ``train_xgboost_model``을 호출합니다.
data_connector
: MMT가 분할하는 데이터에 액세스할 수 있는 데이터 커넥터입니다. ``train_xgboost_model``은 해당 데이터 프레임을 pandas로 변환합니다.context
:partition_id``를 ``train_xgboost_model
함수에 제공하는 오브젝트입니다. 이 ID는 사용자가 분할할 열의 이름입니다.
사용자가 이 함수를 직접 호출하지 않습니다. MMT가 모든 파티션에서 실행 작업을 처리합니다.
다음 코드를 사용하여 학습 함수를 정의합니다. 데이터의 기능을 반영하도록 코드를 변경한 후 MMT 함수에 이를 전달할 수 있습니다.
XGBoost를 사용하여 데이터 파티션 전체에서 딥 러닝 모델을 학습시킵니다. XGBoost는 정형 데이터에 탁월한 성능을 제공하고 누락된 값을 자동으로 처리합니다.
def train_xgboost_model(data_connector, context):
df = data_connector.to_pandas()
print(f"Training model for partition: {context.partition_id}")
# Prepare features and target
X = df[['feature1', 'feature2', 'feature3']]
y = df['target']
# Train the model
from xgboost import XGBRegressor
model = XGBRegressor(
n_estimators=100,
max_depth=6,
learning_rate=0.1,
random_state=42
)
model.fit(X, y)
return model
trainer = ManyModelTraining(train_xgboost_model, "model_stage")
PyTorch를 사용하여 데이터 파티션 전체에서 딥 러닝 모델을 학습시킵니다. PyTorch는 유연한 신경망 아키텍처와 동적 계산 그래프를 제공합니다.
def train_pytorch_model(data_connector, context):
import torch
import torch.nn as nn
df = data_connector.to_pandas()
# ... prepare data for PyTorch ...
model = nn.Sequential(nn.Linear(10, 1))
# ... training logic ...
return model # Automatically saved as model.pth
from snowflake.ml.modeling.distributors.many_model import TorchSerde
trainer = ManyModelTraining(train_pytorch_model, "models_stage", serde=TorchSerde())
TensorFlow를 사용하여 데이터 파티션 전체에서 딥 러닝 모델을 학습시킵니다. TensorFlow는 연구 및 프로덕션 배포 분야에 포괄적인 도구를 제공합니다.
def train_tf_model(data_connector, context):
import tensorflow as tf
df = data_connector.to_pandas()
# ... prepare data for TensorFlow ...
model = tf.keras.Sequential([tf.keras.layers.Dense(1)])
# ... training logic ...
return model # Automatically saved as model.h5
from snowflake.ml.modeling.distributors.many_model import TensorFlowSerde
trainer = ManyModelTraining(train_tf_model, "models_stage", serde=TensorFlowSerde())
ModelSerde 인터페이스를 구현하여 사용자 지정 모델 또는 지원되지 않는 ML 프레임워크를 사용합니다. 이 예제에서는 사용자 지정 메타데이터 처리 기능을 사용하는 scikit-learn을 보여줍니다.
from snowflake.ml.modeling.distributors.many_model import ModelSerde
import json
class ScikitLearnSerde(ModelSerde):
'''Custom serializer for scikit-learn models with metadata'''
@property
def filename(self) -> str:
return "sklearn_model.joblib"
def write(self, model, file_path: str) -> None:
import joblib
# Save model with metadata
model_data = {
'model': model,
'feature_names': getattr(model, 'feature_names_in_', None),
'model_type': type(model).__name__
}
joblib.dump(model_data, file_path)
def read(self, file_path: str):
import joblib
return joblib.load(file_path)
def train_sklearn_model(data_connector, context):
from sklearn.ensemble import RandomForestRegressor
df = data_connector.to_pandas()
X, y = df[['feature1', 'feature2']], df['target']
model = RandomForestRegressor()
model.fit(X, y)
return model # Automatically saved with metadata
trainer = ManyModelTraining(train_sklearn_model, "models_stage", serde=ScikitLearnSerde())
파티션 전체에서 모델 학습시키기¶
학습 함수를 정의하면 MMT를 사용하여 파티션 전체에서 모델을 학습시킬 수 있습니다. 분할할 열과 모델이 저장되는 스테이지를 지정합니다.
다음 코드는 region
열별로 데이터를 분할하고, train_xgboost_model
함수를 사용해 각 리전에서 각각의 모델을 병렬로 학습시킬 수 있습니다.
region
열에 가능한 값이 다음과 같은 경우를 예로 들 수 있습니다.
북부
남부
동부
서부
중부
ManyModelTraining
함수는 상기 리전별로 각각의 데이터 파티션을 만들고 각 파티션에서 모델을 학습시킵니다.
from snowflake.ml.modeling.distributors.many_model import ManyModelTraining
trainer = ManyModelTraining(train_xgboost_model, "model_stage") # Specify the stage to store the models
training_run = trainer.run(
partition_by="region", # Train separate models for each region
snowpark_dataframe=sales_data,
run_id="regional_models_v1" # Specify a unique ID for the training run
)
# Monitor training progress
final_status = training_run.wait()
print(f"Training completed with status: {final_status}")
모델은 ``run_id/{partition_id}``의 스테이지에 저장되며, 여기서 ``partition_id``는 파티션 열 값입니다.
학습된 모델에 액세스하기¶
MMT가 완료되면 지정된 스테이지에 저장된 각 데이터 파티션의 모델을 학습한 것입니다. 각 모델은 해당 파티션과 관련된 데이터로 학습됩니다. 예를 들어, “북부” 모델은 북부 리전 데이터로만 학습됩니다.
학습 실행 오브젝트는 이러한 모델에 액세스하고 각 파티션의 학습 상태를 확인하는 메서드를 제공합니다.
다음 코드는 학습 실행 상태의 확인하고 각 파티션에 학습된 모델을 검색합니다.
if final_status == RunStatus.SUCCESS:
# Access models for each partition
for partition_id in training_run.partition_details:
trained_model = training_run.get_model(partition_id)
print(f"Model for {partition_id}: {trained_model}")
# You can now use the model for predictions or further analysis
# Example: model.predict(new_data)
else:
# Handle training failures
for partition_id, details in training_run.partition_details.items():
if details.status != "DONE":
print(f"Training failed for {partition_id}")
error_logs = details.logs
모델 지속성 및 검색¶
MMT는 학습 프로세스 중에 학습된 모델을 지정된 Snowflake 스테이지에 자동으로 유지합니다. 각 모델은 실행 ID 및 파티션 식별자를 포함하는 정형 경로에 저장되어 나중에 모델을 쉽게 구성하고 검색할 수 있습니다.
자동 지속성 덕분에 모델을 수동으로 저장할 필요가 없습니다. MMT가 직렬화 및 저장소 작업을 처리해서 세션 시간 초과 또는 연결 문제로 인해 학습된 모델이 손실될 위험이 없습니다.
원래 세션이 종료된 후에도 이전 학습 실행을 복원하고 모델에 액세스할 수 있습니다. 이 지속성 메커니즘을 사용하면 다음을 수행할 수 있습니다.
다양한 세션에서 작업 재개
팀 구성원과 학습된 모델 공유
모델 버전 관리 워크플로 빌드
다운스트림 추론 파이프라인과 통합
모델은 지정된 스테이지에 자동으로 저장되어 나중에 검색할 수 있습니다.
# Restore training run from stage
restored_run = ManyModelTraining.restore_from("regional_models_v1", "model_stage")
# Access models from restored run
north_model = restored_run.get_model("North")
south_model = restored_run.get_model("South")
사용자 지정 모델 학습하기¶
사용자 지정 모델 또는 지원되지 않는 ML 프레임워크의 경우 ModelSerde 인터페이스를 구현합니다. 사용자 지정 모델에 대해 자체 직렬화/역직렬화 논리를 정의할 수 있습니다. 이렇게 하면 사용하는 모든 머신 러닝 프레임워크 또는 사용자 지정 모델 아키텍처와 MMT를 통합할 수 있습니다.
from snowflake.ml.modeling.distributors.many_model import ModelSerde
class CustomModelSerde(ModelSerde):
def serialize(self, model, path):
# Custom serialization logic
pass
def deserialize(self, path):
# Custom deserialization logic
pass
def train_custom_model(data_connector, context):
# Your custom training logic
model = your_custom_model_training(data_connector.to_pandas())
return model
trainer = ManyModelTraining(
train_custom_model,
"custom_model_stage",
model_serde=CustomModelSerde()
)
모델 레지스트리와 통합하기¶
MMT를 Snowflake의 모델 레지스트리와 통합하여 모델 관리 성능을 개선할 수 있습니다. 모델 레지스트리는 조직 전체에 중앙 집중식 모델 버전 관리, 메타데이터 추적, 배포 관리 기능을 제공합니다. 이 통합 기능은 MMT로 여러 모델을 학습할 때 특히 유용합니다. 이는 한 위치에서 파티션별 모델을 전부 구성하고, 추적하고, 관리하는 데 도움이 됩니다.
MMT와 함께 모델 레지스트리를 사용하면 다음을 수행할 수 있습니다.
파티션별 모델에 대한 여러 반복 작업 추적
모델 성능 메트릭, 학습 매개 변수, 계보 정보 저장
각 파티션의 프로덕션에 배포되는 모델 버전 관리
적절한 액세스 제어와 문서를 사용하여 팀 간에 모델 공유
모델 배포 시 승인 워크플로 및 규정 준수 추적 구현
# Register trained models to Model Registry
for partition_id in training_run.partition_details:
model = training_run.get_model(partition_id)
# Register to Model Registry
model_ref = registry.log_model(
model,
model_name=f"sales_model_{partition_id.lower()}",
version_name="v1"
)