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;
필요한 경우 원하는 동시성을 지원하려면 웨어하우스를 멀티 클러스터 웨어하우스 로 설정해 보십시오.
저장 프로시저에서 중첩된 쿼리를 실행하기 위해 별도의 웨어하우스를 사용해 보십시오.
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)}
$$;
저장 프로시저를 호출하려면 다음 명령을 실행하십시오.
CALL train();
참고
다른 다양한 Snowpark Python 데모는 Snowflake-Labs GitHub 리포지토리 에서 사용할 수 있습니다. 광고 지출 및 ROI 예측 예제에서는 선형 회귀 모델을 학습시키는 저장 프로시저를 만드는 방법을 보여줍니다.