Snowflake Datasets

Datasets sind neue Snowflake-Objekte auf Schemaebene, die speziell für Workflows des maschinellen Lernens entwickelt wurden. Snowflake Datasets enthalten Datensammlungen, die in Versionen organisiert sind, wobei jede Version einen materialisierten Snapshot Ihrer Daten mit garantierter Unveränderlichkeit, effizientem Datenzugriff und Interoperabilität mit gängigen Deep Learning-Frameworks enthält.

Bemerkung

Obwohl Datasets SQL-Objekte sind, sind sie ausschließlich für die Verwendung mit Snowpark-ML bestimmt. Sie erscheinen nicht im Objekt-Explorer der Snowsight-Datenbank, und Sie können keine SQL-Befehle verwenden, um mit ihnen zu arbeiten.

In diesen Situationen sollten Sie Snowflake Datasets verwenden:

  • Sie müssen große Datensets verwalten und versionieren, um Machine-Learning-Modelle reproduzierbar zu trainieren und zu testen.

  • Sie möchten die skalierbare und sichere Datenspeicherung und -verarbeitung von Snowflake nutzen.

  • Sie benötigen einen fein abgestuften Zugriff auf Dateiebene und/oder ein Neuanordnen (Shuffling) der Daten für verteiltes Training oder Daten-Streaming.

  • Sie müssen in externe Frameworks und Tools für maschinelles Lernen integriert werden.

Bemerkung

Materialisierte Datensets verursachen Speicherkosten. Um diese Kosten zu minimieren, löschen Sie ungenutzte Datensets.

Installation

Das Dataset Python SDK ist in Snowpark ML (Python-Paket snowflake-ml-python) ab Version 1.5.0 enthalten. Eine Installationsanleitung finden Sie unter Lokale Verwendung von Snowflake ML.

Erforderliche Berechtigungen

Zum Erstellen von Datensets ist die Berechtigung CREATE DATASET auf Schemaebene erforderlich. Zum Bearbeiten von Datensätzen, z. B. zum Hinzufügen oder Löschen von Datenset-Versionen, ist die Berechtigung OWNERSHIP für das Datenset erforderlich. Zum Lesen eines Datensets benötigen Sie nur die Berechtigung USAGE für das Datenset (oder OWNERSHIP). Weitere Informationen über die Erteilung von Berechtigungen in Snowflake finden Sie unter GRANT <Berechtigungen>.

Tipp

Beim Einrichten der Berechtigungen für den Snowflake Feature Store mit der Methode setup_feature_store oder dem SQL-Setup-Skript für Berechtigungen richtet auch Dataset-Berechtigungen ein. Wenn Sie die Berechtigungen für den Feature Store bereits mit einer dieser Methoden eingerichtet haben, sind keine weiteren Schritte erforderlich.

Erstellen und Verwenden von Datasets

Datasets werden erstellt, indem ein Snowpark-DataFrame an die Funktion snowflake.ml.dataset.create_from_dataframe übergeben wird.

from snowflake import snowpark
from snowflake.ml import dataset

# Create Snowpark Session
# See https://docs.snowflake.com/en/developer-guide/snowpark/python/creating-session
session = snowpark.Session.builder.configs(connection_parameters).create()

# Create a Snowpark DataFrame to serve as a data source
# In this example, we generate a random table with 100 rows and 1 column
df = session.sql(
    "select uniform(0, 10, random(1)) as x, uniform(0, 10, random(2)) as y from table(generator(rowcount => 100))"
)

# Materialize DataFrame contents into a Dataset
ds1 = dataset.create_from_dataframe(
    session,
    "my_dataset",
    "version1",
    input_dataframe=df)
Copy

Datensets sind versioniert. Jede Version ist ein unveränderlicher, zeitpunktbezogener Snapshot der vom Dataset verwalteten Daten. Die Python-API enthält die Eigenschaft Dataset.selected_version, die angibt, ob ein bestimmtes Datenset zur Verwendung ausgewählt ist. Diese Eigenschaft wird automatisch von den Factory-Methoden dataset.create_from_dataframe und dataset.load_dataset gesetzt, sodass beim Erstellen eines Datensets automatisch die erstellte Version ausgewählt wird. Die Methoden Dataset.select_version und Dataset.create_version können auch verwendet werden, um explizit zwischen Versionen zu wechseln. Das Lesen aus einem Datenset erfolgt aus der aktiven ausgewählten Version.

# Inspect currently selected version
print(ds1.selected_version) # DatasetVersion(dataset='my_dataset', version='version1')
print(ds1.selected_version.created_on) # Prints creation timestamp

