NeMo Curator - LLM용 GPU 데이터 큐레이션 치트시트
NVIDIA NeMo Curator는 LLM을 사전 학습 또는 미세 조정하기 위한 대규모 고품질 데이터셋을 준비하기 위한 오픈소스 GPU 가속 데이터 큐레이션 도구킷입니다. 데이터를 다운로드하고 추출하며, 텍스트를 정제하고 정규화하며, 언어를 식별하고, 품질로 필터링하고, 도메인/독성을 분류하며, 개인정보 필터를 적용하고, 중복 제거(정확 및 퍼지)하는 반복 가능한 파이프라인을 구축합니다. RAPIDS/cuDF 및 Ray를 통해 노트북에서 수천 개 GPU로 확장됩니다. 26.x 릴리스부터 Ray 기반 파이프라인 아키텍처를 텍스트, 이미지, 비디오, 오디오 전체에 사용합니다.
큐레이션 품질이 모델 품질을 결정합니다. 일반적으로 비용이 많이 들고 영향이 큰 단계는 중복 제거입니다. NeMo Curator의 GPU 중복 제거가 주요 장점입니다.
설치
| 방법 | 명령어 |
|---|
| pip (CPU 모듈) | pip install nemo-curator |
| CUDA extras 포함 pip | pip install "nemo-curator[cuda12x]" |
| Container | NVIDIA의 NeMo/Curator 컨테이너 이미지 사용 |
| 요구 사항 | 가속 모듈용 NVIDIA GPU(s) + CUDA; 분산용 Ray |
파이프라인 개념
| 개념 | 의미 |
|---|
DocumentDataset | 데이터셋 추상화 (Dask/cuDF 지원) |
| Module | 큐레이션 단계 (필터, 중복 제거, 분류자, …) |
| Pipeline | 반복 가능한 흐름을 형성하는 순서 있는 모듈 |
| Backend | CPU (pandas) 또는 GPU (cuDF/RAPIDS) 실행 |
| Ray runtime | 코어/GPU/노드 전체에서 작업 분배 |
핵심 모듈
| 단계 | 모듈 |
|---|
| Download/extract | Common Crawl, arXiv, Wikipedia 다운로더; 텍스트 추출 |
| Language ID | fastText 기반 언어 식별 |
| Cleaning | Unicode 수정, 보일러플레이트/URL 제거, 재포장 |
| Quality filtering | 휴리스틱 필터 + 분류자 기반 품질 점수 |
| Classification | 도메인 및 독성 분류자 |
| PII / privacy | 개인 데이터 감지 및 수정 |
| Deduplication | GPU의 정확 (해시) 및 퍼지 (MinHash/LSH) 중복 제거 |
품질 필터링 (스케치)
from nemo_curator import ScoreFilter
from nemo_curator.filters import WordCountFilter
from nemo_curator.datasets import DocumentDataset
dataset = DocumentDataset.read_json("input/*.jsonl", backend="cudf")
filter_step = ScoreFilter(
WordCountFilter(min_words=50, max_words=100000),
text_field="text",
)
clean = filter_step(dataset)
clean.to_json("filtered/", write_to_filename=True)
중복 제거 (스케치)
from nemo_curator import FuzzyDuplicates, FuzzyDuplicatesConfig
config = FuzzyDuplicatesConfig(
cache_dir="./cache",
num_buckets=20,
hashes_per_bucket=13, # MinHash/LSH 파라미터
)
fuzzy = FuzzyDuplicates(config=config)
duplicates = fuzzy(dataset) # GPU 가속 근처 중복 감지
deduped = dataset.df[~dataset.df["id"].isin(duplicates.df["id"])]
| 중복 제거 타입 | 방법 |
|---|
| Exact | 문서 해싱 |
| Fuzzy | MinHash + LSH (RAPIDS를 통한 GPU) |
| Semantic | 임베딩 기반 근처 중복 제거 |
분류자 & 필터링
| 분류자 | 플래그 |
|---|
| Domain | 혼합 제어를 위한 주제/도메인 레이블 |
| Quality | 높음/낮음 품질 점수 |
| Toxicity | 제거용 안전하지 않은 콘텐츠 |
| Language | 언어로 유지/삭제 |
스케일링
| 메커니즘 | 참고 |
|---|
| GPU (cuDF/RAPIDS) | 필터링 및 중복 제거 가속 |
| Ray runtime | GPU 및 노드 간 분배 |
| Dask | 거대한 코퍼스를 위한 코어 외 처리 |
| Checkpointing | 긴 큐레이션 실행 재개 |
일반적인 워크플로우
# 반복 가능한 사전 학습 큐레이션: 정제 → 품질 필터 → 중복 제거
from nemo_curator.datasets import DocumentDataset
ds = DocumentDataset.read_json("raw/*.jsonl", backend="cudf")
# 1) 언어 ID + 정제 2) 품질 ScoreFilter 3) FuzzyDuplicates
# 학습용 큐레이션, 중복 제거된 코퍼스 작성
NeMo Curator vs DataTrove
| 측면 | NeMo Curator | DataTrove |
|---|
| 가속 | GPU 네이티브 (RAPIDS) | CPU 우선 |
| 최적 | 중복 제거 집약적, 새로운 대규모 실행 (10T+ 토큰) | FineWeb 스타일 파이프라인 재현 |
| 분산 | Ray | Local/Slurm/Ray executors |
| Modalities | 텍스트, 이미지, 비디오, 오디오 | 텍스트 중심 |
리소스