Datasets 文件
快取
並獲得增強的文件體驗
開始使用
快取
快取是 🤗 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
為了使轉換可雜湊,它需要能被 dill 或 pickle 進行序列化。
當您使用一個不可雜湊的轉換時,🤗 Datasets 會改用一個隨機指紋併發出警告。這個不可雜湊的轉換被認為與之前的轉換不同。因此,🤗 Datasets 將重新計算所有的轉換。請確保您的轉換可以使用 pickle 或 dill 序列化,以避免這種情況!
當快取被停用時,🤗 Datasets 會重新計算所有內容,這是一個例子。當這種情況發生時,快取檔案每次都會生成並被寫入一個臨時目錄。一旦您的 Python 會話結束,臨時目錄中的快取檔案就會被刪除。系統會為這些快取檔案分配一個隨機雜湊值,而不是指紋。
當快取被停用時,請使用 Dataset.save_to_disk() 來儲存您轉換後的資料集,否則它將在會話結束時被刪除。
雜湊
資料集的指紋透過對傳遞給 map
的函式以及 map
的引數(batch_size
、remove_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 轉儲物件並對轉儲的位元組進行雜湊來計算的。pickler 會遞迴地轉儲函式中使用的所有變數,所以對函式中使用的任何物件所做的任何更改,都會導致雜湊值改變。
如果您的某個函式在不同會話間的雜湊值不一致,這意味著其至少一個變數包含一個非確定性的 Python 物件。當這種情況發生時,您可以隨時對任何您懷疑的物件進行雜湊,以嘗試找出導致雜湊值變化的物件。例如,如果您使用一個列表,其元素順序在不同會話間不確定,那麼雜湊值在不同會話間也不會相同。
< > 在 GitHub 上更新