Snowpark ML-Klassen FileSystem und FileSet

Die Snowpark ML-Bibliothek enthält FileSystem, eine Abstraktion, die einem Dateisystem für einen internen, serverseitig verschlüsselten Snowflake-Stagingbereich ähnelt. Genauer gesagt, handelt es sich um eine fsspec AbstractFileSystem-Implementierung. Die Bibliothek enthält auch die verwandte Klasse FileSet, mit der Sie die Daten des maschinellen Lernens aus einer Snowflake-Tabelle in den Stagingbereich verschieben und von dort PyTorch oder TensorFlow zuführen können (siehe Snowpark ML-Framework-Konnektoren).

Tipp

Alle Informationen zu diesen APIs finden Sie in der API-Referenz für Snowpark ML.

Bemerkung

Bei diesem Thema wird vorausgesetzt, dass Sie das Snowpark ML-Modul bereits installiert haben. Wenn dies nicht der Fall ist, finden Sie weitere Informationen unter Installieren von Snowpark ML.

Erstellen und Verwenden eines Dateisystems

Das Erstellen eines Snowpark ML-Dateisystems erfordert entweder ein Snowflake-Konnektor für Python-Connection-Objekt oder ein Snowpark Python-Session-Objekt. Eine Anleitung dazu finden Sie unter Authentifizierung mit Snowflake.

Nachdem Sie entweder eine Verbindung oder eine Sitzung eingerichtet haben, können Sie eine Snowpark ML-SFFileSystem-Instanz erstellen, über die Sie auf Daten in Ihrem internen Stagingbereich zugreifen können.

Wenn Sie eine Verbindung zum Snowflake-Konnektor für Python haben, übergeben Sie diese als sf_connection-Argument:

import fsspec
from snowflake.ml.fileset import sfcfs

sf_fs1 = sfcfs.SFFileSystem(sf_connection=sf_connection)
Copy

Wenn Sie eine Snowpark Python-Sitzung haben, übergeben Sie diese als snowpark_session-Argument:

import fsspec
from snowflake.ml.fileset import sfcfs

sf_fs2 = sfcfs.SFFileSystem(snowpark_session=sp_session)
Copy

SFFileSystem erbt viele Features von fsspec.FileSystem, wie z. B. das lokale Caching von Dateien. Sie können dieses und andere Features aktivieren, indem Sie ein Snowflake-Dateisystem über die fsspec.filesystem factory-Funktion instanziieren und target_protocol="sfc" übergeben, um die Snowflake-FileSystem-Implementierung zu verwenden:

local_cache_path = "/tmp/sf_files/"
cached_fs = fsspec.filesystem("cached", target_protocol="sfc",
                    target_options={"sf_connection": sf_connection,
                                    "cache_types": "bytes",
                                    "block_size": 32 * 2**20},
                    cache_storage=local_cache_path)
Copy

Das Snowflake-Dateisystem unterstützt die meisten Nur-Lese-Methoden, die für ein fsspec-FileSystem definiert sind, einschließlich find, info, isdir, isfile und exists.

Spezifizieren der Dateien

Um die im Stagingbereich befindlichen Dateien anzugeben, verwenden Sie einen Pfad im Format @database.schema.stage/file_path.

Auflisten der Dateien

Die Methode ls des Dateisystems wird verwendet, um eine Liste der Dateien im Stagingbereich zu erhalten:

print(*cached_fs.ls("@ML_DATASETS.public.my_models/sales_predict/"), end='\n')
Copy

Öffnen und Lesen von Dateien

Sie können Dateien im Stagingbereich öffnen, indem Sie die Methode open des Dateisystems verwenden. Sie können die Dateien dann mit denselben Methoden lesen, die Sie auch für normale Python-Dateien verwenden. Das Dateiobjekt ist auch ein Kontextmanager, der mit der Python-Anweisung with verwendet werden kann, sodass es automatisch geschlossen wird, wenn es nicht mehr benötigt wird.

