FileSystem et FileSet Snowpark ML¶
Note
Snowpark ML 1.5.0 introduit Ensemble de données, un instantané immuable et versionné conçu pour être utilisé dans les applications de machine learning. Pour la plupart des cas d’utilisation, il est supérieur à l’API FileSet décrite dans cette rubrique. L’API FileSet est toujours prise en charge à l’heure actuelle, bien qu’il s’agisse d’une fonctionnalité disponible en avant-première et qu’elle ne soit pas généralement disponible.
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
La plupart des utilisateurs devraient utiliser la nouvelle API d’ensemble de données, plus récent, pour créer des instantanés de données immuables et gouvernés dans Snowflake et les utiliser dans des workflows de machine learning de bout en bout.
Installation¶
Les APIs FileSystem et FileSet font partie du paquet Python ML de Snowpark, snowflake-ml-python
. Voir Utilisation de Snowflake ML en local pour obtenir des instructions d’installation.
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 Connexion à 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)
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)
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)
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')
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))
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])
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())
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 Connexion à 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,
)
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
)
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())
Pour obtenir des informations sur l’envoi des données contenues dans le FileSet à PyTorch ou TensorFlow, consultez Connecteurs du framework Snowpark ML.