Pipelines erstellen und bereitstellen

Übersicht

Maschine Learning(ML)-Workflows umfassen in der Regel mehrere wichtige Phasen:

Datenexploration und -aufbereitung: In dieser ersten Phase geht es darum, die Rohdaten zu verstehen, zu bereinigen, fehlende Werte zu behandeln und sie in ein brauchbares Format umzuwandeln.

Data Engineering: Hier werden Rohdaten in Features umgewandelt, die das zugrundeliegende Problem der Vorhersagemodelle besser darstellen, wobei oft Techniken wie Skalierung, Codierung und die Erstellung neuer Features aus bestehenden Features erforderlich sind.

Modellentwicklung: In diesem Stagingbereich werden verschiedene ML-Modelle ausgewählt, mit den aufbereiteten Daten trainiert und abgestimmt, um ihre Leistung zu optimieren. Die entwickelten Modelle werden anhand geeigneter Kennzahlen streng bewertet, um ihre Präzision, Genauigkeit und Generalisierungsfähigkeiten zu bestimmen.

Modellbereitstellung: Produktionsbereite Modelle werden in einer Modell-Registry gespeichert und anschließend für Batch- oder Echtzeitvorhersagen auf neuen Daten eingesetzt.

Die erste Entwicklung von ML-Modellen profitiert oft von einem flexiblen, iterativen Ansatz, der es Data Scientists ermöglicht, schnell mit verschiedenen Algorithmen und Features zu experimentieren. Wenn die Modelle jedoch ausgereift sind und ihren Wert beweisen, verlagert sich der Fokus auf die Operationalisierung, bei der Pipelines mit CI/CD (Kontinuierliche Integration/Kontinuierliche Bereitstellung) gehärtet und automatisiert werden Diese Automatisierung stellt sicher, dass Änderungen an Code, Datenpipelines oder Modellen konsistent erstellt, getestet und bereitgestellt werden, was zu zuverlässigeren, effizienteren und besser wartbaren ML-Systemen führt.

Entwicklung

Beginnen Sie mit der interaktiven Entwicklung in einer lokalen IDE (z. B. VS-Code) oder einem interaktiven Notizbuch (Snowflake Notebook oder Jupyter). Parametrisieren Sie Eingaben (Tabellen, Stagingbereiche, Hyperparameter) und halten Sie die Schritte modular, um die Portabilität zu gewährleisten. So kann es zum Beispiel hilfreich sein, eine Zelle/Funktion für die Datenaufbereitung zu haben, eine andere für das Feature-Engineering, eine andere für das Modelltraining usw.

Snowflake bietet die folgenden Tools für jede Phase des Lebenszyklus des maschinellen Lernens:

Stagingbereich

Tool

Verwendung

Datenexploration

Snowflake Notebooks

Entwickeln Sie in einer verwalteten, browserbasierten Notebook-Umgebung. Verwenden Sie Python und SQL an einem Ort, um Datenset-Profile zu erstellen, Verteilungen zu visualisieren und schnell zu iterieren.

Snowpark DataFrames

Arbeiten Sie mit vertrauten DataFrame APIs, die die Berechnung an Snowflake übergeben.

Data Engineering

Snowpark DataFrames

Erstellen Sie mit SQL/Python/Scala mit Pushdown-Optimierung reproduzierbare Transformationen im Warehouse-Umfang.

UDFs/UDTFs

Kapseln Sie benutzerdefinierte Python-Logik als Funktionen oder Tabellenfunktionen ein, um komplexe Transformationen in Teams und Pipelines wiederzuverwenden.

Feature Store

Features mit zeitpunktbezogener Korrektheit und Wiederverwendung über Modelle hinweg definieren, registrieren und bereitstellen. Unterstützt konsistente Offline-Trainingssets und Online-Abrufe mit niedriger Latenz, wodurch Datenlecks und Duplizierung reduziert werden.

Modelltraining

Snowflake Notebooks

