Hub documentation
WebDataset
WebDataset
WebDataset es una biblioteca para escribir pipelines de E/S para conjuntos de datos grandes. Sus funciones de E/S secuencial y sharding la hacen especialmente útil para transmitir conjuntos de datos a gran escala a un DataLoader.
El formato WebDataset
Un archivo WebDataset es un archivo TAR que contiene una serie de archivos de datos. Todos los archivos de datos sucesivos con el mismo prefijo se consideran parte del mismo ejemplo (p. ej., un archivo de imagen/sonido y su etiqueta o metadatos):

Las etiquetas y los metadatos pueden estar en un archivo .json, en un .txt (para una leyenda o una descripción) o en un .cls (para un índice de clase).
Un WebDataset a gran escala está compuesto por muchos archivos llamados shards, donde cada shard es un archivo TAR. Cada shard suele ser de ~1 GB, ¡pero el conjunto de datos completo puede ser de varios terabytes!
Soporte multimodal
WebDataset está diseñado para conjuntos de datos multimodales, es decir, para conjuntos de datos de imágenes, audio y/o video.
De hecho, dado que los archivos multimedia suelen ser bastante grandes, la E/S secuencial de WebDataset permite lecturas grandes y el uso de búfer, lo que resulta en la mejor velocidad de carga de datos.
A continuación se muestra una lista no exhaustiva de los formatos de datos admitidos:
- image: jpeg, png, tiff
- audio: mp3, m4a, wav, flac
- video: mp4, mov, avi
- other: npy, npz
La lista completa evoluciona con el tiempo y depende de la implementación. Por ejemplo, puedes encontrar qué formatos admite el paquete webdataset en el código fuente aquí.
Streaming
La transmisión de archivos TAR es rápida porque lee fragmentos de datos contiguos. Puede ser varias órdenes de magnitud más rápido que leer archivos de datos separados uno por uno.
El streaming de WebDataset ofrece un alto rendimiento tanto al leer desde el disco como desde el almacenamiento en la nube, lo que lo convierte en un formato ideal para alimentar a un DataLoader:

Por ejemplo, aquí se muestra cómo transmitir el conjunto de datos timm/imagenet-12k-wds directamente desde Hugging Face:
Primero necesitas iniciar sesión con tu cuenta de Hugging Face, por ejemplo, usando:
hf auth loginY luego puedes transmitir el conjunto de datos con WebDataset:
>>> import webdataset as wds
>>> from huggingface_hub import get_token
>>> from torch.utils.data import DataLoader
>>> hf_token = get_token()
>>> url = "https://huggingface.co/datasets/timm/imagenet-12k-wds/resolve/main/imagenet12k-train-{{0000..1023}}.tar"
>>> url = f"pipe:curl -s -L {url} -H 'Authorization:Bearer {hf_token}'"
>>> dataset = wds.WebDataset(url).decode()
>>> dataloader = DataLoader(dataset, batch_size=64, num_workers=4)Barajar
Por lo general, los conjuntos de datos en formatos de WebDataset ya están barajados y listos para alimentar a un DataLoader. Pero aún puedes volver a barajar los datos con el barajado aproximado de WebDataset.
Además de barajar la lista de fragmentos, WebDataset utiliza un búfer para barajar un conjunto de datos sin ningún coste en velocidad:

Para barajar una lista de archivos fragmentados y muestrear aleatoriamente del búfer de barajado:
>>> buffer_size = 1000
>>> dataset = (
... wds.WebDataset(url, shardshuffle=True)
... .shuffle(buffer_size)
... .decode()
... )