Datasets 文档

缓存

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

缓存

缓存是 🤗 Datasets 之所以如此高效的原因之一。它存储之前下载和处理过的数据集,因此当您需要再次使用它们时,可以直接从缓存重新加载。这避免了需要重新下载数据集,或重新应用处理函数。即使您关闭并启动另一个 Python 会话,🤗 Datasets 也会直接从缓存重新加载您的数据集!

指纹

缓存如何跟踪应用于数据集的转换?嗯,🤗 Datasets 为缓存文件分配一个指纹。指纹跟踪数据集的当前状态。初始指纹使用 Arrow 表的哈希值,或者数据集在磁盘上时 Arrow 文件的哈希值来计算。后续指纹通过组合前一状态的指纹和最新应用的转换的哈希值来计算。

转换是指 如何处理 指导中的任何处理方法,例如 Dataset.map()Dataset.shuffle()

以下是实际指纹的样子

>>> 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 5b86abacd4b42434

为了使转换可哈希,它需要能够被 dillpickle 序列化。

当您使用不可哈希的转换时,🤗 Datasets 会使用一个随机指纹并发出警告。不可哈希的转换被认为与之前的转换不同。因此,🤗 Datasets 将重新计算所有转换。请确保您的转换可以使用 pickle 或 dill 序列化,以避免这种情况!

当 🤗 Datasets 重新计算一切的一个例子是禁用缓存时。发生这种情况时,缓存文件每次都会生成,并写入临时目录。一旦您的 Python 会话结束,临时目录中的缓存文件将被删除。这些缓存文件会被分配一个随机哈希值,而不是指纹。

当缓存被禁用时,请使用 Dataset.save_to_disk() 来保存您转换后的数据集,否则它将在会话结束后被删除。

哈希

数据集的指纹通过对传递给 map 函数的函数以及 map 参数(batch_sizeremove_columns 等)进行哈希来更新。

您可以使用 fingerprint.Hasher 来检查任何 Python 对象的哈希值。

>>> from datasets.fingerprint import Hasher
>>> my_func = lambda example: {"length": len(example["text"])}
>>> print(Hasher.hash(my_func))
'3d35e2b3e94c81d6'

哈希值是通过使用 dill 序列化器转储对象并对转储的字节进行哈希来计算的。序列化器会递归转储函数中使用的所有变量,因此您对函数中使用的对象所做的任何更改都会导致哈希值发生变化。

如果您的某个函数在不同会话中似乎没有相同的哈希值,这意味着它的至少一个变量包含一个非确定性的 Python 对象。发生这种情况时,请随时对您认为可疑的任何对象进行哈希,以尝试找出导致哈希值变化的那个对象。例如,如果您使用一个列表,其元素的顺序在不同会话中不是确定性的,那么哈希值在不同会话中也不会相同。

在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.