# List all versions in the Dataset
print(ds1.list_versions()) # ["version1"]

# Create a new version
ds2 = ds1.create_version("version2", df)
print(ds1.selected_version.name)  # "version1"
print(ds2.selected_version.name)  # "version2"
print(ds1.list_versions())        # ["version1", "version2"]

# selected_version is immutable, meaning switching versions with
# ds1.select_version() returns a new Dataset object without
# affecting ds1.selected_version
ds3 = ds1.select_version("version2")
print(ds1.selected_version.name)  # "version1"
print(ds3.selected_version.name)  # "version2"
Copy

Lesen von Daten aus Datenset

Die Daten der Dataset-Version werden als gleichmäßig große Dateien im Apache Parquet-Format gespeichert. Die Klasse Dataset bietet eine API ähnlich der von FileSet zum Lesen von Daten aus Snowflake Datasets, einschließlich integrierter Konnektoren für TensorFlow und PyTorch. Die API ist erweiterbar, um kundenspezifische Framework-Konnektoren zu unterstützen.

Das Lesen aus einem Datenset erfordert eine aktive ausgewählte Version.

Verbinden mit TensorFlow

Datensets können in ein TensorFlow-spezifisches tf.data.Dataset konvertiert und in Batches gestreamt werden, um effizient zu trainieren und zu evaluieren.

import tensorflow as tf

# Convert Snowflake Dataset to TensorFlow Dataset
tf_dataset = ds1.read.to_tf_dataset(batch_size=32)

# Train a TensorFlow model
for batch in tf_dataset:
    # Extract and build tensors as needed
    input_tensor = tf.stack(list(batch.values()), axis=-1)

    # Forward pass (details not included for brevity)
    outputs = model(input_tensor)
Copy

Verbinden mit PyTorch

Datasets unterstützen auch die Konvertierung in PyTorch-spezifische DataPipes und können für effizientes Training und Evaluation in Batches gestreamt werden.

import torch

# Convert Snowflake Dataset to PyTorch DataPipe
pt_datapipe = ds1.read.to_torch_datapipe(batch_size=32)

# Train a PyTorch model
for batch in pt_datapipe:
    # Extract and build tensors as needed
    input_tensor = torch.stack([torch.from_numpy(v) for v in batch.values()], dim=-1)

    # Forward pass (details not included for brevity)
    outputs = model(input_tensor)
Copy

Verbinden mit Snowpark ML

Datasets können auch wieder zurück in Snowpark-DataFrames konvertiert werden, um sie in Snowpark ML Modeling zu integrieren. Die konvertierte Snowpark-DataFrame ist nicht dieselbe wie der DataFrame, der bei der Erstellung des Datasets angegeben wurde, sondern verweist auf die materialisierten Daten in der Dataset-Version.

from snowflake.ml.modeling.ensemble import random_forest_regressor

# Get a Snowpark DataFrame
ds_df = ds1.read.to_snowpark_dataframe()

# Note ds_df != df
ds_df.explain()
df.explain()

# Train a model in Snowpark ML
xgboost_model = random_forest_regressor.RandomForestRegressor(
    n_estimators=100,
    random_state=42,
    input_cols=["X"],
    label_cols=["Y"],
)
xgboost_model.fit(ds_df)
Copy

Direkter Dateizugriff

Die Dataset-API stellt auch eine fsspec-Schnittstelle zur Verfügung, die für das Erstellen kundenspezifischer Integrationen mit externen Bibliotheken wie PyArrow, Dask oder anderen Paketen, die fsspec unterstützen und verteiltes und/oder Stream-basiertes Modelltraining ermöglichen, verwendet werden kann.

print(ds1.read.files()) # ['snow://dataset/my_dataset/versions/version1/data_0_0_0.snappy.parquet']

import pyarrow.parquet as pq
pd_ds = pq.ParquetDataset(ds1.read.files(), filesystem=ds1.read.filesystem())

import dask.dataframe as dd
dd_df = dd.read_parquet(ds1.read.files(), filesystem=ds1.read.filesystem())
Copy

Aktuelle Beschränkungen und bekannte Probleme

  • Dataset-Namen sind SQL-Bezeichner und unterliegen den Snowflake-Anforderungen an Bezeichner.

  • Dataset-Versionen sind String-Werte mit einer maximale Länge von 128 Zeichen. Einige Zeichen sind nicht zulässig und führen zu einer Fehlermeldung.

  • Bestimmte Abfrageoperationen auf Datasets mit umfangreichen Schemas (mehr als etwa 4.000 Spalten) sind nicht vollständig optimiert. Dies wird sich in kommenden Releases verbessern.