FileSystem et FileSet Snowpark ML

La bibliothèque ML de Snowpark comprend FileSystem, une abstraction similaire à un système de fichiers pour une zone de préparation interne et chiffrée de Snowflake côté serveur. Plus précisément, il s’agit d’une implémentation de fsspec AbstractFileSystem. La bibliothèque comprend également FileSet, une classe connexe qui vous permet de déplacer des données de machine learning d’une table Snowflake vers la zone de préparation, et de là, d’alimenter les données vers PyTorch ou TensorFlow (voir Connecteurs du framework Snowpark ML).

Astuce

Consultez la référence d” API Snowpark ML pour plus de détails sur ces APIs.

Note

Cette rubrique suppose que le module Snowpark ML est déjà installé. Si ce n’est pas le cas, consultez Installation de Snowpark ML.

Création et utilisation d’un système de fichiers

La création d’un système de fichiers Snowpark ML nécessite soit un objet Connection Connecteur Snowflake pour Python soit une Session Snowpark Python. Pour obtenir des instructions, voir Authentification à Snowflake.

Après avoir établi une connexion ou une session, vous pouvez créer une instance de Snowpark ML SFFileSystem à travers laquelle vous pouvez accéder aux données de votre zone de préparation interne.

Si vous disposez d’une connexion Connecteur Snowflake pour Python, transmettez-la en tant qu’argument sf_connection :

import fsspec
from snowflake.ml.fileset import sfcfs

sf_fs1 = sfcfs.SFFileSystem(sf_connection=sf_connection)
Copy

Si vous avez une session Snowpark Python, transmettez-la en tant qu’argument snowpark_session :

import fsspec
from snowflake.ml.fileset import sfcfs

sf_fs2 = sfcfs.SFFileSystem(snowpark_session=sp_session)
Copy

SFFileSystem hérite de nombreuses fonctions de fsspec.FileSystem, telles que la mise en cache locale des fichiers. Vous pouvez activer cette fonction ainsi que d’autres en instanciant un système de fichiers Snowflake par le biais de la fonction d’usine fsspec.filesystem, en transmettant target_protocol="sfc" pour utiliser l’implémentation FileSystem de Snowflake :

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

Le système de fichiers Snowflake prend en charge la plupart des méthodes de lecture seule définies pour un fsspec FileSystem, y compris find, info, isdir, isfile, et exists.

Spécification de fichiers

Pour spécifier des fichiers dans une zone de préparation, utilisez un chemin de la forme @database.schema.stage/file_path.

Fichiers d’annonce

La méthode ls du système de fichiers est utilisée pour obtenir la liste des fichiers de la zone de préparation :

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

Ouverture et lecture de fichiers

Vous pouvez ouvrir des fichiers dans la zone de préparation en utilisant la méthode open du système de fichiers. Vous pouvez ensuite lire les fichiers en utilisant les mêmes méthodes que celles utilisées pour les fichiers Python ordinaires. L’objet fichier est également un gestionnaire de contexte qui peut être utilisé avec l’instruction with Python, de sorte qu’il est automatiquement fermé lorsqu’il n’est plus nécessaire.

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

Vous pouvez également utiliser l’instance SFFileSystem avec d’autres composants qui acceptent les systèmes de fichiers fsspec. Ici, le fichier de données Parquet mentionné dans le bloc de code précédent est transmis à la méthode read_table PyArrow :

import pyarrow.parquet as pq

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

Les composants Python qui acceptent des fichiers (ou des objets de type fichier) peuvent être transmis à un objet fichier ouvert à partir du système de fichiers Snowflake. Par exemple, si vous avez un fichier compressé en gzip dans votre zone de préparation, vous pouvez l’utiliser avec le module gzip Python en le transmettant à gzip.GzipFile en tant que paramètre fileobj :

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

Création et utilisation d’un FileSet

Un FileSet Snowflake représente un instantané immuable du résultat d’une requête SQL sous forme de fichiers dans une zone de préparation interne chiffrée côté serveur. Ces fichiers sont accessibles via un FileSystem pour alimenter en données des outils tels que PyTorch et TensorFlow afin que vous puissiez former des modèles à l’échelle et dans le cadre de votre modèle de gouvernance des données existant. Pour créer un FileSet, utilisez la méthode FileSet.make.

Vous avez besoin d’une connexion Python Snowflake ou d’une session Snowpark pour créer un FileSet. Pour obtenir des instructions, voir Authentification à Snowflake. Vous devez également indiquer le chemin à une zone de préparation interne chiffrée côté serveur existante, ou à un sous-répertoire d’une telle zone de préparation, où sera stocké le FileSet.

Pour créer un FileSet à partir d’un DataFrame Snowpark, construisez un DataFrame et transmettez-le à FileSet.make en tant que snowpark_dataframe ; n’appelez pas la méthode collect du DataFrame :

# 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

Pour créer un FileSet à l’aide d’une connexion Connecteur Snowflake pour Python, transmettez la connexion à Fileset.make en tant que sf_connection, et transmettez la requête SQL en tant que 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

Note

Consultez Brassage de données dans des FileSets pour obtenir des informations sur le brassage de vos données à l’aide du paramètre shuffle.

Utilisez la méthode files pour obtenir la liste des fichiers contenus dans le FileSet :

print(*fileset_df.files())
Copy

Pour obtenir des informations sur l’envoi des données contenues dans le FileSet à PyTorch ou TensorFlow, consultez Connecteurs du framework Snowpark ML.