Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

WebDataset

WebDataset 是一个用于为大型数据集编写 I/O 管道的库。其顺序 I/O 和分片功能使其特别适用于将大规模数据集流式传输到 DataLoader。

WebDataset 格式

WebDataset 文件是一个 TAR 归档文件,其中包含一系列数据文件。前缀相同的所有连续数据文件都被认为是同一示例的一部分(例如,图像/音频文件及其标签或元数据)

标签和元数据可以在 .json 文件、.txt 文件(用于标题、描述)或 .cls 文件(用于类索引)中。

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

多模态支持

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

实际上,由于媒体文件往往很大,WebDataset 的顺序 I/O 能够实现大型读取和缓冲,从而实现最佳数据加载速度。

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

  • 图像:jpeg、png、tiff
  • 音频:mp3、m4a、wav、flac
  • 视频:mp4、mov、avi
  • 其他:npy、npz

完整列表会随着时间推移而演变,并且取决于具体实现。例如,您可以在此处的源代码中找到 webdataset 包支持的格式。

流式传输

流式传输 TAR 归档文件速度很快,因为它读取连续的数据块。它可能比逐个读取单独的数据文件快几个数量级。

WebDataset 流式传输在从磁盘和云存储读取数据时均提供高速性能,这使其成为馈送到 DataLoader 的理想格式

例如,以下是如何直接从 Hugging Face 流式传输 timm/imagenet-12k-wds 数据集的方法

首先,您需要使用您的 Hugging Face 帐户登录,例如使用

huggingface-cli login

然后,您可以使用 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)

洗牌

通常,WebDataset 格式的数据集已经过洗牌处理,可以馈送到 DataLoader。但是您仍然可以使用 WebDataset 的近似洗牌重新洗牌数据。

除了对分片列表进行洗牌外,WebDataset 还使用缓冲区来洗牌数据集,而不会影响速度

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

>>> buffer_size = 1000
>>> dataset = (
...     wds.WebDataset(url, shardshuffle=True)
...     .shuffle(buffer_size)
...     .decode()
... )
< > 在 GitHub 上更新