Datasets documentation
Cache
Cache
Cache adalah salah satu alasan mengapa 🤗 Datasets sangat efisien. Cache menyimpan dataset yang sebelumnya telah diunduh dan diproses sehingga ketika Anda perlu menggunakannya kembali, dataset dimuat langsung dari cache. Hal ini menghindari kebutuhan untuk mengunduh dataset dari awal atau menerapkan ulang fungsi pemrosesan. Bahkan setelah Anda menutup dan memulai sesi Python lain, 🤗 Datasets akan memuat ulang dataset Anda langsung dari cache!
Sidik jari
Bagaimana cache melacak transform apa saja yang diterapkan pada dataset? 🤗 Datasets memberikan fingerprint ke file cache. Fingerprint melacak kondisi terkini dari dataset. Fingerprint awal dihitung menggunakan hash dari tabel Arrow, atau hash dari file-file Arrow jika dataset berada di disk. Fingerprint berikutnya dihitung dengan menggabungkan fingerprint dari kondisi sebelumnya dan hash dari transform terbaru yang diterapkan.
Transforms adalah metode pemrosesan apa pun dari panduan Cara Memproses seperti Dataset.map() atau Dataset.shuffle().
Berikut adalah tampilan sidik jari yang sebenarnya:
>>> 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 5b86abacd4b42434Agar sebuah transform dapat di-hash, transform tersebut harus dapat di-pickle oleh dill atau pickle.
Saat Anda menggunakan transform yang tidak dapat di-hash, 🤗 Datasets menggunakan fingerprint acak sebagai gantinya dan menampilkan peringatan. Transform yang tidak dapat di-hash dianggap berbeda dari transform sebelumnya. Akibatnya, 🤗 Datasets akan menghitung ulang semua transform. Pastikan transform Anda dapat diserialisasi dengan pickle atau dill untuk menghindari hal ini!
Salah satu contoh saat 🤗 Datasets menghitung ulang semuanya adalah ketika caching dinonaktifkan. Ketika ini terjadi, file cache dibuat setiap kali dan ditulis ke direktori sementara. Begitu sesi Python Anda berakhir, file cache di direktori sementara dihapus. Hash acak diberikan ke file cache ini, alih-alih fingerprint.
Saat caching dinonaktifkan, gunakan Dataset.save_to_disk() untuk menyimpan dataset yang telah ditransformasi atau dataset tersebut akan dihapus setelah sesi berakhir.
Hashing
Sidik jari dataset diperbarui dengan melakukan hashing pada fungsi yang diteruskan ke map serta parameter map (batch_size, remove_columns, dll.).
Anda dapat memeriksa hash dari objek Python apa pun menggunakan fingerprint.Hasher:
>>> from datasets.fingerprint import Hasher
>>> my_func = lambda example: {"length": len(example["text"])}
>>> print(Hasher.hash(my_func))
'3d35e2b3e94c81d6'Hash dihitung dengan menumpahkan objek menggunakan pickler dill dan meng-hash byte yang ditumpahkan.
Pickler secara rekursif menumpahkan semua variabel yang digunakan dalam fungsi Anda, sehingga setiap perubahan yang Anda lakukan pada objek yang digunakan dalam fungsi Anda akan menyebabkan hash berubah.
Jika salah satu fungsi Anda tampaknya tidak memiliki hash yang sama di antara sesi, itu berarti setidaknya salah satu variabelnya berisi objek Python yang tidak deterministik. Ketika ini terjadi, silakan hash objek mana pun yang Anda curigai untuk mencoba menemukan objek yang menyebabkan hash berubah. Sebagai contoh, jika Anda menggunakan list yang urutan elemennya tidak deterministik di antara sesi, maka hash-nya juga tidak akan sama di antara sesi.
Update on GitHub