Hub documentation

WebDataset

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

WebDataset

WebDatasetは、大規模なデータセット向けのI/Oパイプラインを作成するためのライブラリです。 シーケンシャルI/Oとシャーディングの機能により、大規模なデータセットをDataLoaderにストリーミングする際に特に有用です。

WebDataset形式

WebDatasetファイルは、一連のデータファイルを含むTARアーカイブです。 同じプレフィックスを持つ連続するすべてのデータファイルは、同じサンプルの一部(例:画像/音声ファイルとそのラベルまたはメタデータ)とみなされます。

ラベルとメタデータは、.jsonファイル、.txt(キャプションや説明用)、または.cls(クラスインデックス用)に格納できます。

大規模なWebDatasetは、シャードと呼ばれる多数のファイルで構成されており、各シャードはTARアーカイブです。 各シャードは通常約1GBですが、データセット全体は数テラバイトに達する可能性があります!

マルチモーダル対応

WebDatasetは、画像、音声、および/または動画のデータセット、すなわちマルチモーダルデータセットのために設計されています。

実際、メディアファイルは比較的大きくなる傾向があるため、WebDatasetのシーケンシャルI/Oは大きな読み取りとバッファリングを可能にし、最適なデータ読み込み速度を実現します。

サポートされているデータ形式の非網羅的なリストを以下に示します。

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

完全なリストは時間とともに変化し、実装によって異なります。例えば、webdatasetパッケージがサポートする形式は、ソースコードのこちらで確認できます。

ストリーミング

TARアーカイブのストリーミングは、連続したデータチャンクを読み込むため高速です。 個別のデータファイルを1つずつ読み込む場合と比べて、桁違いに高速になる可能性があります。

WebDatasetのストリーミングは、ディスクからの読み取りとクラウドストレージからの読み取りの両方で高速なパフォーマンスを発揮するため、DataLoaderにデータを供給する形式として最適です:

例えば、Hugging Faceからtimm/imagenet-12k-wdsデータセットを直接ストリーミングする方法は以下の通りです:

まず、Hugging Face アカウントでログインする必要があります。例えば、以下のようにします:

hf auth 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()
... )
Update on GitHub