Snowflake Model Registry: 분할된 사용자 지정 모델

많은 데이터 세트는 여러 개의 독립적인 하위 집합으로 쉽게 분할될 수 있습니다. 예를 들어, 매장 체인의 판매 데이터가 포함된 데이터 세트는 매장 번호별로 분할될 수 있습니다. 그런 다음 각 파티션에 대해 별도의 모델을 훈련시킬 수 있습니다. 파티션에 대한 훈련 및 추론 작업을 병렬화하여 작업의 실제 실행 시간을 줄일 수 있습니다. 더욱이 각 매장마다 기능이 매출에 미치는 영향이 다소 다를 수 있으므로, 이러한 접근법은 실제로 매장 수준에서 더 정확한 추론을 이끌어낼 수 있습니다.

Snowflake Model Registry는 다음과 같은 경우 분할된 데이터의 훈련 및 추론의 분산 처리를 지원합니다.

  • 데이터 세트에는 데이터 파티션을 안정적으로 식별하는 열이 포함되어 있습니다.

  • 각 개별 파티션의 데이터는 다른 파티션의 데이터와 상관관계가 없으며 모델을 훈련하는 데 충분한 행을 포함합니다.

  • 모델은 상태가 없습니다. 즉, 호출될 때마다 피팅(훈련)과 추론(예측)을 모두 수행하고 호출 간에 가중치나 기타 모델 상태를 유지하지 않습니다.

Snowflake Model Registry를 사용하면 사용자 지정 모델 을 통해 분할 훈련과 추론을 구현할 수 있습니다. 이 모델을 사용하면 레지스트리는 데이터 세트를 분할하고, 웨어하우스의 모든 노드와 코어를 사용하여 병렬로 분할을 맞추고 예측한 후 그 결과를 단일 데이터 세트로 결합합니다.

참고

분할 훈련 및 추론에는 Snowpark ML(snowflake-ml-python 패키지) 버전 1.5.0 이상이 필요합니다.

사용자 지정 모델 정의 및 로깅

사용자 지정 모델 클래스 작성하기 에서의 설명과 같이, @custom_model.partitioned_inference_api 데코레이터(Snowpark ML 버전 1.5.4 이상) 또는 @custom_model.inference_api 데코레이터(Snowpark ML 버전 1.5.0~1.5.3)를 사용하여 사용자 지정 모델 추론 메서드를 선언합니다.

class ExampleForecastingModel(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 = ExampleForecastingModel()
Copy

모델을 로깅할 때 모델에 필요한 다른 옵션 과 함께 options 사전에서 TABLE_FUNCTIONfunction_type 을 제공하십시오.

reg = Registry(session=sp_session, database_name="ML", schema_name="REGISTRY")
mv = 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
)
Copy

사용자 지정 모델에 일반(테이블이 아닌) 함수가 메서드로 있는 경우 대신 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
)
Copy

훈련 및 추론 수행하기

Python ModelVersion 오브젝트의 run 메서드를 사용하여 각 레코드의 파티션을 식별하는 숫자 또는 문자열 값을 포함하는 열의 이름을 지정하는 partition_column 을 전달하여 파티션화된 방식으로 테이블 함수 메서드를 호출할 수 있습니다. 평소와 같이 Snowpark 또는 pandas DataFrame을 전달할 수 있습니다(후자는 로컬 테스트에 유용합니다). 사용자에게는 결과와 동일한 유형의 DataFrame이 제공됩니다. 이러한 예제에서는 매장 번호를 기준으로 파티션을 분할합니다.

mv.run(
  input_df,
  function_name="PREDICT",
  partition_column="STORE_NUMBER"
)
Copy

다음과 같이 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;
Copy

입력 데이터는 자동으로 웨어하우스의 노드와 코어에 분할되고, 파티션은 병렬로 처리됩니다.

많은 데이터 세트는 여러 가지 방법으로 분할될 수 있습니다. 모델을 호출할 때 파티션 열이 지정되므로, 모델을 변경하지 않고도 다양한 파티션 구성테이블을 쉽게 시도해 볼 수 있습니다. 예를 들어, 가상의 매장 판매 데이터 세트에서 매장 번호나 주 또는 지방별로 분할하여 어느 분할이 더 효과적으로 예측하는지 확인할 수 있습니다.

즉, 분할되지 않은 처리를 위해 별도의 모델이 필요하지 않습니다. 파티션 열을 지정하지 않으면 파티셔닝이 수행되지 않으며 모든 데이터가 평소처럼 함께 처리됩니다.

샘플 데이터를 포함한 예제는 분할된 사용자 지정 모델 빠른 시작 가이드 를 참조하십시오.