데이터 관리
데이터(data)는 연료입니다. 어떻게 관리하느냐가 얼마나 빠르게 갈 수 있는지를 결정합니다.
유형: Build
언어: Python
선수 지식: Phase 0, Lesson 01
예상 시간: 약 45분
학습 목표
- Hugging Face
datasets 라이브러리로 데이터셋(dataset)을 로드(load), 스트리밍(stream), 캐시(cache)합니다.
- CSV, JSON, Parquet, Arrow 형식 사이를 변환하고 절충(tradeoff)을 설명합니다.
- 고정된 무작위 시드(fixed random seed)로 재현 가능한 훈련/검증/테스트 분할(train/validation/test split)을 만듭니다.
.gitignore, Git LFS, DVC를 사용해 큰 모델 파일과 데이터셋 파일을 관리합니다.
문제
모든 AI 프로젝트는 데이터에서 시작합니다. 데이터셋을 찾고, 다운로드하고, 형식을 바꾸고, 훈련/평가(training/evaluation)를 위해 분할하고, 실험이 재현되도록 버전을 관리해야 합니다. 이 작업을 매번 손으로 하면 느리고 실수하기 쉽습니다. 반복 가능한 워크플로우가 필요합니다.
PAI OJT에서는 데이터를 "받아서 쓰는 파일"이 아니라 재현 가능한 실험의 입력으로 봅니다. 같은 코드라도 데이터 분할과 버전이 달라지면 결과가 달라집니다.
개념
graph TD
A["Hugging Face Hub"] --> B["datasets library"]
B --> C["Load / Stream"]
C --> D["Local Cache<br>~/.cache/huggingface/"]
B --> E["Format Conversion<br>CSV, JSON, Parquet, Arrow"]
E --> F["Data Split<br>train / val / test"]
F --> G["Training Pipeline"]
Hugging Face datasets 라이브러리는 AI 작업에서 데이터를 로드하는 표준적인 방법입니다. 다운로드, 캐싱(caching), 형식 변환(format conversion), 스트리밍을 기본으로 제공합니다.
직접 만들기
Step 1: datasets 라이브러리 설치
PAI Python 환경에서는 uv를 사용합니다.
uv pip install datasets huggingface_hub
Step 2: 데이터셋 로드
from datasets import load_dataset
dataset = load_dataset("imdb")
print(dataset)
print(dataset["train"][0])
이 코드는 IMDB 영화 리뷰 데이터셋을 다운로드합니다. 첫 다운로드 이후에는 ~/.cache/huggingface/datasets/ 캐시에서 로드됩니다.
Step 3: 큰 데이터셋 스트리밍
일부 데이터셋은 디스크에 모두 받기에는 너무 큽니다. 스트리밍은 전체를 다운로드하지 않고 행(row) 단위로 읽습니다.
dataset = load_dataset("wikipedia", "20220301.en", split="train", streaming=True)
for i, example in enumerate(dataset):
print(example["title"])
if i >= 4:
break
스트리밍은 IterableDataset을 반환합니다. 행이 도착하는 대로 처리하므로 데이터셋 크기와 관계없이 메모리 사용량(memory usage)이 일정하게 유지됩니다.
Step 4: 데이터셋 형식
datasets 라이브러리는 내부적으로 Apache Arrow를 사용합니다. 파이프라인(pipeline) 요구에 맞게 다른 형식으로 변환할 수 있습니다.
dataset = load_dataset("imdb", split="train")
dataset.to_csv("imdb_train.csv")
dataset.to_json("imdb_train.json")
dataset.to_parquet("imdb_train.parquet")
형식 비교입니다.
| 형식 | 크기 | 읽기 속도 | 적합한 용도 |
|---|
| CSV | 큼 | 느림 | 사람이 읽기, 스프레드시트 |
| JSON | 큼 | 느림 | API, 중첩 데이터(nested data) |
| Parquet | 작음 | 빠름 | 분석(analytics), 열 기반 쿼리(columnar query) |
| Arrow | 작음 | 가장 빠름 | 인메모리 처리(in-memory processing) (datasets 내부 형식) |
AI 작업에서는 Parquet이 저장 형식으로 좋습니다. Arrow는 메모리 안에서 작업할 때 쓰는 형식입니다. CSV와 JSON은 데이터 교환(interchange)에 적합합니다.
Step 5: 데이터 분할
모든 ML 프로젝트에는 세 가지 분할이 필요합니다.
- 훈련(Train): 모델이 학습하는 데이터입니다. 보통 80%입니다.
- 검증(Validation): 훈련 중 진행 상황(progress)을 확인합니다. 보통 10%입니다.
- 테스트(Test): 훈련이 끝난 뒤 최종 평가에만 사용합니다. 보통 10%입니다.
미리 분할된 데이터셋(pre-split dataset)도 있지만, 직접 나눠야 할 때도 있습니다.
dataset = load_dataset("imdb", split="train")
split = dataset.train_test_split(test_size=0.2, seed=42)
train_val = split["train"].train_test_split(test_size=0.125, seed=42)
train_ds = train_val["train"]
val_ds = train_val["test"]
test_ds = split["test"]
print(f"Train: {len(train_ds)}, Val: {len(val_ds)}, Test: {len(test_ds)}")
재현성을 위해 시드(seed)를 항상 고정합니다. 같은 시드는 같은 분할을 만듭니다.
Step 6: 모델 다운로드와 캐시
모델은 큰 파일입니다. huggingface_hub 라이브러리는 다운로드와 캐시를 처리합니다.
from huggingface_hub import hf_hub_download, snapshot_download
model_path = hf_hub_download(
repo_id="sentence-transformers/all-MiniLM-L6-v2",
filename="config.json",
)
print(f"캐시 위치: {model_path}")
model_dir = snapshot_download("sentence-transformers/all-MiniLM-L6-v2")
print(f"전체 모델 위치: {model_dir}")
모델은 ~/.cache/huggingface/hub/에 캐시됩니다. 한 번 받은 모델은 다음 실행에서 바로 로드됩니다.
Step 7: 큰 파일 다루기
모델 가중치(model weight)와 큰 데이터셋은 Git에 직접 넣지 않습니다. 선택지는 세 가지입니다.
선택지 A: .gitignore (가장 단순)
*.bin
*.safetensors
*.pt
*.onnx
data/*.parquet
data/*.csv
models/
선택지 B: Git LFS (대용량 파일을 Git에서 추적)
git lfs install
git lfs track "*.bin"
git lfs track "*.safetensors"
git add .gitattributes
Git LFS는 저장소에는 포인터(pointer)를 저장하고 실제 파일은 별도 서버에 저장합니다.
선택지 C: DVC (데이터 버전 관리)
uv pip install dvc
dvc init
dvc add data/training_set.parquet
git add data/training_set.parquet.dvc data/.gitignore
git commit -m "feat: 학습 데이터 DVC 추적 추가"
DVC는 작은 .dvc 파일을 만들고, 실제 데이터는 S3, GCS 같은 원격 저장소(remote storage)에 둡니다.
| 접근법 | 복잡도 | 적합한 용도 |
|---|
| .gitignore | 낮음 | 개인 프로젝트, 다시 받을 수 있는 데이터 |
| Git LFS | 중간 | 팀이 모델 가중치를 Git 워크플로우로 공유 |
| DVC | 높음 | 컴퓨터 간 정확한 실험 재현(exact experiment reproduction), 대용량 데이터셋 |
이 과정에서는 .gitignore면 충분합니다. 정확한 실험을 여러 컴퓨터에서 재현해야 할 때 DVC를 검토합니다.
Step 8: 저장소 패턴
로컬 저장소(local storage)는 10 GB 이하 데이터셋에 적합합니다. Hugging Face 캐시가 자동으로 처리합니다.
클라우드 저장소(cloud storage)는 더 크거나 여러 컴퓨터가 공유해야 하는 데이터에 적합합니다.
import os
local_path = os.path.expanduser("~/.cache/huggingface/datasets/")
DVC는 S3와 GCS 원격 저장소와 직접 연동됩니다.
dvc remote add -d myremote s3://my-bucket/dvc-store
dvc push
이 과정에서는 로컬 저장소로 충분합니다. 클라우드 저장소는 원격 GPU 인스턴스에서 파인튜닝(fine-tuning)을 할 때 중요해집니다.
이 과정에서 사용하는 데이터셋
| 데이터셋 | 강의 | 크기 | 학습 내용 |
|---|
| IMDB | 토큰화(Tokenization), 분류 | 84 MB | 텍스트 분류 기본 |
| WikiText | 언어 모델링(Language modeling) | 181 MB | 다음 토큰 예측(next-token prediction) |
| SQuAD | QA 시스템 | 35 MB | 질문 답변(question answering), 구간(span) |
| Common Crawl (subset) | 임베딩(Embeddings) | 다양함 | 대규모 텍스트 처리(large-scale text processing) |
| MNIST | 비전 기본 | 21 MB | 이미지 분류 기초 |
| COCO (subset) | 멀티모달(Multimodal) | 다양함 | 이미지-텍스트 쌍 |
지금 모두 다운로드할 필요는 없습니다. 각 강의가 필요한 데이터셋을 안내합니다.
사용해보기
유틸리티 스크립트(utility script)를 실행해 데이터 워크플로우가 동작하는지 확인합니다.
python phases/00-setup-and-tooling/09-data-management/code/data_utils.py
이 스크립트는 작은 데이터셋을 다운로드하고, 형식을 변환하고, 분할을 만들고, 요약(summary)을 출력합니다.
산출물 만들기
이 강의는 아래 산출물을 제공합니다.
code/data_utils.py: 재사용 가능한 데이터 로딩과 캐싱 유틸리티(reusable data loading and caching utility)
outputs/prompt-data-helper.md: 작업(task)에 맞는 데이터셋을 찾는 프롬프트
연습문제
glue 데이터셋의 mrpc 설정(config)을 로드하고 처음 5개 예시(example)를 확인합니다.
c4 데이터셋을 스트리밍 모드(streaming mode)로 읽고 10초 동안 몇 개 예시를 처리할 수 있는지 셉니다.
- 데이터셋을 Parquet으로 변환하고 CSV와 파일 크기를 비교합니다.
- 고정 시드로 70/15/15 훈련/검증/테스트 분할을 만들고 크기가 맞는지 확인합니다.
핵심 용어
| 용어 | 흔한 설명 | 실제 의미 |
|---|
| 데이터 분할(Dataset split) | 훈련 데이터 | ML 수명 주기(lifecycle) 단계별로 쓰는 명명된 부분집합(named subset) |
| 스트리밍(Streaming) | 지연 로드(lazy load) | 전체 데이터셋을 받지 않고 원격 소스에서 행 단위로 처리하는 방식 |
| Parquet | 압축된 CSV | 열 기반 저장 형식(columnar storage format)으로 크기와 읽기 속도에 강점이 있다 |
| Arrow | 빠른 데이터프레임 | datasets가 영복사 읽기(zero-copy read)를 위해 내부적으로 쓰는 인메모리 열 기반 형식(in-memory columnar format) |
| Git LFS | 큰 파일을 위한 Git | 대용량 파일은 저장소 밖에 저장하고 포인터만 버전 관리하는 Git 확장 |
| DVC(Data Version Control) | 데이터를 위한 Git | 데이터셋/모델 버전을 관리하고 클라우드 저장소와 연결하는 도구 |
| 캐시(Cache) | 이미 받은 것 | 이미 받은 데이터의 로컬 사본(local copy)이며 기본적으로 ~/.cache/huggingface/에 저장된다 |
더 읽을거리