WebDataset
WebDataset
WebDataset는 대규모 데이터셋을 위한 I/O 파이프라인을 작성하는 라이브러리예요. 순차 I/O(sequential I/O)와 샤딩(sharding) 덕분에 대규모 데이터셋을 DataLoader로 스트리밍하는 데 특히 유용해요.
Media 파일 위주의 멀티모달 데이터를 스트리밍 형식으로 빠르게 DataLoader에 공급하려는 분에게 딱이에요.
출처: 문서
본문
WebDataset 형식
WebDataset 파일은 일련의 데이터 파일을 담은 TAR 아카이브예요. 같은 접두어(prefix)를 가진 연속된 데이터 파일들은 같은 예시의 일부로 간주돼요 (예: 이미지/오디오 파일과 그 라벨·메타데이터).
라벨과 메타데이터는 .json 파일, 캡션·설명용 .txt 파일, 또는 클래스 인덱스용 .cls 파일에 담을 수 있어요.
대규모 WebDataset은 샤드(shard)라고 부르는 많은 파일로 만들어지고, 각 샤드는 TAR 아카이브예요. 각 샤드는 보통 ~1GB지만 전체 데이터셋은 수 테라바이트가 될 수도 있어요!
멀티모달 지원
WebDataset은 멀티모달 데이터셋, 즉 이미지·오디오·비디오 데이터셋을 위해 설계됐어요.
실제로 미디어 파일은 꽤 크기 마련이라, WebDataset의 순차 I/O는 큰 읽기와 버퍼링을 가능하게 해 최고의 데이터 로딩 속도를 냅니다.
지원되는 데이터 형식의 일부(포괄적이지 않은 목록)예요:
- image: jpeg, png, tiff
- audio: mp3, m4a, wav, flac
- video: mp4, mov, avi
- other: npy, npz
전체 목록은 시간이 지나면서 변하고 구현에 따라 달라져요. 예를 들어 webdataset 패키지가 지원하는 형식은 여기 원본 코드에서 찾을 수 있어요.
스트리밍
TAR 아카이브 스트리밍은 연속된 데이터 덩어리를 읽기 때문에 빠르고, 별도의 데이터 파일을 하나씩 읽는 것보다 수십 배(orders of magnitude) 빨라질 수 있어요.
WebDataset 스트리밍은 디스크에서 읽을 때나 클라우드 스토리지에서 읽을 때 모두 고속 성능을 제공해서 DataLoader에 공급하기에 이상적인 형식이에요:
예를 들어 timm/imagenet-12k-wds 데이터셋을 Hugging Face에서 직접 스트리밍하는 방법이에요:
먼저 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 ***'"
>>> dataset = wds.WebDataset(url).decode()
>>> dataloader = DataLoader(dataset, batch_size=64, num_workers=4)
셔플 (Shuffle)
일반적으로 WebDataset 형식의 데이터셋은 이미 셔플되어 DataLoader에 공급할 준비가 되어 있어요. 하지만 WebDataset의 근사 셔플로 데이터를 다시 섞을 수도 있어요.
WebDataset은 샤드 목록을 셔플하는 것에 더해, 버퍼를 사용해서 속도 손실 없이 데이터셋을 셔플해요:
샤드 파일 목록을 셔플하고 셔플 버퍼에서 무작위로 샘플링하려면:
>>> buffer_size = 1000
>>> dataset = (
... wds.WebDataset(url, shardshuffle=True)
... .shuffle(buffer_size)
... .decode()
... )
더 알아보기 (Learn more)
- 대규모 데이터셋은 TAR·샤드 기반 WebDataset 형식으로 스트리밍하면 DataLoader 속도가 크게 빨라져요.
- WebDataset GitHub에서 라이브러리와 사용법을 확인해 보세요.
- Hub에 대용량 데이터셋을 올리는 방법은 데이터셋 개요를 참고해요.