Datasets documentation
La caché
La caché
La caché es una de las razones por las que 🤗 Datasets es tan eficiente. Almacena los conjuntos de datos descargados y procesados previamente, de modo que cuando necesitas volver a usarlos, se recargan directamente desde la caché. Esto evita tener que descargar un conjunto de datos de nuevo o volver a aplicar las funciones de procesamiento. ¡Incluso después de cerrar e iniciar otra sesión de Python, 🤗 Datasets recargará tu conjunto de datos directamente desde la caché!
Huella digital
¿Cómo hace el caché el seguimiento de las transformaciones aplicadas a un conjunto de datos? Bueno, 🤗 Datasets asigna una huella digital al archivo de caché. Una huella digital mantiene el registro del estado actual de un conjunto de datos. La huella digital inicial se calcula utilizando un hash de la tabla Arrow, o un hash de los archivos Arrow si el conjunto de datos está en disco. Las huellas digitales posteriores se calculan combinando la huella digital del estado anterior y un hash de la última transformación aplicada.
Los transforms son cualquiera de los métodos de procesamiento de las guías How-to Process, como Dataset.map() o Dataset.shuffle().
Así es como se ven las huellas dactilares reales:
>>> 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 una transformación sea hashable, debe ser serializable con dill o pickle.
Cuando usas una transformación no hashable, 🤗 Datasets usa una huella digital aleatoria en su lugar y emite una advertencia. La transformación no hashable se considera diferente de las transformaciones anteriores. Como resultado, 🤗 Datasets recalculará todas las transformaciones. ¡Asegúrate de que tus transformaciones sean serializables con pickle o dill para evitar esto!
Un ejemplo de cuándo 🤗 Datasets recalcula todo es cuando la caché está desactivada. Cuando esto ocurre, los archivos de caché se generan cada vez y se escriben en un directorio temporal. Una vez que termina tu sesión de Python, los archivos de caché en el directorio temporal se eliminan. A estos archivos de caché se les asigna un hash aleatorio, en lugar de una huella digital.
Cuando la caché está desactivada, use Dataset.save_to_disk() para guardar su conjunto de datos transformado, ya que se eliminará al finalizar la sesión.
Hashing
La huella digital de un conjunto de datos se actualiza mediante el hash de la función pasada a map y de los parámetros de map (batch_size, remove_columns, etc.).
Puedes comprobar el hash de cualquier objeto de Python usando fingerprint.Hasher:
>>> from datasets.fingerprint import Hasher
>>> my_func = lambda example: {"length": len(example["text"])}
>>> print(Hasher.hash(my_func))
'3d35e2b3e94c81d6'El hash se calcula volcando el objeto mediante un pickler de dill y calculando el hash de los bytes volcados.
El pickler vuelca recursivamente todas las variables utilizadas en su función, por lo que cualquier cambio que realice en un objeto utilizado en su función provocará que el hash cambie.
Si una de tus funciones no parece tener el mismo hash entre sesiones, significa que al menos una de sus variables contiene un objeto de Python que no es determinista. Cuando esto ocurre, puedes hacer el hash de cualquier objeto que te parezca sospechoso para intentar encontrar el objeto que causó el cambio en el hash. Por ejemplo, si usas una lista cuyo orden de elementos no es determinista entre sesiones, el hash tampoco será el mismo entre sesiones.
Update on GitHub