SKILL.md
SKILL.mdBrowse 3 files
2,794 tokens
10,387 bytes
Token encoding: o200k_base
Snapshot 24fd22b
1---2name: nemo-curator3description: "Curate LLM training data: dedupe, filter, PII redaction."4version: 1.0.15author: Orchestra Research6license: MIT7dependencies: [nemo-curator, cudf, dask, rapids]8platforms: [linux, macos]9metadata:10 hermes:11 tags: [Data Processing, NeMo Curator, Data Curation, GPU Acceleration, Deduplication, Quality Filtering, NVIDIA, RAPIDS, PII Redaction, Multimodal, LLM Training Data]12 13---14 15# NeMo Curator - GPU-Accelerated Data Curation16 17NVIDIA's toolkit for preparing high-quality training data for LLMs.18 19## When to use NeMo Curator20 21**Use NeMo Curator when:**22- Preparing LLM training data from web scrapes (Common Crawl)23- Need fast deduplication (16× faster than CPU)24- Curating multi-modal datasets (text, images, video, audio)25- Filtering low-quality or toxic content26- Scaling data processing across GPU cluster27 28**Performance**:29- **16× faster** fuzzy deduplication (8TB RedPajama v2)30- **40% lower TCO** vs CPU alternatives31- **Near-linear scaling** across GPU nodes32 33**Use alternatives instead**:34- **datatrove**: CPU-based, open-source data processing35- **dolma**: Allen AI's data toolkit36- **Ray Data**: General ML data processing (no curation focus)37 38## Quick start39 40### Installation41 42```bash43# NeMo Curator 1.x installs with uv. Extras use hyphens (PyPI-normalized):44# text-cuda12 / text-cpu (and image/video/audio/math variants), or `all`.45 46# Text curation (CUDA 12)47uv pip install "nemo-curator[text-cuda12]"48 49# All modalities50uv pip install "nemo-curator[all]"51 52# CPU-only text (slower)53uv pip install "nemo-curator[text-cpu]"54```55 56### Basic text curation pipeline57 58> **Major version rewrite (1.x):** NeMo Curator was rewritten around a **Ray-based59> pipeline/stage architecture**. The old `DocumentDataset` + `nemo_curator.modules.*` /60> `ScoreFilter` / `Modify` call-the-object-on-a-dataset API from 0.x is gone. In 1.x you61> compose `ProcessingStage`s into a `Pipeline` and run it with an executor. The exact62> stage/import surface differs per modality — treat the examples in this skill below as63> **conceptual** (0.x-style) and follow the current64> [quickstart](https://github.com/NVIDIA-NeMo/Curator/blob/main/tutorials/quickstart.py)65> and [text guide](https://docs.nvidia.com/nemo/curator/latest/get-started/text) for the66> exact 1.x APIs rather than copying imports verbatim.67 68Shape of a 1.x pipeline (from the upstream quickstart):69 70```python71from nemo_curator.pipeline import Pipeline72from nemo_curator.stages.base import ProcessingStage73from nemo_curator.stages.resources import Resources74from nemo_curator.backends.xenna import XennaExecutor75from nemo_curator.core.client import RayClient76 77# 1. Define/compose stages (load -> filter -> dedupe -> classify -> write).78# Each stage declares its own Resources (CPU cores, GPU memory, replicas).79pipeline = Pipeline(name="curation", stages=[...])80 81# 2. Run it with an executor (Ray-backed).82client = RayClient()83client.start()84pipeline.run(XennaExecutor())85client.stop()86```87 88The 0.x-style snippets in the sections that follow illustrate the *concepts* (quality89filtering, exact/fuzzy/semantic dedup, PII redaction, classifier filtering). For runnable901.x code, map each concept onto the corresponding stage from the modality guide.91 92## Data curation pipeline93 94### Stage 1: Quality filtering95 96```python97from nemo_curator.filters import (98 WordCountFilter,99 RepeatedLinesFilter,100 UrlRatioFilter,101 NonAlphaNumericFilter102)103 104# Apply 30+ heuristic filters105from nemo_curator import ScoreFilter106 107# Word count filter108dataset = dataset.filter(WordCountFilter(min_words=50, max_words=100000))109 110# Remove repetitive content111dataset = dataset.filter(RepeatedLinesFilter(max_repeated_line_fraction=0.3))112 113# URL ratio filter114dataset = dataset.filter(UrlRatioFilter(max_url_ratio=0.2))115```116 117### Stage 2: Deduplication118 119**Exact deduplication**:120```python121from nemo_curator.modules import ExactDuplicates122 123# Remove exact duplicates124deduped = ExactDuplicates(id_field="id", text_field="text")(dataset)125```126 127**Fuzzy deduplication** (16× faster on GPU):128```python129from nemo_curator.modules import FuzzyDuplicates130 131# MinHash + LSH deduplication132fuzzy_dedup = FuzzyDuplicates(133 id_field="id",134 text_field="text",135 num_hashes=260, # MinHash parameters136 num_buckets=20,137 hash_method="md5"138)139 140deduped = fuzzy_dedup(dataset)141```142 143**Semantic deduplication**:144```python145from nemo_curator.modules import SemanticDuplicates146 147# Embedding-based deduplication148semantic_dedup = SemanticDuplicates(149 id_field="id",150 text_field="text",151 embedding_model="sentence-transformers/all-MiniLM-L6-v2",152 threshold=0.8 # Cosine similarity threshold153)154 155deduped = semantic_dedup(dataset)156```157 158### Stage 3: PII redaction159 160```python161from nemo_curator.modules import Modify162from nemo_curator.modifiers import PIIRedactor163 164# Redact personally identifiable information165pii_redactor = PIIRedactor(166 supported_entities=["EMAIL_ADDRESS", "PHONE_NUMBER", "PERSON", "LOCATION"],167 anonymize_action="replace" # or "redact"168)169 170redacted = Modify(pii_redactor)(dataset)171```172 173### Stage 4: Classifier filtering174 175```python176from nemo_curator.classifiers import QualityClassifier177 178# Quality classification179quality_clf = QualityClassifier(180 model_path="nvidia/quality-classifier-deberta",181 batch_size=256,182 device="cuda"183)184 185# Filter low-quality documents186high_quality = dataset.filter(lambda doc: quality_clf(doc["text"]) > 0.5)187```188 189## GPU acceleration190 191### GPU vs CPU performance192 193| Operation | CPU (16 cores) | GPU (A100) | Speedup |194|-----------|----------------|------------|---------|195| Fuzzy dedup (8TB) | 120 hours | 7.5 hours | 16× |196| Exact dedup (1TB) | 8 hours | 0.5 hours | 16× |197| Quality filtering | 2 hours | 0.2 hours | 10× |198 199### Multi-GPU scaling200 201```python202from nemo_curator import get_client203import dask_cuda204 205# Initialize GPU cluster206client = get_client(cluster_type="gpu", n_workers=8)207 208# Process with 8 GPUs209deduped = FuzzyDuplicates(...)(dataset)210```211 212## Multi-modal curation213 214### Image curation215 216```python217from nemo_curator.image import (218 AestheticFilter,219 NSFWFilter,220 CLIPEmbedder221)222 223# Aesthetic scoring224aesthetic_filter = AestheticFilter(threshold=5.0)225filtered_images = aesthetic_filter(image_dataset)226 227# NSFW detection228nsfw_filter = NSFWFilter(threshold=0.9)229safe_images = nsfw_filter(filtered_images)230 231# Generate CLIP embeddings232clip_embedder = CLIPEmbedder(model="openai/clip-vit-base-patch32")233image_embeddings = clip_embedder(safe_images)234```235 236### Video curation237 238```python239from nemo_curator.video import (240 SceneDetector,241 ClipExtractor,242 InternVideo2Embedder243)244 245# Detect scenes246scene_detector = SceneDetector(threshold=27.0)247scenes = scene_detector(video_dataset)248 249# Extract clips250clip_extractor = ClipExtractor(min_duration=2.0, max_duration=10.0)251clips = clip_extractor(scenes)252 253# Generate embeddings254video_embedder = InternVideo2Embedder()255video_embeddings = video_embedder(clips)256```257 258### Audio curation259 260```python261from nemo_curator.audio import (262 ASRInference,263 WERFilter,264 DurationFilter265)266 267# ASR transcription268asr = ASRInference(model="nvidia/stt_en_fastconformer_hybrid_large_pc")269transcribed = asr(audio_dataset)270 271# Filter by WER (word error rate)272wer_filter = WERFilter(max_wer=0.3)273high_quality_audio = wer_filter(transcribed)274 275# Duration filtering276duration_filter = DurationFilter(min_duration=1.0, max_duration=30.0)277filtered_audio = duration_filter(high_quality_audio)278```279 280## Common patterns281 282### Web scrape curation (Common Crawl)283 284```python285from nemo_curator import ScoreFilter, Modify286from nemo_curator.filters import *287from nemo_curator.modules import *288from nemo_curator.datasets import DocumentDataset289 290# Load Common Crawl data291dataset = DocumentDataset.read_parquet("common_crawl/*.parquet")292 293# Pipeline294pipeline = [295 # 1. Quality filtering296 WordCountFilter(min_words=100, max_words=50000),297 RepeatedLinesFilter(max_repeated_line_fraction=0.2),298 SymbolToWordRatioFilter(max_symbol_to_word_ratio=0.3),299 UrlRatioFilter(max_url_ratio=0.3),300 301 # 2. Language filtering302 LanguageIdentificationFilter(target_languages=["en"]),303 304 # 3. Deduplication305 ExactDuplicates(id_field="id", text_field="text"),306 FuzzyDuplicates(id_field="id", text_field="text", num_hashes=260),307 308 # 4. PII redaction309 PIIRedactor(),310 311 # 5. NSFW filtering312 NSFWClassifier(threshold=0.8)313]314 315# Execute316for stage in pipeline:317 dataset = stage(dataset)318 319# Save320dataset.to_parquet("curated_common_crawl/")321```322 323### Distributed processing324 325```python326from nemo_curator import get_client327from dask_cuda import LocalCUDACluster328 329# Multi-GPU cluster330cluster = LocalCUDACluster(n_workers=8)331client = get_client(cluster=cluster)332 333# Process large dataset334dataset = DocumentDataset.read_parquet("s3://large_dataset/*.parquet")335deduped = FuzzyDuplicates(...)(dataset)336 337# Cleanup338client.close()339cluster.close()340```341 342## Performance benchmarks343 344### Fuzzy deduplication (8TB RedPajama v2)345 346- **CPU (256 cores)**: 120 hours347- **GPU (8× A100)**: 7.5 hours348- **Speedup**: 16×349 350### Exact deduplication (1TB)351 352- **CPU (64 cores)**: 8 hours353- **GPU (4× A100)**: 0.5 hours354- **Speedup**: 16×355 356### Quality filtering (100GB)357 358- **CPU (32 cores)**: 2 hours359- **GPU (2× A100)**: 0.2 hours360- **Speedup**: 10×361 362## Cost comparison363 364**CPU-based curation** (AWS c5.18xlarge × 10):365- Cost: $3.60/hour × 10 = $36/hour366- Time for 8TB: 120 hours367- **Total**: $4,320368 369**GPU-based curation** (AWS p4d.24xlarge × 2):370- Cost: $32.77/hour × 2 = $65.54/hour371- Time for 8TB: 7.5 hours372- **Total**: $491.55373 374**Savings**: 89% reduction ($3,828 saved)375 376## Supported data formats377 378- **Input**: Parquet, JSONL, CSV379- **Output**: Parquet (recommended), JSONL380- **WebDataset**: TAR archives for multi-modal381 382## Use cases383 384**Production deployments**:385- NVIDIA used NeMo Curator to prepare Nemotron-4 training data386- Open-source datasets curated: RedPajama v2, The Pile387 388## References389 390- **[Filtering Guide](references/filtering.md)** - 30+ quality filters, heuristics391- **[Deduplication Guide](references/deduplication.md)** - Exact, fuzzy, semantic methods392 393## Resources394 395- **GitHub**: https://github.com/NVIDIA-NeMo/Curator396- **Docs**: https://docs.nvidia.com/nemo/curator/latest/397- **Version**: 1.2.0 (1.x is a Ray-based pipeline rewrite — see the quickstart before copying 0.x snippets)398- **License**: Apache 2.0399 400 401 402 Discovery context
Discovered by repository scan. No exact path reference found in the snapshot’s root AGENTS.md.