Snowflake Model Registry에 사용자 지정 모델 저장gkrl

Snowflake Model Registry 를 사용하면 모델을 등록(로그)하고 이를 Snowflake 내에서 추론에 사용할 수 있습니다. 레지스트리는 여러 유형의 모델을 지원합니다.

  • Snowpark ML Modeling

  • scikit-learn

  • XGBoost

  • LightGBM

  • CatBoost

  • PyTorch

  • TensorFlow

  • MLFlow PyFunc

  • 문장 변환기

  • Hugging Face 파이프라인

또한 모델 레지스트리 API를 사용하면 외부 도구를 사용하여 훈련되거나 오픈 소스 리포지토리에서 얻은 모델을 포함한 다른 유형의 모델도 직렬화 가능하고 snowflake.ml.model.custom_model.CustomModel 클래스에서 파생된 모델인 경우에는 기록이 가능합니다.

참고

이 가이드 는 사용자 지정 모델을 로깅하는 예를 제공합니다.

AWS SageMaker 또는 Azure ML에서 모델을 가져오는 방법에 대한 자세한 내용은 이 블로그 게시물 과 함께 제공되는 빠른 시작을 참조하십시오.

이 항목에서는 모델을 생성하고, 이를 Snowflake Model Registry에 기록하고, 배포하는 방법을 설명합니다. 이 기능의 일반적인 사용 사례는 몇 개의 변환기 또는 입력기에 이후에 예측자 또는 분류기와 같은 여러 클래스로 구성된 파이프라인을 정의하는 것입니다. 이러한 경우 사용자 지정 모델 클래스 자체는 비교적 간단하며, 이러한 클래스를 순서대로 호출하고 한 클래스의 결과를 다음 클래스의 입력으로 전달합니다.

모델 컨텍스트 정의하기

모델에는 코드 외에도 구성 파일이나 모델 가중치와 같은 하나 이상의 정적 파일이 필요한 경우가 많습니다. 사용자 지정 모델은 레지스트리가 모델과 함께 패키징할 수 있도록 이러한 모든 아티팩트에 대한 정보를 제공해야 합니다. 아티팩트는 다음과 같이 ModelContext 클래스를 사용하여 선언할 수 있습니다.

from snowflake.ml.model import custom_model

mc = custom_model.ModelContext(
    artifacts={
        'config': 'local_model_dir/config.json'
    },
)
Copy

모델 컨텍스트의 아티팩트 파일에 대한 경로는 모델이 기록된 환경의 현재 디렉터리를 기준으로 합니다. Snowflake Model Registry는 이 정보를 사용하여 모든 필수 코드와 데이터가 모델이 실행되는 웨어하우스에 배포되도록 합니다. 런타임에 모델은 self.context.path('config') 를 호출하여 이러한 아티팩트를 찾을 수 있습니다('config' 값은 ModelContext 에 전달된 사전의 키와 동일함).

정적 파일 외에도 모델은 지원되는 유형의 다른 모델이나 파이프라인(예: snowflake.ml.modeling.pipeline 또는 scikit-learn 모델)을 구성할 수 있습니다. 레지스트리는 이미 이러한 유형의 오브젝트를 로깅하는 방법을 알고 있으므로 여기에 표시된 것처럼 모델 컨텍스트에서 model_refs 를 사용하여 Python 오브젝트를 직접 전달할 수 있습니다. 이러한 오브젝트를 직접 패키징할 필요는 없습니다. 이는 부트스트랩 집계(배깅) 또는 전처리나 후처리에 유용할 수 있습니다.

참고

model1model2 는 레지스트리에서 기본적으로 지원하는 모든 유형의 모델 오브젝트입니다. feature_preprocsnowflake.ml.modeling.pipeline 오브젝트입니다.

mc = custom_model.ModelContext(
    artifacts={
        'config': 'local_model_dir/config.json'
    },
    models={
        'm1': model1,
        'm2': model2,
        'feature_preproc': preproc
    }
)
Copy

모델 레지스트리는 모델을 로깅할 때 이러한 모델 참조를 직렬화하고 런타임에 이를 다시 하이드레이션합니다. 모델은 예제 self.context.model_ref('m1') 을 사용하여 이러한 하위 모델에 대한 참조를 검색할 수 있습니다. 모델이 predict 메서드를 노출하는 경우, 코드에서 검색된 모델 참조에서 직접 호출할 수 있습니다(예: self.context.model_ref('m1').predict()).

요약하자면, 사용자 지정 모델의 컨텍스트는 모델의 아티팩트와 함께 직렬화할 Python 오브젝트를 선언합니다. 아티팩트는 모델에서 사용하는 로컬 파일이며 코드와 함께 Snowflake에 저장되어야 합니다. 모델 클래스는 컨텍스트를 사용하여 코드와 아티팩트를 로케이터로 찾습니다. 이는 모델이 로컬에서 실행 중이거나 Snowflake에서 실행 중이거나 상관없이 작동합니다.

사용자 지정 모델 클래스 작성하기

모델 레지스트리에 사용자 지정 모델을 기록하고 배포하는 방법을 알려주려면 snowflake.ml.model.custom_model.CustomModel 에서 상속합니다.

