Connecteurs du framework Snowpark ML

Snowpark ML inclut la prise en charge de l’approvisionnement en données sécurisé et évolutif pour les frameworks PyTorch et Tensorflow, qui attendent tous deux des données dans leurs propres formats spécifiques. Pour simplifier ce workflow, la bibliothèque Snowpark ML fournit des méthodes pratiques construites au-dessus de l’API FileSet pour fournir des données à partir d’un FileSet sous forme de tenseurs PyTorch ou d’enregistrements TensorFlow. (Un FileSet 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.)

Note

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

Création d’un FileSet à partir d’une requête

Reportez-vous à Création et utilisation d’un FileSet pour obtenir des informations sur la création d’un FileSet à partir de données que vous souhaitez utiliser avec PyTorch ou TensorFlow. Passez ensuite à l’une des sections suivantes :

Alimenter un FileSet avec PyTorch

À partir d’un FileSet Snowflake, vous pouvez obtenir un DataPipe PyTorch, qui peut être transmis à un DataLoader PyTorch. Le DataLoader itère sur les données du FileSet et produit des tenseurs PyTorch en lots. Créez le DataPipe à l’aide de la méthode to_torch_datapipe du FileSet, puis transmettez le DataPipe au DataLoader de PyTorch :

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

Alimenter un FileSet avec TensorFlow

Vous pouvez obtenir un jeu de données TensorFlow à partir d’un FileSet Snowflake en utilisant la méthode to_tf_dataset du FileSet :

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

L’itération sur l’ensemble de données permet d’obtenir des tenseurs en lots.

Brassage de données dans des FileSets

Il est souvent utile de brasser des données d’entraînement pour éviter une adaptation excessive et d’autres problèmes. Pour une discussion sur la valeur du brassage, consultez Pourquoi les données doivent-elles être brassées pour les tâches de machine learning ?

Si votre requête ne brasse pas déjà suffisamment vos données, un FileSet peut mélanger les données en deux points :

  • Lorsque le FileSet est créé à l’aide de FileSet.make.

    Toutes les lignes de votre requête sont brassées avant d’être écrites sur le FileSet. Il s’agit d’un brassage global de haute qualité qui peut s’avérer coûteux pour les grands ensembles de données. Il n’est donc effectué qu’une seule fois, lors de la matérialisation du FileSet. Transmettez shuffle=True comme argument clé à FileSet.make.

  • Lorsque vous créez un DataPipe PyTorch ou un jeu de données TensorFlow à partir d’un FileSet.

    À ce stade, l’ordre des fichiers dans le FileSet est aléatoire, de même que l’ordre des lignes dans chaque fichier. On peut considérer qu’il s’agit d’un brassage global « approximatif ». Il est de moins bonne qualité qu’un véritable brassage global, mais il est beaucoup moins cher. Pour procéder à un brassage à ce stade, transmettez shuffle=True comme argument clé à la méthode to_torch_datapipe ou to_tf_dataset du FileSet.

Pour de meilleurs résultats, procédez deux fois au brassage : lors de la création du FileSet et lors de l’envoi des données à PyTorch ou TensorFlow.

Mise en lots des données dans des FileSets

Les FileSets disposent d’une fonction de mise en lots qui fonctionne de la même manière que la fonction de mise en lots dans PyTorch et TensorFlow, mais qui est plus efficace. Snowflake vous recommande d’utiliser le paramètre batch_size dans les méthodes to_torch_datapipe et to_tf_dataset du FileSet au lieu de demander à PyTorch ou TensorFlow de procéder à la mise en lots. Avec PyTorch, pour désactiver sa fonctionnalité de mise en lots, vous devez explicitement transmettre batch_size=None lors de l’instanciation du DataLoader.

Vous pouvez également supprimer le dernier lot s’il est incomplet en transmettant drop_last_batch=True à to_torch_datapipe ou à to_tf_dataset.