Trainieren Sie ML-Modelle mit bekannten Open Source-Bibliotheken wie scikit-learn, XGBoostund PyTorch in Ihren Snowflake Notebooks. Nutzen Sie die elastische Skalierung, vermeiden Sie Datenbewegungen und behalten Sie Modelle und Vorverarbeitung an einer Stelle bei.

ML Jobs

Verlagern Sie ressourcenintensive Schritte auf spezielle Computeoptionen wie Instanzen mit hohem Arbeitsspeicher, GPU-Beschleunigung und verteilte Verarbeitung aus jeder Umgebung, auch lokal IDEs, Notebooks und extern gehostete Orchestratoren.

Modellbereitstellung

Modell-Registry

Registrieren und versionieren Sie Modelle mit Abfolge- und Governance-Kontrollen. Zentralisiert die Erkennung und unterstützt sichere Workflows, Audits und Rollbacks.

Batch-Inferenz

Stellen Sie registrierte Modellen aus Python oder SQL bereit, wodurch die Inferenz nahe an den geregelten Daten bleibt und Operationen durch eine konsistente, durch die Registry unterstützte Ausführung vereinfacht werden.

Echtzeit-Inferenz

Stellen Sie registrierte Modelle auf verwalteten HTTPS-Endpunkten mit automatischer Skalierung bereit. Sie brauchen keine Infrastruktur mehr bereitstellen, was eine einfache, sichere Inferenz mit niedriger Latenz ermöglicht, integriert in Snowflake-Authentifizierung und -Governance.

Modellüberwachung

Erstellen Sie einen Monitor pro Modellversion, um Inferenzprotokolle zu materialisieren und tägliche Kennzahlen, Abweichungen, Leistung und statistische Signale in Snowsight automatisch zu aktualisieren. Konfigurieren Sie Alerts und benutzerdefinierten Dashboards, um Versionen zu vergleichen und Daten- oder Pipeline-Probleme schnell zu diagnostizieren

Workflow-Orchestrierung

Geplante Notebooks

Parametrisieren und konfigurieren Sie Snowflake Notebooks so, dass sie nicht interaktiv nach einem Zeitplan ausgeführt werden.

Task-Graphen

Operationalisieren Sie Ihre ML-Pipeline in einen Directed Acyclic Graph (DAG) und konfigurieren Sie sie so, dass sie nach einem Zeitplan oder durch ereignisbasierte Trigger ausgeführt wird.

Sicherheit und Governance

RBAC, Tags, Maskierung, Richtlinien

Wenden Sie rollenbasierten Zugriff, Datenklassifizierung und Maskierungs-/Zeilenrichtlinien auf Trainingsdaten, Features und Modelle an. Gewährleistet Zugriff auf Basis der niedrigsten Berechtigungen und die Einhaltung von Vorschriften im gesamten ML-Lebenszyklus.

Für die Produktion vorbereiten

Code vorbereiten

Bevor Sie Ihre Pipeline operationalisieren, bereiten Sie Ihren Code für die Produktion vor. Wenn Sie mit Notebooks begonnen haben, beginnen Sie mit der Umstrukturierung Ihres Codes in modulare, wiederverwendbare Funktionen, bei denen jeder größere Schritt (Datenaufbereitung, Feature-Engineering, Modelltraining, Evaluation) zu einer separaten Funktion mit klaren Eingaben und Ausgaben wird. Wenn Sie bereits modulare Skripte verwenden, stellen Sie sicher, dass jede Funktion über genau definierte Schnittstellen und Verantwortlichkeiten verfügt. Parametrisieren Sie alle Konfigurationswerte wie Tabellennamen und Hyperparameter, um eine umgebungsübergreifende Bereitstellung zu ermöglichen. Wir empfehlen auch, ein Einstiegspunkt-Skript zu erstellen, das die End-to-End-Pipeline lokal für Debugging und zukünftige Entwicklungen ausführt.

Beispiel einer Verzeichnisstruktur:

ml_pipeline_project/
├── README.md
├── requirements.txt
├── config/
├── src/ml_pipeline/
│   ├── utils/                     # Common utilities
│   ├── data/                      # Data preparation
│   ├── features/                  # Feature engineering
│   ├── models/                    # Model training
│   └── inference/                 # Model inference
├── scripts/
│   ├── run_pipeline.py            # Main entry point
│   └── dag.py
├── tests/
└── notebooks/
Copy

