Snowpark Python으로 머신 러닝 모델 학습시키기

이 항목에서는 Snowpark로 머신 러닝(ML) 모델을 학습시키는 방법을 설명합니다.

참고

Snowpark ML 은 Snowflake에서 머신 러닝을 위해 특별히 개발된 Snowpark Python의 동반자입니다. 이 항목에는 여전히 Snowpark Python을 사용한 머신 러닝에 대한 유용한 일반 정보가 포함되어 있으며, 특히 머신 러닝을 위한 자체 저장 프로시저를 작성하려는 경우 더욱 유용하게 활용할 수 있습니다.

이 항목의 내용:

Snowpark에 최적화된 웨어하우스

머신 러닝(Z) 모델 학습은 때로는 리소스를 매우 많이 사용할 수 있습니다. Snowpark에 최적화된 웨어하우스는 대량의 메모리와 컴퓨팅 리소스가 필요한 워크로드에 사용할 수 있는 일종의 Snowflake 가상 웨어하우스입니다. 예를 들어, 단일 노드에서 사용자 지정 코드를 사용하여 ML 모델을 학습하는 데 이런 웨어하우스를 사용할 수 있습니다.

이러한 최적화된 웨어하우스는 몇몇 UDF 및 UDTF 시나리오에도 도움이 될 수 있습니다.

Snowpark에 최적화된 웨어하우스를 만드는 방법에 대한 자세한 내용은 Snowpark에 최적화된 웨어하우스 섹션을 참조하십시오.

ML 학습에 Snowpark Python 저장 프로시저 사용하기

Snowpark Python 저장 프로시저 를 사용해 Snowflake 웨어하우스로 사용자 지정 코드를 실행할 수 있습니다. Snowpark에 최적화된 웨어하우스를 사용하면 Snowpark 저장 프로시저를 사용하여 Snowflake에서 직접 단일 노드 ML 학습 워크로드를 실행할 수 있습니다.

Python 저장 프로시저는 Python용 Snowpark API 를 사용해 중첩 쿼리를 실행하여 데이터 세트를 로딩하고 변환할 수 있으며, 그러면 데이터 세트가 저장 프로시저 메모리에 로드되어 전처리 및 ML 학습을 수행하게 됩니다. 학습된 모델은 Snowflake 스테이지에 업로드할 수 있으며 추론을 수행하는 UDF를 만드는 데 사용할 수 있습니다.

Snowpark에 최적화된 웨어하우스를 사용하여 전처리 및 학습 논리를 실행할 수 있지만, 더 나은 성능과 리소스 활용도를 달성하기 위해 별도의 웨어하우스에서 중첩된 쿼리를 실행해야 할 수도 있습니다. 데이터 세트 크기에 따라 별도의 쿼리 웨어하우스를 독립적으로 조정하고 확장할 수 있습니다.

지침

단일 노드 ML 학습 워크로드를 수행하려면 다음 지침을 따르십시오.

  • Snowpark에 최적화된 웨어하우스가 Snowpark에 최적화된 노드 1개로 구성되도록 하려면 WAREHOUSE_SIZE = MEDIUM으로 설정하십시오.

  • 주어진 Snowpark 저장 프로시저에 대한 메모리와 컴퓨팅 리소스를 최대화하려면 웨어하우스 MAX_CONCURRENCY_LEVEL 매개 변수를 1로 설정하십시오. 예:

    alter warehouse snowpark_opt_wh set max_concurrency_level = 1;
    
    Copy
  • 필요한 경우 원하는 동시성을 지원하려면 웨어하우스를 멀티 클러스터 웨어하우스 로 설정해 보십시오.

  • 저장 프로시저에서 중첩된 쿼리를 실행하기 위해 별도의 웨어하우스를 사용해 보십시오.

    • session.use_warehouse() API를 사용하여 저장 프로시저 내부의 쿼리에 대한 웨어하우스를 선택합니다.

  • ML 학습 저장 프로시저를 실행하는 데 사용되는 Snowpark에 최적화된 웨어하우스에서 다른 워크로드를 혼합하지 마십시오.

다음 예제에서는 Snowpark에 최적화된 웨어하우스를 만들고 사용합니다. 그런 다음 이 예제에서는 선형 회귀 모델을 학습시키는 저장 프로시저를 만듭니다. 저장 프로시저는 MARKETING_BUDGETS_FEATURES 라는 테이블(여기에는 표시되지 않음)의 데이터를 사용합니다.

CREATE OR REPLACE WAREHOUSE snowpark_opt_wh WITH
  WAREHOUSE_SIZE = 'MEDIUM'
  WAREHOUSE_TYPE = 'SNOWPARK-OPTIMIZED'
  MAX_CONCURRENCY_LEVEL = 1;

CREATE OR REPLACE PROCEDURE train()
  RETURNS VARIANT
  LANGUAGE PYTHON
  RUNTIME_VERSION = 3.8
  PACKAGES = ('snowflake-snowpark-python', 'scikit-learn', 'joblib')
  HANDLER = 'main'
AS $$
import os
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split, GridSearchCV
from joblib import dump

def main(session):
  # Load features
  df = session.table('MARKETING_BUDGETS_FEATURES').to_pandas()
  X = df.drop('REVENUE', axis = 1)
  y = df['REVENUE']

  # Split dataset into training and test
  X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state = 42)

  # Preprocess numeric columns
  numeric_features = ['SEARCH_ENGINE','SOCIAL_MEDIA','VIDEO','EMAIL']
  numeric_transformer = Pipeline(steps=[('poly',PolynomialFeatures(degree = 2)),('scaler', StandardScaler())])
  preprocessor = ColumnTransformer(transformers=[('num', numeric_transformer, numeric_features)])

  # Create pipeline and train
  pipeline = Pipeline(steps=[('preprocessor', preprocessor),('classifier', LinearRegression(n_jobs=-1))])
  model = GridSearchCV(pipeline, param_grid={}, n_jobs=-1, cv=10)
  model.fit(X_train, y_train)

  # Upload trained model to a stage
  model_file = os.path.join('/tmp', 'model.joblib')
  dump(model, model_file)
  session.file.put(model_file, "@ml_models",overwrite=True)

  # Return model R2 score on train and test data
  return {"R2 score on Train": model.score(X_train, y_train),"R2 score on Test": model.score(X_test, y_test)}
$$;
Copy

저장 프로시저를 호출하려면 다음 명령을 실행하십시오.

CALL train();
Copy

참고

다른 다양한 Snowpark Python 데모는 Snowflake-Labs GitHub 리포지토리 에서 사용할 수 있습니다. 광고 지출 및 ROI 예측 예제에서는 선형 회귀 모델을 학습시키는 저장 프로시저를 만드는 방법을 보여줍니다.