Datasets documentation
Bộ nhớ đệm
Bộ nhớ đệm
Cache là một trong những lý do khiến 🤗 Datasets hiệu quả đến vậy. Nó lưu trữ các dataset đã được tải xuống và xử lý trước đó, nên khi bạn cần sử dụng lại chúng, chúng sẽ được nạp trực tiếp từ cache. Điều này giúp tránh việc phải tải lại toàn bộ dataset hoặc áp dụng lại các hàm xử lý. Ngay cả sau khi bạn đóng và mở một phiên Python khác, 🤗 Datasets vẫn sẽ nạp dataset của bạn trực tiếp từ cache!
Dấu vân tay
Cache theo dõi các transform được áp dụng cho một dataset như thế nào? 🤗 Datasets gán một fingerprint cho file cache. Fingerprint theo dõi trạng thái hiện tại của dataset. Fingerprint ban đầu được tính bằng cách sử dụng hash từ bảng Arrow, hoặc hash của các file Arrow nếu dataset nằm trên đĩa. Các fingerprint tiếp theo được tính bằng cách kết hợp fingerprint của trạng thái trước đó với hash của transform mới nhất được áp dụng.
Transforms là bất kỳ phương pháp xử lý nào từ các hướng dẫn Cách xử lý như Dataset.map() hoặc Dataset.shuffle().
Dưới đây là hình dạng thực tế của các dấu vân tay:
>>> 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Để một transform có thể băm được, nó cần phải có thể picklable bằng dill hoặc pickle.
Khi bạn sử dụng một transform không hashable, 🤗 Datasets sẽ sử dụng một fingerprint ngẫu nhiên thay thế và đưa ra một cảnh báo. Transform không hashable được coi là khác biệt so với các transform trước đó. Do đó, 🤗 Datasets sẽ tính toán lại tất cả các transform. Hãy đảm bảo các transform của bạn có thể được serialize bằng pickle hoặc dill để tránh điều này!
Một ví dụ về trường hợp 🤗 Datasets tính toán lại toàn bộ là khi bộ nhớ đệm bị vô hiệu hóa. Khi điều này xảy ra, các tệp bộ nhớ đệm được tạo ra mỗi lần và được ghi vào một thư mục tạm thời. Khi phiên Python của bạn kết thúc, các tệp bộ nhớ đệm trong thư mục tạm thời sẽ bị xóa. Một băm ngẫu nhiên được gán cho các tệp bộ nhớ đệm này, thay vì một dấu vân tay.
Khi tắt bộ nhớ đệm, hãy sử dụng Dataset.save_to_disk() để lưu bộ dữ liệu đã biến đổi của bạn, nếu không nó sẽ bị xóa khi phiên kết thúc.
Băm
Dấu vân tay của một tập dữ liệu được cập nhật bằng cách băm hàm được truyền vào map cũng như các tham số của map (batch_size, remove_columns, v.v.).
Bạn có thể kiểm tra hash của bất kỳ đối tượng Python nào bằng cách sử dụng fingerprint.Hasher:
>>> from datasets.fingerprint import Hasher
>>> my_func = lambda example: {"length": len(example["text"])}
>>> print(Hasher.hash(my_func))
'3d35e2b3e94c81d6'Hash được tính bằng cách dump đối tượng bằng pickler dill và băm các byte đã dump.
Pickler đệ quy dump tất cả các biến được sử dụng trong hàm của bạn, do đó bất kỳ thay đổi nào bạn thực hiện trên một đối tượng được dùng trong hàm của bạn sẽ khiến hash thay đổi.
Nếu một trong các hàm của bạn dường như không có cùng giá trị băm giữa các phiên, điều đó có nghĩa là ít nhất một biến của nó chứa một đối tượng Python không mang tính tất định. Khi điều này xảy ra, bạn có thể tự do băm bất kỳ đối tượng nào mà bạn nghi ngờ để tìm ra đối tượng đã gây ra sự thay đổi giá trị băm. Ví dụ, nếu bạn sử dụng một danh sách mà thứ tự các phần tử của nó không mang tính tất định giữa các phiên, thì giá trị băm cũng sẽ không giống nhau giữa các phiên.
Update on GitHub