Hub documentation
WebDataset
WebDataset
WebDataset๋ ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์ ์ํ I/O ํ์ดํ๋ผ์ธ์ ์์ฑํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์์ฐจ์ I/O ๋ฐ ์ค๋ฉ ๊ธฐ๋ฅ ๋๋ถ์ ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์ DataLoader๋ก ์คํธ๋ฆฌ๋ฐํ๋ ๋ฐ ํนํ ์ ์ฉํฉ๋๋ค.
WebDataset ํ์
WebDataset ํ์ผ์ ์ผ๋ จ์ ๋ฐ์ดํฐ ํ์ผ์ ํฌํจํ๋ TAR ์์นด์ด๋ธ์ ๋๋ค. ๊ฐ์ ์ ๋์ฌ๋ฅผ ๊ฐ์ง ์ฐ์๋ ๋ชจ๋ ๋ฐ์ดํฐ ํ์ผ์ ๋์ผํ ์์(์: ์ด๋ฏธ์ง/์ค๋์ค ํ์ผ๊ณผ ํด๋น ๋ผ๋ฒจ ๋๋ ๋ฉํ๋ฐ์ดํฐ)์ ์ผ๋ถ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค:

๋ ์ด๋ธ๊ณผ ๋ฉํ๋ฐ์ดํฐ๋ .json ํ์ผ, .txt (์บก์
, ์ค๋ช
์ฉ), ๋๋ .cls (ํด๋์ค ์ธ๋ฑ์ค์ฉ)์ ํฌํจ๋ ์ ์์ต๋๋ค.
๋๊ท๋ชจ WebDataset๋ shard๋ผ๊ณ ๋ถ๋ฆฌ๋ ์ฌ๋ฌ ํ์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ, ๊ฐ shard๋ TAR ์์นด์ด๋ธ์ ๋๋ค. ๊ฐ shard์ ํฌ๊ธฐ๋ ๋ณดํต ์ฝ 1GB์ด์ง๋ง, ์ ์ฒด ๋ฐ์ดํฐ์ ์ ์ ํ ๋ผ๋ฐ์ดํธ์ ๋ฌํ ์ ์์ต๋๋ค!
๋ฉํฐ๋ชจ๋ฌ ์ง์
WebDataset๋ ์ด๋ฏธ์ง, ์ค๋์ค ๋ฐ/๋๋ ๋น๋์ค ๋ฐ์ดํฐ์ ๊ณผ ๊ฐ์ ๋ฉํฐ๋ชจ๋ฌ ๋ฐ์ดํฐ์ ์ ์ํด ์ค๊ณ๋์์ต๋๋ค.
์ค์ ๋ก ๋ฏธ๋์ด ํ์ผ์ ํฌ๊ธฐ๊ฐ ์๋นํ ํฐ ๊ฒฝํฅ์ด ์์ด, WebDataset์ ์์ฐจ์ I/O๋ ๋์ฉ๋ ์ฝ๊ธฐ ๋ฐ ๋ฒํผ๋ง์ ๊ฐ๋ฅํ๊ฒ ํ์ฌ ์ต์ ์ ๋ฐ์ดํฐ ๋ก๋ฉ ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ง์๋๋ ๋ฐ์ดํฐ ํ์์ ๋นํฌ๊ด์ ๋ชฉ๋ก์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- image: jpeg, png, tiff
- ์ค๋์ค: mp3, m4a, wav, flac
- video: mp4, mov, avi
- other: npy, npz
์ ์ฒด ๋ชฉ๋ก์ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ณํ๋ฉฐ ๊ตฌํ์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค. ์๋ฅผ ๋ค์ด, webdataset ํจํค์ง๊ฐ ์ง์ํ๋ ํ์์ ์์ค ์ฝ๋ ์ฌ๊ธฐ์์ ํ์ธํ ์ ์์ต๋๋ค.
์คํธ๋ฆฌ๋ฐ
์ฐ์๋ ๋ฐ์ดํฐ ์ฒญํฌ๋ฅผ ์ฝ๊ธฐ ๋๋ฌธ์ TAR ์์นด์ด๋ธ์ ์คํธ๋ฆฌ๋ฐ์ ๋น ๋ฆ ๋๋ค. ๊ฐ๋ณ ๋ฐ์ดํฐ ํ์ผ์ ํ๋์ฉ ์ฝ๋ ๊ฒ๋ณด๋ค ์ ๋ฐฐ์์ ์ ๋ฐฐ ์ด์ ๋น ๋ฅผ ์ ์์ต๋๋ค.
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์ ๊ทผ์ฌ ์ ํ๋ง์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์ ํํ ์๋ ์์ต๋๋ค.
shards ๋ชฉ๋ก์ ์๋ ๊ฒ ์ธ์๋, WebDataset๋ ์๋ ์ ํ ์์ด ๋ฐ์ดํฐ์ ์ ์๊ธฐ ์ํด ๋ฒํผ๋ฅผ ์ฌ์ฉํฉ๋๋ค:

sharded ํ์ผ ๋ชฉ๋ก์ ์๊ณ (shuffle) ์ ํ ๋ฒํผ์์ ๋ฌด์์๋ก ์ํ๋งํ๋ ค๋ฉด:
>>> buffer_size = 1000
>>> dataset = (
... wds.WebDataset(url, shardshuffle=True)
... .shuffle(buffer_size)
... .decode()
... )