Snowflake Datasets

Datensätze sind neue Snowflake Objekte auf Schema-Ebene, die speziell für Workflows des maschinellen Lernens entwickelt wurden. Snowflake-Datensätze enthalten Sammlungen von Daten, die in Versionen organisiert sind. Jede Version enthält einen materialisierten Snapshot Ihrer Daten mit garantierter Unveränderlichkeit, effizientem Datenzugriff und Interoperabilität mit gängigen Deep Learning-Frameworks.

Verwenden Sie Snowflake Datasets in den folgenden Situationen:

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

  • 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.

  • Sie müssen die Abstammung verfolgen, die zur Erstellung eines ML-Modells verwendet wurde.

Datasets sind materialisierte Datenobjekte. Sie können entweder die Befehle Snowflake ML oder SQL verwenden, um mit ihnen zu interagieren. Sie erscheinen nicht im Objekt-Explorer der Snowsight-Datenbank.

Bemerkung

Installation

Das Dataset Python SDK ist in Snowpark ML (Python-Paket snowflake-ml-python) ab Version 1.7.5 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> … TO ROLE.

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

Sie können Datasets entweder mit SQL oder mit Python erstellen und verwalten. Informationen zur Verwendung der Befehle SQL finden Sie unter SQL-Befehle. Informationen zur Verwendung von Python API finden Sie unter snowflake.ml.dataset.

Erstellen Sie einen Datensatz, indem Sie einen Snowpark DataFrame an die Funktion snowflake.ml.dataset.create_from_dataframe übergeben.

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

Verwenden Sie SQL, um aus einer Datensatzversion zu lesen

Sie können die Standardbefehle von Snowflake SQL verwenden, um Daten aus einer Dataset-Version zu lesen. Mit den SQL-Befehlen können Sie die folgenden Operationen durchführen:

  • Dateien auflisten

  • Schema ableiten

  • Abfrage von Daten direkt aus dem Stagingbereich.

Wichtig

Sie müssen über die Berechtigung USAGE oder OWNERSHIP für den Datensatz verfügen, um ihn zu lesen.

Dateien aus einer Dataset-Version auflisten

Verwenden Sie den Befehl LIST snow_url, um die Dateien einer Dataset-Version aufzulisten. Verwenden Sie die folgende SQL-Syntax, um alle Dateien innerhalb einer Dataset-Version aufzulisten:

LIST 'snow://dataset/<dataset_name>/versions/<dataset_version>'
Copy

Analysieren von Dateien und Abrufen von Spaltendefinitionen

Verwenden Sie die Funktion INFER_SCHEMA, um Dateien in einer Dataset-Version zu analysieren und Spaltendefinitionen abzurufen. Verwenden Sie das folgende SQL-Beispiel, um alle Dateien innerhalb einer Dataset-Version aufzulisten:

INFER_SCHEMA(
  LOCATION => 'snow://dataset/<dataset_name>/versions/<dataset_version>',
  FILE_FORMAT => '<file_format_name>'
)
Copy

Sie müssen das im Beispiel angegebene Muster verwenden, um den Speicherort der Datensatzversion zu ermitteln.

Für FILE_FORMAT geben Sie PARQUET an.

Das folgende Beispiel erstellt ein Dateiformat und führt die Funktion INFER_SCHEMA aus:

CREATE FILE FORMAT my_parquet_format TYPE = PARQUET;

SELECT *
FROM TABLE(
    INFER_SCHEMA(
        FILE_FORMAT => 'snow://dataset/MYDS/versions/v1,
        FILE_FORMAT => 'my_parquet_format'
    )
);
Copy

Abfrage des Stagingbereichs

Abfrage von Daten direkt aus den in einer Dataset-Version gespeicherten Dateien, ähnlich wie bei der Abfrage einer externen Tabelle. Verwenden Sie das folgende SQL-Beispiel, um Ihnen den Einstieg zu erleichtern:

SELECT $1
FROM 'snow://dataset/foo/versions/V1'
( FILE_FORMAT => 'my_parquet_format',
PATTERN => '.*data.*' ) t;
Copy

SQL-Befehle

Sie können die SQL-Befehle verwenden, um Datensätze zu erstellen und zu verwalten. Weitere Informationen dazu finden Sie unter:

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.