# WebDataset

[WebDataset](https://github.com/webdataset/webdataset) é uma biblioteca para escrever pipelines de E/S para grandes conjuntos de dados. Seus recursos de E/S sequencial e sharding o tornam especialmente útil para transmitir grandes conjuntos de dados em streaming para um DataLoader.

## O formato WebDataset

Um arquivo WebDataset é um arquivo TAR que contém uma série de arquivos de dados. Todos os arquivos de dados sucessivos com o mesmo prefixo são considerados parte do mesmo exemplo (por exemplo, um arquivo de imagem/áudio e seu rótulo ou metadados):

Os rótulos e metadados podem estar em um arquivo `.json`, em um `.txt` (para uma legenda, uma descrição) ou em um `.cls` (para um índice de classe).

Um WebDataset em larga escala é composto por muitos arquivos chamados shards, em que cada shard é um arquivo TAR. Cada shard geralmente tem ~1GB, mas o conjunto de dados completo pode ter vários terabytes!

## Suporte multimodal

WebDataset é projetado para conjuntos de dados multimodais, ou seja, para conjuntos de dados de imagem, áudio e/ou vídeo.

De fato, como os arquivos de mídia tendem a ser bastante grandes, a I/O sequencial do WebDataset permite leituras grandes e bufferização, resultando na melhor velocidade de carregamento de dados.

Aqui está uma lista não exaustiva dos formatos de dados suportados:

- imagem: jpeg, png, tiff
- áudio: mp3, m4a, wav, flac
- vídeo: mp4, mov, avi
- outros: npy, npz

A lista completa evolui ao longo do tempo e depende da implementação. Por exemplo, você pode encontrar quais formatos o pacote `webdataset` suporta no código-fonte [aqui](https://github.com/webdataset/webdataset/blob/main/src/webdataset/autodecode.py).

## Streaming

O streaming de arquivos TAR é rápido porque lê blocos contíguos de dados. Ele pode ser ordens de magnitude mais rápido do que ler arquivos de dados separados um por um.

O streaming do WebDataset oferece alto desempenho tanto ao ler do disco quanto do armazenamento em nuvem, o que o torna um formato ideal para alimentar um DataLoader:

Por exemplo, aqui está como transmitir o conjunto de dados [timm/imagenet-12k-wds](https://huggingface.co/datasets/timm/imagenet-12k-wds) diretamente do Hugging Face:

Primeiro, você precisa [fazer login com sua conta do Hugging Face](/docs/huggingface_hub/quick-start#login), por exemplo, usando:

```
hf auth login
```

E então você pode transmitir o conjunto de dados com WebDataset:

```python
>>> 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)
```

## Embaralhar

Em geral, conjuntos de dados em formatos WebDataset já estão embaralhados e prontos para alimentar um DataLoader. No entanto, você ainda pode reembaralhar os dados usando o embaralhamento aproximado do WebDataset.

Além de embaralhar a lista de shards, o WebDataset usa um buffer para embaralhar um dataset sem qualquer custo em velocidade:

Para embaralhar uma lista de arquivos fragmentados e amostrar aleatoriamente do buffer de embaralhamento:

```python
>>> buffer_size = 1000
>>> dataset = (
...     wds.WebDataset(url, shardshuffle=True)
...     .shuffle(buffer_size)
...     .decode()
... )
```

