Datasets documentation

O cache

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

O cache

O cache é uma das razões pelas quais o 🤗 Datasets é tão eficiente. Ele armazena conjuntos de dados previamente baixados e processados, de modo que, quando você precisa usá-los novamente, eles são recarregados diretamente do cache. Isso evita a necessidade de baixar um conjunto de dados novamente ou de reaplicar funções de processamento. Mesmo depois de fechar e iniciar outra sessão do Python, o 🤗 Datasets recarregará seu conjunto de dados diretamente do cache!

Impressão digital

Como o cache acompanha quais transformações são aplicadas a um conjunto de dados? Bem, o 🤗 Datasets atribui uma impressão digital ao arquivo de cache. Uma impressão digital acompanha o estado atual de um conjunto de dados. A impressão digital inicial é calculada usando um hash da tabela Arrow, ou um hash dos arquivos Arrow, se o conjunto de dados estiver no disco. As impressões digitais subsequentes são calculadas combinando a impressão digital do estado anterior e um hash da última transformação aplicada.

Transforms são quaisquer dos métodos de processamento dos guias Como processar, como Dataset.map() ou Dataset.shuffle().

Aqui está como as impressões digitais reais se parecem:

>>> 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

Para que uma transformação seja hashável, ela precisa ser serializável por dill ou pickle.

Quando você usa um transform não hashável, o 🤗 Datasets usa um fingerprint aleatório no lugar e emite um aviso. O transform não hashável é considerado diferente dos transforms anteriores. Como resultado, o 🤗 Datasets recalcula todos os transforms. Certifique-se de que seus transforms são serializáveis com pickle ou dill para evitar isso!

Um exemplo de quando o 🤗 Datasets recalcula tudo é quando o cache está desativado. Quando isso acontece, os arquivos de cache são gerados a cada vez e são gravados em um diretório temporário. Assim que sua sessão Python termina, os arquivos de cache no diretório temporário são excluídos. Um hash aleatório é atribuído a esses arquivos de cache, em vez de uma impressão digital.

Quando o cache está desativado, use Dataset.save_to_disk() para salvar seu dataset transformado, pois ele será excluído ao final da sessão.

Hashing

A impressão digital de um conjunto de dados é atualizada ao aplicar a função de hash à função passada para map, bem como aos parâmetros de map (batch_size, remove_columns, etc.).

Você pode verificar o hash de qualquer objeto Python usando o fingerprint.Hasher:

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

O hash é calculado despejando o objeto usando um pickler dill e calculando o hash dos bytes despejados. O pickler despeja recursivamente todas as variáveis usadas na sua função, portanto, qualquer alteração que você fizer em um objeto usado na sua função causará a mudança do hash.

Se uma das suas funções não parece ter o mesmo hash entre sessões, isso significa que pelo menos uma de suas variáveis contém um objeto Python que não é determinístico. Quando isso acontece, sinta-se à vontade para calcular o hash de qualquer objeto que você considere suspeito para tentar encontrar o objeto que causou a alteração do hash. Por exemplo, se você usar uma lista cuja ordem dos elementos não é determinística entre sessões, o hash também não será o mesmo entre sessões.

Update on GitHub