본문 바로가기
C.W.K.
Stream
Lesson 05 of 08 · published

Streaming Datasets 와 IterableDataset

~26 min · datasets, streaming

Level 0스카우트
0 XP0/50 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

데이터가 디스크보다 크면 스트리밍부터 생각해

FineWeb이나 RedPajama처럼 수 TB에 이르는 데이터셋은 streaming=True로 열어야 해. 반환되는 IterableDataset는 전체를 만들지 않고 Parquet shard에서 필요한 예제를 그때그때 읽어.

  • len()ds[i]는 쓸 수 없고 앞에서부터 순서대로 순회해.
  • map은 미리 굽지 않고 순회하는 순간 변환해.
  • filter도 지연 실행되므로 99%를 버리는 조건이면 I/O 역시 99% 낭비돼.
  • shuffle(buffer_size=N)은 크기 N인 버퍼 안에서 섞을 뿐 전체 순서를 완전히 뒤섞지는 않아.

작업자마다 다른 shard를 맡겨

ds.shard(num_shards=8, index=worker_id)로 각 DataLoader 작업자에게 다른 shard를 배분할 수 있어. 분산 학습에서 중복 표본을 막으려면 순회 전에 이 분할 계약을 확인해야 해.

Code

Streaming + map + shuffle·python
from datasets import load_dataset

ds = load_dataset(
    "HuggingFaceFW/fineweb",
    name="sample-10BT",
    streaming=True,
    split="train",
)

# Filter, then map, then shuffle (with a buffer)
ds = ds.filter(lambda ex: len(ex["text"]) > 500)
ds = ds.map(lambda ex: {"upper_first_word": ex["text"].split(" ")[0].upper()})
ds = ds.shuffle(buffer_size=10000, seed=42)

for i, ex in enumerate(ds):
    if i >= 3: break
    print(ex["upper_first_word"], ex["text"][:80])
PyTorch DataLoader 용 streaming 데이터셋 wrap·python
from datasets import load_dataset
from torch.utils.data import DataLoader

ds = load_dataset("HuggingFaceFW/fineweb", name="sample-10BT", streaming=True, split="train")
ds = ds.with_format("torch")

loader = DataLoader(ds, batch_size=4, num_workers=2)
for i, batch in enumerate(loader):
    if i >= 2: break
    print(type(batch), list(batch.keys()))

External links

Exercise

FineWeb sample-10BT 의 처음 1k 행 stream. 영어 같은 텍스트 (cheap heuristic — text.isascii() 비율) 만 keep 하는 filter, buffer_size=1000 shuffle. 전체 파이프라인 시간 측정. 풀 sample-10BT 다운로드 후 같은 거 오프라인 비교.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.