분할된 모델 사용하기¶
많은 데이터 세트는 여러 개의 독립적인 하위 집합으로 분할될 수 있습니다. 예를 들어, 매장 체인의 판매 데이터가 포함된 데이터 세트는 매장 번호별로 분할될 수 있습니다. 그런 다음 각 파티션에 대해 별도의 모델을 훈련시킬 수 있습니다. 파티션에 대한 훈련 및 추론 작업을 병렬화하여 작업의 실제 실행 시간을 줄일 수 있습니다. 더욱이 각 매장마다 기능이 매출에 미치는 영향이 크게 다를 수 있으므로, 이러한 접근법은 매장 수준에서 더 정확한 추론을 이끌어낼 수 있습니다.
Snowflake Model Registry는 다음과 같은 경우 분할된 데이터의 훈련 및 추론의 분산 처리를 지원합니다.
데이터 세트에는 데이터 파티션을 안정적으로 식별하는 열이 포함되어 있습니다.
각 개별 파티션의 데이터는 다른 파티션의 데이터와 상관관계가 없으며 모델을 훈련하는 데 충분한 행을 포함합니다.
모델은 상태 비저장(추론이 호출될 때마다 학습이 수행됨) 또는 상태 저장(추론 전에 한 번 학습이 수행되고 여러 추론 작업에 사용하기 위해 유지됨) 모델일 수 있습니다.
Snowflake Model Registry를 사용하면 사용자 지정 모델 을 통해 분할 훈련과 추론을 구현하십시오. 추론하는 동안 모델 추론 방법은 데이터 세트를 분할하고 웨어하우스의 모든 노드와 코어를 사용하여 각 파티션에 대한 예측을 병렬로 생성한 다음 나중에 결과를 단일 데이터 세트로 결합합니다.
참고
분할된 모델의 경우 등록된 모델을 생성하거나 등록된 모델을 구성하는 개별 모델과 등록 모델을 구분하는 것이 중요합니다. 가능한 경우 개별 기본 모델을 하위 모델로 지칭합니다.
참고
분할 훈련 및 추론에는 Snowpark ML(snowflake-ml-python
패키지) 버전 1.5.0 이상이 필요합니다.
모델 정의 및 로그 기록하기¶
분할된 모델 클래스는 Snowflake.ml.model.custom_model.CustomModel
에서 상속하며 @custom_model.partitioned_inference_api
데코레이터(Snowpark ML 버전 1.5.4 이상) 또는 @custom_model.inference_api
데코레이터(Snowpark ML 버전 1.5.0~1.5.3)로 추론 메서드가 선언됩니다. 표준 사용자 지정 모델 정의에 대한 자세한 내용은 직렬화된 파일을 통해 나만의 모델 유형 가져오기 섹션을 참조하십시오.
import pandas as pd
from snowflake.ml.model import custom_model
class ExamplePartitionedModel(custom_model.CustomModel):
@custom_model.partitioned_inference_api
def predict(self, input: pd.DataFrame) -> pd.DataFrame:
# All data in the partition will be loaded in the input dataframe.
#… implement model logic here …
return output_df
my_model = ExamplePartitionedModel()
모델을 로깅할 때 모델에 필요한 다른 옵션 과 함께 options
사전에서 TABLE_FUNCTION
의 function_type
을 제공하십시오.
from snowflake.ml.registry import Registry
reg = Registry(session=sp_session, database_name="ML", schema_name="REGISTRY")
model_version = reg.log_model(my_model,
model_name="my_model",
version_name="v1",
options={"function_type": "TABLE_FUNCTION"}, ###
conda_dependencies=["scikit-learn"],
sample_input_data=train_features
)
분할된 모델에 일반(테이블이 아닌) 함수가 메서드로 있는 경우 대신 method_options
사전을 사용하여 각 메서드의 유형을 지정할 수 있습니다.
model_version = reg.log_model(my_model,
model_name="my_model",
version_name="v1",
options={
"method_options": { ###
"METHOD1": {"function_type": "TABLE_FUNCTION"}, ###
"METHOD2": {"function_type": "FUNCTION"} ###
}
}
conda_dependencies=["scikit-learn"],
sample_input_data=train_features
)
분할된 모델 추론¶
Python ModelVersion
오브젝트의 run
메서드를 사용하여 각 레코드의 파티션을 식별하는 숫자 또는 문자열 값을 포함하는 열의 이름을 지정하는 partition_column
을 전달하여 파티션화된 방식으로 테이블 함수 메서드를 호출할 수 있습니다. 평소와 같이 Snowpark 또는 pandas DataFrame을 전달할 수 있습니다(후자는 로컬 테스트에 유용합니다). 사용자에게는 결과와 동일한 유형의 DataFrame이 제공됩니다. 이 예에서는 추론이 스토어 번호로 분할되어 있습니다.
model_version.run(
input_df,
function_name="PREDICT",
partition_column="STORE_NUMBER"
)
여기에 표시된 것처럼 SQL 을 사용하여 모델 테이블 함수를 직접 호출할 수도 있습니다.
SELECT output1, output2, partition_column
FROM input_table,
TABLE(
my_model!predict(input_table.input1, input_table.input2)
OVER (PARTITION BY input_table.store_number)
)
ORDER BY input_table.store_number;
입력 데이터는 자동으로 웨어하우스의 노드와 코어에 분할되고, 파티션은 병렬로 처리됩니다.
테이블 함수 구문에 대한 자세한 내용은 SQL로 UDF 호출하기 섹션을 참조하십시오.
상태 비저장 분할 모델¶
분할된 모델의 가장 간단한 애플리케이션에서는 predict
를 호출하면 학습과 추론이 모두 수행됩니다. 모델이 피팅되고 추론이 실행된 후 피팅된 모델이 즉시 폐기됩니다. 이러한 유형의 모델은 피팅 상태가 저장되지 않기 때문에 “상태 비저장”이라고 합니다. 다음은 각 파티션이 XGBoost 모델을 학습시키는 예입니다.
class ExampleStatelessPartitionedModel(custom_model.CustomModel):
@custom_model.partitioned_inference_api
def predict(self, input_df: pd.DataFrame) -> pd.DataFrame:
import xgboost
# All data in the partition will be loaded in the input dataframe.
# Construct training data by transforming input_df.
training_data = # ...
# Train the model.
my_model = xgboost.XGBRegressor()
my_model.fit(training_data)
# Generate predictions.
output_df = my_model.predict(...)
return output_df
my_model = ExampleStatelessPartitionedModel()
샘플 데이터를 포함한 상태 비저장 파티션 모델의 예는 분할된 모델 빠른 시작 가이드 를 참조하십시오.
상태 저장 분할 모델¶
저장된 하위 모델 피팅 상태를 로딩하는 상태 저장 분할 모델을 구현할 수도 있습니다. snowflake.ml.model.custom_model.ModelContext
를 통해 메모리에 모델을 제공하거나 피팅된 모델 아티팩트를 가리키는 파일 경로를 제공하고 추론 중에 이를 로딩하면 됩니다.
다음 예는 메모리에서 모델 컨텍스트에 모델을 제공하는 방법을 보여줍니다.
from snowflake.ml.model import custom_model
# `models` is a dict with model ids as keys, and fitted xgboost models as values.
models = {
"model1": models[0],
"model2": models[1],
...
}
model_context = custom_model.ModelContext(
models=models
)
my_stateful_model = MyStatefulCustomModel(model_context=model_context)
my_stateful_model
로 로그할 때 컨텍스트에 제공된 하위 모델은 모든 모델 파일과 함께 저장됩니다. 그런 다음 아래와 같이 컨텍스트에서 검색하여 추론 메서드 로직에서 액세스할 수 있습니다.
class ExampleStatefulModel(custom_model.CustomModel):
@custom_model.partitioned_inference_api
def predict(self, input: pd.DataFrame) -> pd.DataFrame:
model1 = self.context.model_ref("model1")
# ... use model1 for inference
predict
메서드에서 파티션 ID 를 통해 프로그래밍 방식으로 모델에 액세스할 수도 있습니다. 파티션 열이 입력 특성으로 제공되는 경우 파티션에 대해 피팅된 모델에 액세스하는 데 사용할 수 있습니다. 예를 들어 파티션 열이 MY_PARTITION_COLUMN
인 경우 다음과 같은 모델 클래스를 정의할 수 있습니다.
class ExampleStatefulModel(custom_model.CustomModel):
@custom_model.partitioned_inference_api
def predict(self, input: pd.DataFrame) -> pd.DataFrame:
model_id = input["MY_PARTITION_COLUMN"][0]
model = self.context.model_ref(model_id)
# ... use model for inference
마찬가지로 하위 모델도 아티팩트로 저장하고 런타임에 로딩할 수 있습니다. 이 접근 방식은 모델이 너무 커서 메모리에 맞지 않을 때 유용합니다. 모델 컨텍스트에 문자열 파일 경로를 제공합니다. 파일 경로는 추론 중에 ` self.context.path(artifact_id)` 로 액세스할 수 있습니다. 자세한 내용은 키워드 인자로 모델 컨텍스트 정의하기 섹션을 참조하십시오.
예¶
샘플 데이터를 포함한 예는 분할된 모델 빠른 시작 가이드 를 참조하십시오.
상태 저장 파티션이 있는 사용자 지정 모델의 예는 Snowflake의 많은 모델 추론 빠른 시작 가이드 를 참조하십시오.