Training von Machine Learning-Modellen mit Snowpark Python

Unter diesem Thema wird erklärt, wie mit Snowpark ML-Modelle (maschinelles Lernen) trainiert werden.

Bemerkung

Snowpark ML ist eine Ergänzung zu Snowpark Python, das speziell für maschinelles Lernen in Snowflake entwickelt wurde. Unter diesem Thema finden Sie weiterhin nützliche allgemeine Informationen zum maschinellen Lernen mit Snowpark Python, insbesondere wenn Sie es vorziehen, Ihre eigenen gespeicherten Prozeduren für maschinelles Lernen zu schreiben.

Unter diesem Thema:

Snowpark-optimierte Warehouses

Das Training von Modellen des maschinellen Lernens (ML) kann manchmal sehr ressourcenintensiv sein. Snowpark-optimierte Warehouses sind ein Typ von virtuellen Snowflake-Warehouse, der für Workloads verwendet werden kann, die eine große Menge an Arbeitsspeicher und Computeressourcen benötigen. Sie können sie zum Beispiel verwenden, um ein ML-Modell mit kundenspezifischem Code auf einem Einzelknoten zu trainieren.

Diese optimierten Warehouses können auch für einige UDF- und UDTF-Szenarios von Nutzen sein.

Weitere Informationen zum Erstellen von Snowpark-optimierten Warehouses finden Sie unter Snowpark-optimierte Warehouses.

Verwenden von gespeicherten Snowpark Python-Prozeduren für ML-Training

Gespeicherte Snowpark Python-Prozeduren können verwendet werden, um kundenspezifischen Code mit einem Snowflake-Warehouse auszuführen. Snowpark-optimierte Warehouses ermöglichen die Verwendung von gespeicherten Snowpark-Prozeduren zur direkten Ausführung von Einzelknoten-Workloads für ML-Training in Snowflake.

Eine gespeicherte Python-Prozedur kann verschachtelte Abfragen unter Verwendung der Snowpark-API für Python ausführen, um das Dataset zu laden und zu transformieren, das dann in den Arbeitsspeicher der gespeicherten Prozedur geladen wird, um die Vorverarbeitung und das ML-Training auszuführen. Das trainierte Modell kann in einen Snowflake-Stagingbereich hochgeladen und zur Erstellung von UDFs verwendet werden, um Inferenzen auszuführen.

Während Snowpark-optimierte Warehouses zur Ausführung von Vorverarbeitungs- und Trainingslogik verwendet werden können, kann es notwendig sein, verschachtelte Abfragen in einem separaten Warehouse auszuführen, um eine bessere Leistung und Ressourcennutzung zu erreichen. Ein separates Abfrage-Warehouse kann unabhängig von der Größe des Datasets eingestellt und skaliert werden.

Richtlinien

Beachten Sie bei der Ausführung von Einzelknoten-Workloads für ML-Training die folgenden Richtlinien:

  • Setzen Sie WAREHOUSE_SIZE = MEDIUM, um sicherzustellen, dass das Snowpark-optimierte Warehouse aus genau einem Snowpark-optimierten Knoten besteht.

  • Setzen Sie den Warehouse-Parameter MAX_CONCURRENCY_LEVEL auf 1, um Arbeitsspeicher und Computeressourcen für eine gegebene gespeicherte Snowpark-Prozedur zu maximieren. Beispiel:

    alter warehouse snowpark_opt_wh set max_concurrency_level = 1;
    
    Copy
  • Erwägen Sie, das Warehouse als Multi-Cluster-Warehouse einzurichten, um bei Bedarf die gewünschte Parallelität zu unterstützen.

  • Erwägen Sie die Verwendung eines separaten Warehouses für die Ausführung verschachtelter Abfragen aus der gespeicherten Prozedur:

    • Verwenden Sie session.use_warehouse()-API, um das Warehouse für die Abfrage innerhalb der gespeicherten Prozedur auszuwählen.

  • Verwenden Sie das Snowpark-optimierte Warehouse, das zur Ausführung der gespeicherten Prozeduren für das ML-Training verwendet wird, nicht gleichzeitig für andere Workloads.

Beispiel

Im folgenden Beispiel wird ein Snowpark-optimiertes Warehouse erstellt und verwendet. Danach wird in dem Beispiel eine gespeicherte Prozedur zum Trainieren eines linearen Regressionsmodells verwendet. Die gespeicherte Prozedur verwendet Daten in einer Tabelle mit dem Namen MARKETING_BUDGETS_FEATURES (hier nicht gezeigt).

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

Um die gespeicherte Prozedur aufzurufen, führen Sie den folgenden Befehl aus:

CALL train();
Copy

Bemerkung

Verschiedene andere Snowpark Python-Demos sind im GitHub-Repository von Snowflake-Labs verfügbar. Im Beispiel Marketingausgaben und ROI-Prognose wird gezeigt, wie eine gespeicherte Prozedur zum Trainieren eines linearen Regressionsmodells erstellt werden kann.