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

Hugging Face 데이터셋

~12 min · huggingface, datasets, arrow, streaming

Level 0텐서 탐구자
0 XP0/62 lessons0/13 achievements
0/120 XP to next level120 XP to go0% complete

하나의 라이브러리로 수많은 데이터셋을 다뤄

Hugging Face의 datasets 라이브러리는 Hub의 데이터셋과 여러 형식의 로컬 데이터를 같은 API로 다룰 수 있게 해. 특히 두 가지 특징이 돋보여:

  • Apache Arrow 기반 저장 방식: 디스크의 데이터셋을 메모리에 매핑해. 100GB 데이터셋도 불러오는 데 RAM을 거의 쓰지 않고, 실제로 순회하는 부분만 읽어.
  • 스트리밍 모드: 통째로 내려받기 어려운 큰 데이터셋은 streaming=True로 설정해 전체 파일을 다운로드하지 않고 바로 순회할 수 있어.

표준 작업 흐름

  1. load_dataset("name"): 데이터셋을 가져와 캐시하거나 스트리밍해.
  2. .map(fn, batched=True): 전처리를 병렬로 적용하고 결과를 디스크에 캐시해.
  3. .set_format("torch", columns=[...]): 순회할 때 수동 변환 없이 PyTorch 텐서를 직접 반환하게 해.
  4. 일반 데이터셋처럼 DataLoader에 넘겨.

직접 만든 데이터에도 유용한 이유

로컬 데이터에서도 이 라이브러리는 디스크 캐시를 이용한 병렬 전처리, CSV·JSON·Parquet·Arrow 사이의 손실 없는 형식 변환, 간단한 학습·검증·테스트 분할 관리를 제공해. 적당한 규모의 NLP나 비전 프로젝트에서 데이터 계층으로 사용할 가치가 충분해.

Code

Hub에서 로드·python
# pip install datasets
from datasets import load_dataset

# Load IMDB sentiment dataset
ds = load_dataset("imdb")
print(ds)
# DatasetDict({
#     train: Dataset({features: ['text', 'label'], num_rows: 25000})
#     test:  Dataset({features: ['text', 'label'], num_rows: 25000})
# })

train = ds['train']
print(train[0])    # {'text': '...', 'label': 1}
.map 전처리: 병렬 처리와 캐시·python
from datasets import load_dataset
from transformers import AutoTokenizer

ds = load_dataset("imdb")
tok = AutoTokenizer.from_pretrained("distilbert-base-uncased")

def encode(batch):
    return tok(batch['text'], padding='max_length', truncation=True, max_length=512)

# .map runs in parallel by default; result is cached to disk
ds_enc = ds.map(encode, batched=True, num_proc=4)

# Tell datasets to return PyTorch tensors when iterated
ds_enc = ds_enc.with_format('torch', columns=['input_ids', 'attention_mask', 'label'])

print(ds_enc['train'][0])
# {'input_ids': tensor([...]), 'attention_mask': tensor([...]), 'label': tensor(1)}
거대 데이터셋의 스트리밍·python
from datasets import load_dataset

# C4 is hundreds of GB. Stream it instead of downloading.
ds = load_dataset("c4", "en", split="train", streaming=True)

# Iterate without downloading the whole thing
for i, ex in enumerate(ds):
    if i >= 3: break
    print(ex['text'][:80])

# Streaming datasets are IterableDatasets — wrap with DataLoader
from torch.utils.data import DataLoader
loader = DataLoader(ds.with_format('torch'), batch_size=8)
파일 로드·python
from datasets import load_dataset

# CSV
csv_ds = load_dataset("csv", data_files="my_data.csv")

# Parquet — fast columnar format, good for large tabular data
pq_ds = load_dataset("parquet", data_files="my_data.parquet")

# JSON Lines
jsonl_ds = load_dataset("json", data_files="my_data.jsonl")

# Even your own image folder, in ImageFolder layout
img_ds = load_dataset("imagefolder", data_dir="./images")

External links

Exercise

Hugging Face 데이터셋을 하나 불러와 봐. 작은 NLP 데이터로는 'rotten_tomatoes'가 좋아. distilbert 토크나이저를 .map으로 적용하고 DataLoader로 감싼 뒤 배치 하나를 꺼내. input_ids와 attention_mask가 (배치, seq_len) 모양의 텐서로 반환되는지 검증해.

Progress

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

댓글 0

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

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