데이터 관리

데이터(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에서는 데이터를 "받아서 쓰는 파일"이 아니라 재현 가능한 실험의 입력으로 봅니다. 같은 코드라도 데이터 분할과 버전이 달라지면 결과가 달라집니다.

사전 테스트

2문제 · 이 강의를 시작하기 전에 얼마나 알고 있는지 확인해보세요

1.머신러닝(machine learning)에서 훈련/검증/테스트 분할을 분리하는 것이 중요한 이유는 무엇인가요?

2.AI/ML 워크플로우에서 Hugging Face Hub는 주로 무엇에 사용되나요?

0/2 답변 완료

개념

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/")

# s3_path = "s3://my-bucket/datasets/"
# gcs_path = "gs://my-bucket/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)
SQuADQA 시스템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)에 맞는 데이터셋을 찾는 프롬프트

연습문제

  1. glue 데이터셋의 mrpc 설정(config)을 로드하고 처음 5개 예시(example)를 확인합니다.
  2. c4 데이터셋을 스트리밍 모드(streaming mode)로 읽고 10초 동안 몇 개 예시를 처리할 수 있는지 셉니다.
  3. 데이터셋을 Parquet으로 변환하고 CSV와 파일 크기를 비교합니다.
  4. 고정 시드로 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/에 저장된다

더 읽을거리

실습 코드

이 강의의 실습 코드 1개

data utils
Code

산출물

이 강의에서 생성된 프롬프트, 스킬, 코드 산출물 1개

prompt-data-helper

Find and load the right dataset for an AI/ML task

Prompt

확인 문제

3문제 · 모두 맞추면 완료 표시가 가능합니다

1.ML 데이터셋 저장에서 Parquet 형식이 CSV보다 갖는 장점은 무엇인가요?

2.Hugging Face datasets 라이브러리에서 데이터셋을 로드할 때 `streaming=True`는 무엇을 하나요?

3.큰 파일에 대해 `.gitignore`만 쓰는 대신 DVC(Data Version Control)를 사용해야 하는 때는 언제인가요?

0/3 답변 완료