Datasets documentation
Le cache
Le cache
Le cache est l’une des raisons pour lesquelles 🤗 Datasets est si efficace. Il conserve les jeux de données précédemment téléchargés et traités, de sorte que lorsque vous devez les réutiliser, ils sont rechargés directement depuis le cache. Cela évite de devoir retélécharger un jeu de données ou de réappliquer les fonctions de traitement. Même après avoir fermé et relancé une autre session Python, 🤗 Datasets rechargera votre jeu de données directement depuis le cache !
Empreinte
Comment le cache suit-il les transformations appliquées à un jeu de données ? Eh bien, 🤗 Datasets attribue une empreinte numérique au fichier de cache. Une empreinte numérique suit l’état actuel d’un jeu de données. L’empreinte initiale est calculée à partir d’un hachage de la table Arrow, ou d’un hachage des fichiers Arrow si le jeu de données est sur disque. Les empreintes suivantes sont calculées en combinant l’empreinte de l’état précédent et un hachage de la dernière transformation appliquée.
Les transformations sont toutes les méthodes de traitement des guides Comment traiter, telles que Dataset.map() ou Dataset.shuffle().
Voici à quoi ressemblent les empreintes réelles :
>>> from datasets import Dataset
>>> dataset1 = Dataset.from_dict({"a": [0, 1, 2]})
>>> dataset2 = dataset1.map(lambda x: {"a": x["a"] + 1})
>>> print(dataset1._fingerprint, dataset2._fingerprint)
d19493523d95e2dc 5b86abacd4b42434Pour qu'une transformation soit hachable, elle doit être sérialisable par dill ou pickle.
Lorsque vous utilisez une transformation non hachable, 🤗 Datasets utilise un empreinte aléatoire à la place et émet un avertissement. La transformation non hachable est considérée comme différente des transformations précédentes. En conséquence, 🤗 Datasets recalcule toutes les transformations. Assurez-vous que vos transformations sont sérialisables avec pickle ou dill pour éviter cela !
Un exemple de situation où 🤗 Datasets recalcule tout est lorsque la mise en cache est désactivée. Dans ce cas, les fichiers de cache sont générés à chaque fois et écrits dans un répertoire temporaire. Une fois votre session Python terminée, les fichiers de cache du répertoire temporaire sont supprimés. Un hachage aléatoire est attribué à ces fichiers de cache, au lieu d'une empreinte.
Lorsque la mise en cache est désactivée, utilisez Dataset.save_to_disk() pour enregistrer votre jeu de données transformé, sinon il sera supprimé à la fin de la session.
Hachage
L’empreinte d’un jeu de données est mise à jour en hachant la fonction passée à map ainsi que les paramètres de map (batch_size, remove_columns, etc.).
Vous pouvez vérifier l'empreinte numérique de n'importe quel objet Python à l'aide de fingerprint.Hasher :
>>> from datasets.fingerprint import Hasher
>>> my_func = lambda example: {"length": len(example["text"])}
>>> print(Hasher.hash(my_func))
'3d35e2b3e94c81d6'Le hachage est calculé en déversant l'objet à l'aide d'un sérialiseur dill et en hachant les octets déversés.
Le sérialiseur déverse récursivement toutes les variables utilisées dans votre fonction, de sorte que toute modification apportée à un objet utilisé dans votre fonction entraînera un changement du hachage.
Si l’une de vos fonctions ne semble pas avoir le même hachage d’une session à l’autre, cela signifie qu’au moins une de ses variables contient un objet Python non déterministe. Dans ce cas, n’hésitez pas à hacher tout objet que vous jugez suspect afin de trouver l’objet à l’origine de la modification du hachage. Par exemple, si vous utilisez une liste dont l’ordre des éléments n’est pas déterministe d’une session à l’autre, le hachage ne sera pas non plus le même d’une session à l’autre.
Update on GitHub