資料集文件

快取

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

快取 (The cache)

快取是 🤗 Datasets 之所以如此高效的原因之一。它會儲存先前下載並處理過的資料集,因此當您再次需要使用它們時,可以直接從快取中重新載入。這避免了重新下載整個資料集或重複套用處理函數的需要。即使在您關閉並重新開始另一個 Python 工作階段後,🤗 Datasets 仍然會直接從快取中重新載入您的資料集!

指紋 (Fingerprint)

快取如何追蹤哪些轉換 (transform) 已套用到資料集?🤗 Datasets 會為快取檔案分配一個指紋 (fingerprint)。指紋用於追蹤資料集的目前狀態。初始指紋是使用 Arrow 表格的雜湊 (hash) 來計算,如果資料集位於磁碟上,則是使用 Arrow 檔案的雜湊來計算。隨後的指紋則透過結合前一個狀態的指紋與最新套用轉換的雜湊來計算。

轉換是指來自處理指南 (How-to Process) 中的任何處理方法,例如 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 序列化 (picklable)。

當您使用無法雜湊的轉換時,🤗 Datasets 會改用隨機指紋並引發警告。此時該無法雜湊的轉換會被視為與之前的轉換不同。因此,🤗 Datasets 將會重新計算所有轉換。請確保您的轉換可以使用 pickle 或 dill 進行序列化,以避免這種情況!

當停用快取時,🤗 Datasets 會重新計算所有內容。在這種情況下,快取檔案每次都會被重新生成並寫入暫存目錄。一旦您的 Python 工作階段結束,暫存目錄中的快取檔案就會被刪除。此時會為這些快取檔案分配一個隨機雜湊值,而非指紋。

當停用快取時,請使用 Dataset.save_to_disk() 來儲存您轉換後的資料集,否則它們會在工作階段結束後被刪除。

雜湊 (Hashing)

資料集的指紋是透過對傳遞給 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 pickler 傾印 (dump) 物件,並對傾印出的位元組進行雜湊運算來計算的。Pickler 會遞迴地傾印您函數中使用的所有變數,因此您對函數中使用的任何物件所做的變更,都會導致雜湊值發生變化。

如果您的函數在不同工作階段中似乎沒有相同的雜湊值,這意味著其至少有一個變數包含非確定性的 Python 物件。當這種情況發生時,您可以自由地對任何您懷疑的物件進行雜湊處理,試圖找出導致雜湊值變化的物件。例如,如果您使用一個元素順序在不同工作階段中不確定的列表,那麼雜湊值在不同工作階段中也會不相同。

在 GitHub 上更新

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