Treinamento dos modelos de machine learning com Snowpark Python

Este tópico explica como treinar os modelos de machine learning (ML) com Snowpark.

Nota

Snowpark ML é um companheiro do Snowpark Python criado especificamente para aprendizado de máquina no Snowflake. Este tópico ainda contém informações gerais úteis sobre aprendizado de máquina com Snowpark Python, especialmente se você preferir escrever seus próprios procedimentos armazenados para aprendizado de máquina.

Neste tópico:

Warehouses otimizados para Snowpark

O treinamento de modelos de machine learning (ML) podem consumir muitos recursos às vezes. Os warehouses otimizados para Snowpark são de um tipo de warehouse virtual do Snowflake que pode ser usado para cargas de trabalho que exigem uma grande quantidade de recursos de memória e computação. Por exemplo, você pode usá-los para treinar um modelo de ML usando código personalizado em um nó único.

Estes warehouses otimizados também podem se beneficiar de alguns cenários de UDF e UDTF.

Para obter mais informações sobre como criar um warehouse otimizado para Snowpark, consulte Warehouses otimizados para Snowpark.

Uso de procedimentos armazenados Snowpark Python para treinamento de ML

Os procedimentos armazenados Snowpark Python podem ser usados para executar o código personalizado usando um warehouse Snowflake. Os warehouses otimizados para Snowpark permitem o uso de procedimentos armazenados Snowpark para executar cargas de trabalho de treinamento de ML de nó único no Snowflake.

Um procedimento armazenado Python pode executar consultas aninhadas, usando a API Snowpark para Python, para carregar e transformar o conjunto de dados, que é então carregado na memória do procedimento armazenado para executar o treinamento de ML e pré-processamento. O modelo treinado pode ser carregado em um estágio no Snowflake e pode ser usado para criar UDFs para melhorar a inferência.

Enquanto os warehouses otimizados para Snowpark podem ser usados para executar a lógica de treinamento e pré-processamento, pode ser necessário executar consultas aninhadas em um warehouse separado para conseguir um melhor desempenho e uso de recursos. Um warehouse de consulta separado pode ser ajustado e dimensionado independentemente, com base no tamanho do conjunto de dados.

Diretrizes

Siga essas diretrizes para executar as cargas de trabalho de treinamento de ML de nó único:

  • Defina WAREHOUSE_SIZE = MEDIUM para garantir que o warehouse otimizado para Snowpark seja composto por 1 nó otimizado para Snowpark.

  • Defina o parâmetro do warehouse MAX_CONCURRENCY_LEVEL como 1 para aumentar a memória e os recursos de computação para um determinado procedimento armazenado Snowpark. Por exemplo:

    alter warehouse snowpark_opt_wh set max_concurrency_level = 1;
    
    Copy
  • Considere configurar os warehouses como warehouse multicluster para oferecer suporte à simultaneidade desejada, se necessário.

  • Considere usar um warehouse separado para executar consultas aninhadas a partir de um procedimento armazenado:

  • Não misture outras cargas de trabalho no warehouse otimizado para Snowpark usado para executar procedimentos armazenados de treinamento de ML.

Exemplo

O exemplo a seguir cria e usa um warehouse otimizado para Snowpark. O exemplo depois cria um procedimento armazenado que treina um modelo de regressão linear. O procedimento armazenado usa dados em uma tabela com nome MARKETING_BUDGETS_FEATURES (não mostrado aqui).

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

Para chamar o procedimento armazenado, execute o seguinte comando:

CALL train();
Copy

Nota

Várias outras demos do Snowpark Python estão disponíveis no repositório Snowflake-LabsGitHub. O exemplo de Despesa com publicidade e previsão de ROI demonstra como criar um procedimento armazenado que reina um modelo de regressão linear.