Datasets documentation
O cache
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 5b86abacd4b42434Para 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