모델은 여러 추론 메서드를 노출할 수 있습니다(예: scikit-learn 모델은 predictpredict_proba 메서드를 노출). 사용자 지정 모델에서 추론 함수를 선언하려면 하위 클래스의 공용 메서드로 정의하고 @custom_model.inference_api 로 데코레이션합니다. 이 데코레이터는 메서드가 모델의 공용 API의 일부임을 나타내며, Python 또는 모델 레지스트리를 통해 SQL에서 호출할 수 있습니다. inference_api 를 사용하여 데코레이션된 메서드는 반드시 pandas DataFrame을 받고 반환해야 합니다. inference_api 를 사용하여 다양한 방법으로 데코레이션할 수 있습니다.

참고

공용 API가 pandas DataFrame을 받고 반환하기 위한 요건은 벡터화된 UDFs 와 동일합니다. 벡터화된 UDFs와 마찬가지로, 이러한 추론 APIs는 Python에서 Snowpark DataFrame을 전달하여 호출할 수 있습니다.

공용 API가 있는 스켈레톤 사용자 지정 모델 클래스는 아래와 같습니다.

context.path 를 사용하여 바이어스 파일을 열고 self.context.model_ref 를 사용하여 하위 모델 클래스에 대한 참조를 가져와서 해당 predict 메서드를 호출할 수 있습니다.

from snowflake.ml.model import custom_model
import pandas as pd

class ExamplePipelineModel(custom_model.CustomModel):

    @custom_model.inference_api
    def predict(self, input: pd.DataFrame) -> pd.DataFrame:
        ...
        return pd.DataFrame(...)
Copy

모든 조각을 하나로 합치면, 완벽하게 기능하는 사용자 지정 모델이 완성됩니다.

class ExamplePipelineModel(custom_model.CustomModel):
    def __init__(self, context: custom_model.ModelContext) -> None:
        super().__init__(context)
        v = open(context.path('config')).read()
        self.bias = json.loads(v)['bias']

    @custom_model.inference_api
    def predict(self, input: pd.DataFrame) -> pd.DataFrame:
        features = self.context.model_ref('feature_preproc').transform(input)
        model_output = self.context.model_ref('m2').predict(
            self.context.model_ref('m1').predict(features)
        )
        return pd.DataFrame({
            'output': model_output + self.bias})
Copy

사용자 지정 모델 사용하기

다음과 같이 로컬에서 실행하여 새 사용자 지정 모델(파이프라인)을 테스트할 수 있습니다.

my_model_pipeline = ExamplePipelineModel(mc)
output_df = my_model_pipeline.predict(input_df)
Copy

또는 레지스트리에 기록한 후 Snowflake에 배포합니다. 다음 코드 예제에서와 같이 conda_dependencies (또는 pip_requirements)를 제공하여 모델 클래스에 필요한 라이브러리를 지정합니다.

모델에 대한 입력 서명을 추론하려면 sample_input_data (pandas DataFrame)를 제공합니다. 또는 모델 서명 을 제공합니다.

reg = Registry(session=sp_session, database_name="ML", schema_name="REGISTRY")
mv = reg.log_model(my_model_pipeline,
            model_name="my_custom_model_pipeline",
            version_name="v1",
            conda_dependencies=["scikit-learn"],
            comment="My Custom ML Model Pipeline",
            sample_input_data=train_features)
output_df = mv.run(input_df)
Copy

테이블 함수 추론

Snowpark ML 1.5.4부터 여러 열을 반환하는 추론 메서드를 사용하여 모델을 로깅할 수 있습니다. 이렇게 하려면 옵션 {"function_type": "TABLE_FUNCTION"} 으로 모델을 로깅하고 위와 같이 @inference_api 데코레이터를 사용합니다. 다음 예제에서 데코레이트된 메서드는 두 개의 출력 열을 포함하는 pandas DataFrame을 반환합니다.

class ExampleTableFunctionModel(custom_model.CustomModel):

  @custom_model.inference_api
  def predict(self, input: pd.DataFrame) -> pd.DataFrame:
      output_df = pandas.DataFrame([{"OUTPUT1": input["INPUT1"] + 1, input["INPUT2"] + 1}])
      return output_df

my_model = ExampleTableFunctionModel()
reg = Registry(session=sp_session, database_name="ML", schema_name="REGISTRY")
mv = reg.log_model(my_model,
            model_name="my_custom_table_function_model",
            version_name="v1",
            options={"function_type": "TABLE_FUNCTION"},
            sample_input_data=train_features
            )
output_df = mv.run(input_df)
Copy

모델에 여러 추론 방법이 포함된 경우 method_options 옵션을 사용하여 모델을 기록하여 어떤 것이 FUNCTION 이고 어떤 것이 TABLE_FUNCTION 인지 표시합니다.

reg = Registry(session=sp_session, database_name="ML", schema_name="REGISTRY")
mv = reg.log_model(my_model,
            model_name="my_custom_table_function_model",
            version_name="v1",
            options={
              "method_options": {                                 ###
                "METHOD1": {"function_type": "TABLE_FUNCTION"},   ###
                "METHOD2": {"function_type": "FUNCTION"}          ###
              }
            },
            sample_input_data=train_features
            )
Copy

기록된 모델 테이블 함수 추론 메서드는 SQL을 통해서도 다음과 같이 호출할 수 있습니다.

SELECT OUTPUT1, OUTPUT2
  FROM input_table,
      table(
          MY_MODEL!PREDICT(input_table.INPUT1, input_table.INPUT2)
      )
Copy

데이터 파티션을 입력으로 받고 여러 행과 열을 출력하는 추론 방법의 분할 모델 추론 방법에 대해 자세히 알아보려면 분할된 사용자 지정 모델 섹션을 참조하십시오.