# WebDataset

[WebDataset](https://github.com/webdataset/webdataset) 是一个用于编写大型数据集 I/O 管道的库。其顺序 I/O 和分片功能使其特别适用于将大规模数据集流式传输到 DataLoader。

## WebDataset 格式

WebDataset 文件是一个 TAR 归档，其中包含一系列数据文件。所有具有相同前缀的连续数据文件都被视为属于同一个示例（例如，图像/音频文件及其标签或元数据）：

标签和元数据可以位于 `.json` 文件中，位于 `.txt` 文件中（用于字幕或描述），或位于 `.cls` 文件中（用于类别索引）。

大规模 WebDataset 由许多称为 shard 的文件组成，每个 shard 都是一个 TAR 归档。每个 shard 通常约为 1GB，但完整的数据集可能达到数 TB！

## 多模态支持

WebDataset 专为多模态数据集设计，即适用于图像、音频和/或视频数据集。

事实上，由于媒体文件通常体积较大，WebDataset 的顺序 I/O 能够实现大块读取和缓冲，从而获得最佳的数据加载速度。

以下是支持的数据格式的非详尽列表：

- image: jpeg, png, tiff
- audio: mp3, m4a, wav, flac
- video: mp4, mov, avi
- other: npy, npz

完整列表会随时间推移而变化，并取决于具体实现。例如，你可以在源代码的[此处](https://github.com/webdataset/webdataset/blob/main/src/webdataset/autodecode.py)找到`webdataset`包支持的格式。

## 流式

流式传输 TAR 归档之所以速度快，是因为它以连续的数据块进行读取。与逐个读取独立的数据文件相比，其速度可能快几个数量级。

WebDataset 流式处理在从磁盘和云存储读取时均能提供高速性能，使其成为向 DataLoader 提供数据的理想格式：

例如，以下是如何直接从 Hugging Face 流式加载 [timm/imagenet-12k-wds](https://huggingface.co/datasets/timm/imagenet-12k-wds) 数据集：

首先，您需要使用 Hugging Face 账户[登录](/docs/huggingface_hub/quick-start#login)，例如使用以下命令：

```
hf auth login
```

然后，你可以使用 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)
```

## Shuffle

通常，WebDataset 格式的数据集已经过洗牌，可以直接提供给 DataLoader。不过，你仍然可以使用 WebDataset 的近似洗牌功能对数据进行重新洗牌。

除了对分片列表进行洗牌外，WebDataset 还使用缓冲区来洗牌数据集，且不会带来任何速度开销：

要打乱分片文件列表并从洗牌缓冲区中随机采样：

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

