Snowpark ML-Framework-Konnektoren

Snowpark ML bietet Unterstützung für die sichere, skalierbare Datenbereitstellung für die Frameworks PyTorch und Tensorflow, die Daten in ihren jeweils eigenen Formaten erwarten. Um diesen Workflow zu vereinfachen, bietet die Snowpark ML-Bibliothek praktische Methoden, die auf der FileSet-API aufsetzen, um Daten von FileSet als PyTorch-Tensoren oder TensorFlow-Datensätze bereitzustellen. (Ein FileSet ist ein unveränderlicher Snapshot eines SQL-Abfrageergebnisses in Form von Dateien in einem internen, serverseitigen verschlüsselten Stagingbereich.)

Bemerkung

Dieses Thema setzt voraus, dass das Snowpark ML-Modul installiert ist. Wenn dies nicht der Fall ist, finden Sie weitere Informationen unter Installieren von Snowpark ML.

Erstellen eines FileSet aus einer Abfrage

Unter Erstellen und Verwenden eines FileSet finden Sie Informationen zum Erstellen eines FileSet aus den Daten, die Sie mit PyTorch oder TensorFlow verwenden möchten. Fahren Sie dann mit einem der folgenden Abschnitte fort:

Zuführen der Daten eines FileSet zu PyTorch

Von einem Snowflake-FileSet erhalten Sie eine PyTorch-DataPipe, die an einen PyTorch-DataLoader übergegeben werden kann. Der DataLoader iteriert über die FileSet-Daten und liefert PyTorch-Tensoren in Batches. Erstellen Sie die DataPipe mit der FileSet-Methode to_torch_datapipe, und übergeben Sie dann DataPipe an den PyTorch-DataLoader:

from torch.utils.data import DataLoader

# See later sections about shuffling and batching
pipe = fileset_df.to_torch_datapipe(
    batch_size=4,
    shuffle=True,
    drop_last_batch=True)

for batch in DataLoader(pipe, batch_size=None, num_workers=0):
    print(batch)
    break
Copy

Zuführen der Daten eines FileSet zu TensorFlow

Sie erhalten ein TensorFlow-Dataset von einem Snowflake-FileSet, indem Sie die FileSet-Methode to_tf_dataset verwenden:

import tensorflow as tf

# See following sections about shuffling and batching
ds = fileset_df.to_tf_dataset(
    batch_size=4,
    shuffle=True,
    drop_last_batch=True)

for batch in ds:
    print(batch)
    break
Copy

Durch Iterieren über dem Dataset erhalten Sie Tensoren in Batches.

Umverteilen von Daten in FileSets

Es ist oft sinnvoll, die Trainingsdaten zufällig neu anzuordnen (Shuffling), um eine Überanpassung und andere Probleme zu vermeiden. Eine Diskussion über den Wert des Shufflings finden Sie unter Warum sollten Daten für maschinelles Lernen neu angeordnet werden? (auf Englisch)

Wenn die Daten nicht bereits durch Ihre Abfrage ausreichend umverteilt wurden, kann ein FileSet die Daten an zwei Punkten umverteilen:

  • Wenn das FileSet mit FileSet.make erstellt wird.

    Alle Zeilen in Ihrer Abfrage werden umverteilt, bevor sie in das FileSet geschrieben werden. Dies ist eine hochwertige globale Durchmischung, die bei großen Datensets teuer werden kann. Daher wird sie nur einmal ausgeführt, nämlich beim Materialisieren des FileSet. Übergeben Sie shuffle=True als Schlüsselwortargument an FileSet.make.

  • Wenn Sie aus einem FileSet eine PyTorch-DataPipe oder ein TensorFlow-Dataset erstellen.

    Zu diesem Zeitpunkt ist die Reihenfolge der Dateien im FileSet zufällig, ebenso wie die Reihenfolge der Zeilen in jeder Datei. Dies kann als eine „annährend“ globale Umverteilung betrachtet werden. Sie ist von geringerer Qualität als eine echte globale Umverteilung, aber sie ist deutlich preiswerter. Um das Shuffling an dieser Stelle auszuführen, übergeben Sie shuffle=True als Schlüsselwortargument an die FileSet-Methode to_torch_datapipe oder to_tf_dataset.

Die besten Ergebnisse erzielen Sie, wenn Sie das Shuffling zweimal ausführen: beim Erstellen des FileSet und beim Zuführen der Daten zu PyTorch bzw. TensorFlow.

Batchverarbeitung von Daten in FileSets

FileSets verfügen über ein Feature zur Batchverarbeitung, das genauso funktioniert wie die Batchverarbeitungsfunktionalität in PyTorch und TensorFlow, nur dass sie effizienter ist. Snowflake empfiehlt Ihnen, den Parameter batch_size in den FileSet-Methoden to_torch_datapipe und to_tf_dataset zu verwenden, anstatt die Batchverarbeitung von PyTorch oder TensorFlow ausführen zu lassen. Um die Batchverarbeitungsfunktionalität von PyTorch zu deaktivieren, müssen Sie bei der Instanziierung von DataLoader explizit batch_size=None übergeben.

Sie können den letzten Batch auch löschen, wenn dieser unvollständig ist, indem Sie drop_last_batch=True an to_torch_datapipe oder to_tf_dataset übergeben.