스트리밍(Streaming) 데이터셋

스트리밍(Streaming) 데이터셋

모델 훈련에 필요한 데이터셋이 수십 GB에 이르면, 전체를 다운로드하고 기다리는 일은 비효율적일 때가 많아요. 스트리밍은 데이터셋을 다운로드하지 않고 조각으로 순차적으로 읽는 방식이라, 디스크 공간·시간을 아끼고 메모리도 효율적으로 관리해요. load_dataset(..., streaming=True)로 켜면 IterableDataset이 반환돼요.

from datasets import load_dataset

iterable_dataset = load_dataset(
    "stanfordnlp/imdb",
    split="train",
    streaming=True,
)
for example in iterable_dataset:
    print(example)
    break

출처: https://huggingface.co/docs/datasets/main/en/streaming

언제 쓰는가

  • 다운로드에 시간이 오래 걸리는 대용량 데이터셋일 때.
  • 학습 초기에 데이터 일부만 빠르게 살펴보고 싶을 때.
  • 로컬 디스크 공간이 부족한 환경(예: 외부 GPU 인스턴스)에서.
  • 원격 데이터를 바로 읽어야 할 때(Hub의 Parquet 파일, S3 등).

IterableDataset 다루기

IterableDataset은 파이썬 이터레이터처럼 for 루프로 순회해요. Dataset과 달리 무작위 인덱스 접근(dataset[i])은 제공하지 않아요. 다음 예제처럼 shuffle(seed=..., buffer_size=...)로 근사 셔플을 하면 스트리밍에서도 순서를 흘뜨릴 수 있어요.

shuffled = iterable_dataset.shuffle(seed=42, buffer_size=1000)

map도 스트리밍에서 지원돼요. 각 예제(또는 배치)에 처리 함수를 적용한 이터러블을 만들 수 있어요.

이터러블과 일반 데이터셋 변환

필요하다면 IterableDataset을 일반 Dataset으로 바꾸거나, 부분만 수집해 메모리에 올릴 수 있어요. 정확한 API는 버전에 따라 다를 수 있으니 해당 버전의 패키지 참조를 확인하는 게 좋아요.

주의할 점

  • 랜덤 접근이 안 되므로, 인덱스 기반 셔플·분할을 기대하는 작업엔 부적합할 수 있어요.
  • 스트리밍은 원격 Parquet·Hub 데이터에 대한 네트워크 의존성이 있어, 연결이 불안정하면 처리 속도가 흔들릴 수 있어요.

더 알아보기