Datasets documentation

Кэш

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v4.8.4).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Кэш

Кэш — одна из причин, почему 🤗 Datasets работает так эффективно. Он хранит ранее загруженные и обработанные наборы данных, поэтому при повторном использовании они загружаются напрямую из кэша. Это позволяет избежать повторной загрузки набора данных или повторного применения функций обработки. Даже после закрытия и запуска новой сессии Python 🤗 Datasets загрузит ваш набор данных напрямую из кэша!

Отпечаток

Как кэш отслеживает, какие преобразования применены к набору данных? 🤗 Datasets присваивает файлу кэша отпечаток (fingerprint). Отпечаток хранит информацию о текущем состоянии набора данных. Начальный отпечаток вычисляется на основе хэша таблицы Arrow или хэша файлов Arrow, если набор данных находится на диске. Последующие отпечатки вычисляются путём объединения отпечатка предыдущего состояния и хэша последнего применённого преобразования.

Transforms — это любые методы обработки из руководств 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

Чтобы трансформ был хэшируемым, он должен быть сериализуемым с помощью dill или pickle.

При использовании нехэшируемого преобразования 🤗 Datasets использует случайный отпечаток вместо него и выводит предупреждение. Нехэшируемое преобразование считается отличным от предыдущих. В результате 🤗 Datasets пересчитывает все преобразования. Убедитесь, что ваши преобразования сериализуемы с помощью pickle или dill, чтобы избежать этого!

Примером ситуации, когда 🤗 Datasets пересчитывает всё, является отключённое кэширование. В этом случае файлы кэша генерируются каждый раз и записываются во временный каталог. После завершения сессии Python файлы кэша во временном каталоге удаляются. Вместо отпечатка (fingerprint) этим файлам кэша присваивается случайный хэш.

Если кэширование отключено, используйте Dataset.save_to_disk() для сохранения преобразованного набора данных, иначе он будет удалён по завершении сессии.

Хеширование

Отпечаток данных обновляется путём хеширования функции, переданной в map, а также параметров map (batch_size, remove_columns и т. д.).

Вы можете проверить хэш любого объекта Python с помощью fingerprint.Hasher:

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

Хеш вычисляется путём сериализации объекта с помощью пиклера dill и хеширования полученных байтов. Пиклер рекурсивно сериализует все переменные, используемые в вашей функции, поэтому любое изменение объекта, задействованного в вашей функции, приведёт к изменению хеша.

Если хеш одной из ваших функций не совпадает между сессиями, это означает, что хотя бы одна из её переменных содержит объект Python, который не является детерминированным. В этом случае вы можете вычислить хеш любого подозрительного объекта, чтобы найти тот, который вызвал изменение хеша. Например, если вы используете список, порядок элементов которого не является детерминированным между сессиями, то хеш также будет различаться между сессиями.

Update on GitHub