Beispielskript „run_pipeline.py“:

import argparse
from ml_pipeline.utils.config_loader import load_config
from ml_pipeline.data.ingestion import load_raw_data
from ml_pipeline.data.validation import validate_data_quality
from ml_pipeline.features.transformers import create_features
from ml_pipeline.models.training import train_model
from ml_pipeline.models.evaluation import evaluate_model
from ml_pipeline.models.registry import register_model

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--config", required=True, help="Config file path")
    parser.add_argument("--env", default="dev", help="Environment (dev/prod)")
    args = parser.parse_args()

    # Load configuration
    config = load_config(args.config, args.env)

    # Execute pipeline stages
    raw_data = load_raw_data(config.data.source_table)
    validate_data_quality(raw_data, config.data.quality_checks)
    features = create_features(raw_data, config.features.transformations)
    model = train_model(features, config.model.hyperparameters)
    metrics = evaluate_model(model, features, config.model.eval_metrics)
    register_model(model, metrics, config.model.registry_name)

if __name__ == "__main__":
    main()
Copy

Migration von Notebooks zu ML-Jobs

Der Großteil des Codes, der in Snowflake Notebooks geschrieben ist, funktioniert in ML-Jobs, ohne dass Codeänderungen erforderlich sind. Die folgenden Aspekte sollten Sie beachten:

Laufzeit-APIs

Bestimmte verteilte ML APIs sind nur innerhalb der Container Runtime verfügbar. Der Versuch, sie außerhalb der Container Runtime-Umgebung zu importieren, schlägt fehl. Diese APIs sind innerhalb von ML-Jobs verfügbar, müssen aber innerhalb der Nutzlast des ML-Jobs importiert werden.

# Attempting to import distributed runtime APIs in local/external
# environments will fail!
from snowflake.ml.modeling.distributors.xgboost import XGBEstimator

from snowflake.ml.jobs import remote

@remote(...)
def my_remote_function(...):
  # Move imports *inside* your ML Job payloads
  from snowflake.ml.modeling.distributors.xgboost import XGBEstimator  # This works!
  ...

job = my_remote_function()  # Start ML Job
job.wait()  # Wait for job to complete
Copy

Cluster-Skalierung

Das scale_cluster() API funktioniert nur innerhalb von Notebooks und nicht innerhalb von ML-Jobs. Geben Sie stattdessen die gewünschte Clustergröße zum Zeitpunkt der Übermittlung des Jobs an. Weitere Informationen dazu finden Sie unter Snowflake mit ML-Jobs mit mehreren Knoten.

from snowflake.ml.jobs import remote

@remote(..., target_instances=4)
def my_remote_function(...):
  # 4-node cluster will be provisioned for distributed processing
  # inside this job. The cluster will be automatically cleaned up on
  # job termination.
Copy

Pipeline-Orchestrierung

Sobald Sie Ihre End-to-End-Pipeline vorbereitet haben, operationalisieren Sie diese mit einem Orchestrator wie Snowflake Task-Graphen, Scheduled Notebooks oder externen Orchestratoren wie Airflow. Die Verwendung eines Orchestrierungs-Frameworks bietet mehrere entscheidende Vorteile:

  • Fehlertoleranz und Zuverlässigkeit durch automatische Wiederholungsversuche und Fehlerisolation

  • Beobachtbarkeit mit Ausführungsverlauf, Echtzeitstatus und Alerts

  • Planung und Koordination von komplexen Abhängigkeitsdiagrammen und verschiedenen Triggern

  • Operative Optimierung mit Versionskontrollintegration und Konfigurationsmanagement

