Quel est l'avantage de diviser le fichier tfrecord en fragments?

17

Je travaille sur la reconnaissance vocale avec Tensorflow et je prévois de former LSTM NN avec un ensemble de données d'ondes massives. En raison des gains de performances, je prévois d'utiliser des tfrecords. Il existe plusieurs exemples sur Internet (Inception par exemple) où les fichiers tfrecords sont divisés en fragments. Ma question est: quel est l'avantage d'avoir le fichier tfrecords en fragments? Y a-t-il un gain de performances supplémentaire de cette division?

striki70
la source

Réponses:

11

En recherchant les avantages de la division en plusieurs fichiers, la seule réponse raisonnable est venue de l'un des utilisateurs de Google.

Ils ont déclaré que les gains de performances étaient négligeables, mais je suis d'accord que le fractionnement des fichiers peut être utile, surtout si vous souhaitez transférer l'ensemble de données vers un autre emplacement.

Gardez à l'esprit que vous n'avez plus besoin de mélanger avant d'enregistrer, car la méthode recommandée (actuellement) pour lire TFRecords utilise tf.data.TFRecordDatasetune .shuffle()méthode très utile .

Bartgras
la source
2
.shuffle()n'est pas une solution idéale si vous avez un gros fichier tfrecord. La sortie mélangée est quelque peu liée à l'ordre d'origine si vous n'utilisez pas une grande taille de tampon. Je pense que pré-mélanger les données avant de les enregistrer sur tfrecord ou de les diviser en fragments est nécessaire lorsque vous avez un grand ensemble de données.
Bruce Chou
7

Pour ceux qui se demandent encore: c'est pour que vous puissiez mélanger vos données. Avec vos TFrecords dans un seul fichier, vous ne pouvez pas mélanger la commande. Cela est généralement nécessaire avec SGD.

Cependant, avec les fragments, vous pouvez mélanger l'ordre des fragments, ce qui vous permet d'approximer le mélange des données comme si vous aviez accès aux enregistrements TFR individuels. C'est clairement mieux que rien, et clairement plus vous avez d'éclats, meilleure est cette approximation.

L'alternative consiste à pré-mélanger vos données en les dupliquant ou à ne pas utiliser du tout TFRecords.

miguel.martin
la source
4

La division des fichiers TFRecord en fragments vous aide à mélanger de grands ensembles de données qui ne tiennent pas en mémoire.

Imaginez que vous avez des millions d'exemples de formation enregistrés sur le disque et que vous souhaitez les exécuter à plusieurs reprises tout au long d'un processus de formation. De plus, supposons que pour chaque répétition des données d'entraînement (c'est-à-dire à chaque époque) vous souhaitez charger les données dans un ordre complètement aléatoire.

Une approche consiste à avoir un fichier par exemple de formation et à générer une liste de tous les noms de fichiers. Ensuite, au début de chaque époque, vous mélangez la liste des noms de fichiers et chargez les fichiers individuels. Le problème avec cette approche est que vous chargez des millions de fichiers à partir d'emplacements aléatoires sur votre disque. Cela peut être lent, en particulier sur un disque dur. Même une matrice RAID 0 n'aidera pas à la vitesse si vous chargez des millions de petits fichiers à partir d'emplacements aléatoires. Le problème s'aggrave encore si vous accédez aux fichiers via une connexion réseau.

Une autre approche consiste à lire les exemples d'apprentissage en séquence à partir d'un grand fichier TFRecord et à mélanger les exemples en mémoire à l'aide d'un tampon de lecture aléatoire. Cependant, le tampon de lecture aléatoire ne peut généralement pas être plus grand que la mémoire DDR disponible pour votre CPU. Et si le tampon de lecture aléatoire est considérablement plus petit que votre ensemble de données, il peut ne pas mélanger correctement les données. Les données peuvent être mélangées "localement" mais pas "globalement". Autrement dit, les exemples du début de l'ensemble de données peuvent ne pas être mélangés avec des exemples de la fin de l'ensemble de données.

Une bonne solution consiste à utiliser une combinaison équilibrée des deux approches ci-dessus en divisant votre ensemble de données en plusieurs fichiers TFRecord (appelés fragments). Pendant chaque époque, vous pouvez mélanger les noms de fichiers des fragments pour obtenir un brassage global et utiliser un tampon de shuffle pour obtenir un brassage local. Un bon équilibre rendra les fragments suffisamment grands pour éviter les problèmes de vitesse du disque mais gardera les fragments suffisamment petits pour permettre un brassage adéquat par un tampon de shuffle.

Voici les étapes exactes:

  1. Placez au hasard tous les exemples de formation dans plusieurs fichiers TFRecord (fragments).
  2. Au début de chaque époque, mélangez la liste des noms de fichiers des fragments.
  3. Lisez les exemples de formation des fragments et passez les exemples à travers un tampon de lecture aléatoire. En règle générale, le tampon de lecture aléatoire doit être plus grand que la taille du fragment pour garantir un bon mélange entre les fragments.
  4. Passez les exemples mélangés dans votre processus de formation.
Benjamin Coffer
la source
3

La division d'un fichier TFRecords en plusieurs fragments présente essentiellement 3 avantages:

  1. Plus facile à mélanger . Comme d'autres l'ont souligné, il est facile de mélanger les données à un niveau grossier (avant d'utiliser un tampon de lecture aléatoire).
  2. Téléchargement plus rapide . Si les fichiers sont répartis sur plusieurs serveurs, le téléchargement simultané de plusieurs fichiers à partir de différents serveurs optimisera l'utilisation de la bande passante (plutôt que le téléchargement d'un fichier à partir d'un seul serveur). Cela peut améliorer considérablement les performances par rapport au téléchargement des données à partir d'un seul serveur.
  3. Plus simple à manipuler . Il est plus facile de traiter 10 000 fichiers de 100 Mo chacun plutôt qu'avec un seul fichier de 1 To. Les fichiers volumineux peuvent être difficiles à gérer: en particulier, les transferts sont beaucoup plus susceptibles d'échouer. Il est également plus difficile de manipuler des sous-ensembles de données lorsque tout est dans un seul fichier.
MiniQuark
la source