path = '@ML_DATASETS.public.my_models/test/data_7_7_3.snappy.parquet'

with sf_fs1.open(path, mode='rb') as f:
    print(f.read(16))
Copy

Sie können die SFFileSystem-Instanz auch mit anderen Komponenten verwenden, die fsspec-Dateisysteme akzeptieren. Hier wird die im vorherigen Codeblock erwähnte Parquet-Datendatei an die PyArrow-Methode read_table übergeben:

import pyarrow.parquet as pq

table = pq.read_table(path, filesystem=sf_fs1)
table.take([1, 3])
Copy

Python-Komponenten, die Dateien (oder dateiähnliche Objekte) akzeptieren, können an ein vom Snowflake-Dateisystem geöffnetes Dateiobjekte übergeben werden. Wenn Sie in Ihrem Stagingbereich zum Beispiel eine gzip-komprimierte Datei haben, können Sie diese mit dem Python-Modul gzip verwenden, indem Sie die Datei als fileobj-Parameter an gzip.GzipFile übergeben:

path = "sfc://@ML_DATASETS.public.my_models/dataset.csv.gz"

with cached_fs.open(path, mode='rb', sf_connection=sf_connection) as f:
    g = gzip.GzipFile(fileobj=f)
    for i in range(3):
        print(g.readline())
Copy

Erstellen und Verwenden eines FileSet

Ein Snowflake-FileSet ein unveränderlicher Snapshot eines SQL-Abfrageergebnisses in Form von Dateien in einem internen, serverseitigen verschlüsselten Stagingbereich. Auf diese Dateien kann über ein FileSystem zugegriffen werden, um die Daten Tools wie PyTorch und TensorFlow zuzuführen, sodass Sie Modelle in großem Umfang und innerhalb Ihres bestehenden Data Governance-Modells trainieren können. Um ein FileSet zu erstellen, verwenden Sie die Methode FileSet.make.

Zum Erstellen eines FileSet benötigen Sie eine Snowflake-Python-Verbindung oder eine Snowpark-Sitzung. Eine Anleitung dazu finden Sie unter Authentifizierung mit Snowflake. Sie müssen auch den Pfad zu einem bestehenden internen, serverseitig verschlüsselten Stagingbereich oder zu einem Unterverzeichnis in einem solchen Stagingbereich angeben, in dem das FileSet gespeichert wird.

Um ein FileSet aus einem Snowpark-DataFrame zu erstellen, müssen Sie einen DataFrame erstellen und diesen an FileSet.make als snowpark_dataframe übergeben. Rufen Sie nicht die DataFrame-Methode collect auf:

# Snowpark Python equivalent of "SELECT * FROM MYDATA LIMIT 5000000"
df = snowpark_session.table('mydata').limit(5000000)
fileset_df = fileset.FileSet.make(
    target_stage_loc="@ML_DATASETS.public.my_models/",
    name="from_dataframe",
    snowpark_dataframe=df,
    shuffle=True,
)
Copy

Um ein FileSet mit einer Verbindung über den Snowflake-Konnektor für Python zu erstellen, übergeben Sie die Verbindung an Fileset.make als sf_connection und die SQL-Abfrage als query:

fileset_sf = fileset.FileSet.make(
    target_stage_loc="@ML_DATASETS.public.my_models/",
    name="from_connector",
    sf_connection=sf_connection,
    query="SELECT * FROM MYDATA LIMIT 5000000",
    shuffle=True,           # see later section about shuffling
)
Copy

Bemerkung

Unter Umverteilen von Daten in FileSets finden Sie Informationen für das zufällige Anordnen Ihrer Daten mithilfe des Parameters shuffle.

Verwenden Sie die Methode files, um eine Liste der im FileSet enthaltenen Dateien zu erhalten:

print(*fileset_df.files())
Copy

Informationen zur Zuführung der FileSet-Daten zu PyTorch oder TensorFlow finden Sie unter Snowpark ML-Framework-Konnektoren.