Snowflake ML ist mit den meisten Orchestrierungs-Frameworks kompatibel, einschließlich Airflow, Dagster und Prefect. Wenn Sie bereits ein Workflow-/DAG-Setup haben, empfehlen wir, einfach Ihre bestehenden Workflows in Snowflake ML-Features zu integrieren und rechen- oder datenintensive Schritte in ML-Jobs oder UDFs auszulagern. Wenn Sie keine bestehendes DAG-Setup haben, können Sie Snowflake Task-Graphen für eine native Snowflake-Lösung verwenden.

So richten Sie die Orchestrierung mit einer DAG auf Snowflake ein:

  1. Bereiten Sie Ihren lokalen Pipeline-Code gemäß Code vorbereiten vor

  2. Erstellen Sie eine neue dag.py-Datei (oder ein anderer Name), die Ihre DAG-Definition enthält

  3. Implementieren Sie die DAG aus Ihrer Pipeline gemäß dieser Anleitung

  4. Führen Sie das dag.py-Skript aus, um den Task-Graphen in Ihrem Snowflake-Konto bereitzustellen

Tipp

Beim Ausführen eines Task-Graph-Skripts wird der Task-Graph nicht unbedingt ausgeführt. Ein einfaches Task-Graph-Skript definiert einfach den Task-Graphen und stellt ihn bereit. Die Ausführung des Task-Graphen muss separat ausgelöst werden, entweder manuell oder nach einem Zeitplan.

Trennung von Entwicklung und Produktion

Wir empfehlen, Ihr DAG-Skript zur Unterstützung der Isolierung Ihrer Entwicklungs(DEV)- und Produktions(PROD)-Umgebungen zu parametrisieren. Sie können dazu die Verbindungsverwaltung von Snowflake, anwendungsspezifische Konfigurationen oder eine beliebige Kombination der beiden verwenden. Das erforderliche Maß an Isolation hängt von Ihren Governance-Anforderungen ab, aber generell empfehlen wir die Verwendung separater Datenbanken für DEV und PROD, wobei die PROD-Datenbank durch RBAC-Richtlinien geschützt wird, die den Zugriff auf Administratoren und spezielle Dienstkonten beschränken.

CI/CD

Sie können die Validierung und Bereitstellung Ihrer Pipelines mit CI/CD-Pipelines wie Azure Pipelines und GitHub-Aktionen automatisieren. Im Allgemeinen empfehlen wir das Testen in einer DEV- oder STAGING-Umgebung, bevor die Bereitstellung in PROD erfolgt. Es empfiehlt sich, Ihr Quellkontroll-Repository mit Merge-Gateways zu konfigurieren, die Codeänderungen vor der Zusammenführung mit Ihrem Produktionszweig in DEV validieren. Änderungen am Produktionszweig können in PROD kontinuierlich (d. h. bei jeder Änderung) oder regelmäßig (täglich/wöchentlich) bereitgestellt werden. Es empfiehlt sich, eine abschließende Validierung des Status des Produktionszweigs in einer DEV- oder STAGING-Umgebung durchzuführen, bevor Änderungen in PROD bereitgestellt werden. Verwenden Sie Plattform-Features wie GitHub-Aktionsbereitstellungen und -Umgebungen zum Definieren und Konfigurieren von Verbindungen zu jeder Bereitstellungsumgebung. Konfigurieren Sie Ihre CI/CD-Pipeline, um Ihre Änderungen in die Bereitstellungsumgebung zu übertragen, einschließlich:

  • (Optional) Erstellen von Bibliotheken und Modulen als Python-Pakete und deren Verwendung in einem proprietären Paket-Feed

  • (Optional) Hochladen von Dateien in einen Snowflake-Stagingbereich

    Dies ist am häufigsten erforderlich, wenn Sie snowflake.ml.jobs.submit_from_stage() in Ihrer Pipeline verwenden

    Alternativ können Sie auch die Snowflake GitHub-Integration verwenden, um Ihr GitHub-Repository direkt als Snowflake-Stagingbereich zu verfolgen

  • Ausführung von dag.py um den Task-Graphen in der konfigurierten Umgebung bereitzustellen

  • (Optional) Auslösen und Überwachen der Ausführung des neu bereitgestellten Task-Graphen, um die Gültigkeit zu überprüfen

Zusätzliche Ressourcen