mcpField
N
nemo-curator

nemo-curator

github.com/orchestra-research数据与数据库14.1k961 次安装19 周前更新
代码仓库

关于 nemo-curator

nemo-curator 是面向 LLM 训练数据准备人员的数据整理工具包,支持文本、图像、视频和音频处理。它提供质量过滤、去重和 PII 脱敏,并可利用 GPU 与多 GPU 集群处理数据。

主要功能

  1. 0130 多种启发式质量过滤器
  2. 02精确、模糊及语义去重
  3. 03PII 检测与脱敏
  4. 04文本、图像、视频和音频整理
  5. 05GPU 与多 GPU 分布式处理
  6. 06支持 Parquet、JSONL 和 CSV

适用场景

  1. 01整理 Common Crawl 网页数据
  2. 02去除训练语料中的重复内容
  3. 03过滤低质量或有害文本
  4. 04构建多模态训练数据集

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/orchestra-research/ai-research-skills --skill nemo-curator

安装后在 Claude Code 中输入/nemo-curator确认已加载。

附带文件references/deduplication.mdreferences/filtering.md

详细介绍

NeMo Curator - GPU 加速数据整理

NVIDIA 用于准备高质量大模型训练数据的工具包。

何时使用 NeMo Curator

在以下情况下使用 NeMo Curator:

  • 从网络抓取数据(Common Crawl)中准备大模型训练数据
  • 需要快速去重(比 CPU 快 16×)
  • 整理多模态数据集(文本、图像、视频、音频)
  • 过滤低质量或有毒内容
  • 在 GPU 集群上扩展数据处理规模

性能:

  • 模糊去重快 16×(8TB RedPajama v2)
  • 总拥有成本降低 40%,相比 CPU 替代方案
  • 近线性扩展,适用于多个 GPU 节点

也可使用以下替代方案:

  • datatrove:基于 CPU 的开源数据处理工具
  • dolma:Allen AI 的数据工具包
  • Ray Data:通用机器学习数据处理(不专注于数据整理)

快速入门

安装
# Text curation (CUDA 12)
uv pip install "nemo-curator[text_cuda12]"

# All modalities
uv pip install "nemo-curator[all_cuda12]"

# CPU-only (slower)
uv pip install "nemo-curator[cpu]"
基础文本整理流水线
from nemo_curator import ScoreFilter, Modify
from nemo_curator.datasets import DocumentDataset
import pandas as pd

# Load data
df = pd.DataFrame({"text": ["Good document", "Bad doc", "Excellent text"]})
dataset = DocumentDataset(df)

# Quality filtering
def quality_score(doc):
    return len(doc["text"].split()) > 5  # Filter short docs

filtered = ScoreFilter(quality_score)(dataset)

# Deduplication
from nemo_curator.modules import ExactDuplicates
deduped = ExactDuplicates()(filtered)

# Save
deduped.to_parquet("curated_data/")

数据整理流水线

阶段 1:质量过滤
from nemo_curator.filters import (
    WordCountFilter,
    RepeatedLinesFilter,
    UrlRatioFilter,
    NonAlphaNumericFilter
)

# Apply 30+ heuristic filters
from nemo_curator import ScoreFilter

# Word count filter
dataset = dataset.filter(WordCountFilter(min_words=50, max_words=100000))

# Remove repetitive content
dataset = dataset.filter(RepeatedLinesFilter(max_repeated_line_fraction=0.3))

# URL ratio filter
dataset = dataset.filter(UrlRatioFilter(max_url_ratio=0.2))
阶段 2:去重

精确去重:

from nemo_curator.modules import ExactDuplicates

# Remove exact duplicates
deduped = ExactDuplicates(id_field="id", text_field="text")(dataset)

模糊去重(GPU 上快 16×):

from nemo_curator.modules import FuzzyDuplicates

# MinHash + LSH deduplication
fuzzy_dedup = FuzzyDuplicates(
    id_field="id",
    text_field="text",
    num_hashes=260,      # MinHash parameters
    num_buckets=20,
    hash_method="md5"
)

deduped = fuzzy_dedup(dataset)

语义去重:

from nemo_curator.modules import SemanticDuplicates

# Embedding-based deduplication
semantic_dedup = SemanticDuplicates(
    id_field="id",
    text_field="text",
    embedding_model="sentence-transformers/all-MiniLM-L6-v2",
    threshold=0.8  # Cosine similarity threshold
)

deduped = semantic_dedup(dataset)
阶段 3:PII 脱敏
from nemo_curator.modules import Modify
from nemo_curator.modifiers import PIIRedactor

# Redact personally identifiable information
pii_redactor = PIIRedactor(
    supported_entities=["EMAIL_ADDRESS", "PHONE_NUMBER", "PERSON", "LOCATION"],
    anonymize_action="replace"  # or "redact"
)

redacted = Modify(pii_redactor)(dataset)
阶段 4:分类器过滤
from nemo_curator.classifiers import QualityClassifier

# Quality classification
quality_clf = QualityClassifier(
    model_path="nvidia/quality-classifier-deberta",
    batch_size=256,
    device="cuda"
)

# Filter low-quality documents
high_quality = dataset.filter(lambda doc: quality_clf(doc["text"]) > 0.5)

GPU 加速

GPU 与 CPU 性能对比
操作CPU(16 核)GPU(A100)加速比
模糊去重(8TB)120 小时7.5 小时16×
精确去重(1TB)8 小时0.5 小时16×
质量过滤2 小时0.2 小时10×
多 GPU 扩展
from nemo_curator import get_client
import dask_cuda

# Initialize GPU cluster
client = get_client(cluster_type="gpu", n_workers=8)

# Process with 8 GPUs
deduped = FuzzyDuplicates(...)(dataset)

多模态数据整理

图像整理
from nemo_curator.image import (
    AestheticFilter,
    NSFWFilter,
    CLIPEmbedder
)

# Aesthetic scoring
aesthetic_filter = AestheticFilter(threshold=5.0)
filtered_images = aesthetic_filter(image_dataset)

# NSFW detection
nsfw_filter = NSFWFilter(threshold=0.9)
safe_images = nsfw_filter(filtered_images)

# Generate CLIP embeddings
clip_embedder = CLIPEmbedder(model="openai/clip-vit-base-patch32")
image_embeddings = clip_embedder(safe_images)
视频整理
from nemo_curator.video import (
    SceneDetector,
    ClipExtractor,
    InternVideo2Embedder
)

# Detect scenes
scene_detector = SceneDetector(threshold=27.0)
scenes = scene_detector(video_dataset)

# Extract clips
clip_extractor = ClipExtractor(min_duration=2.0, max_duration=10.0)
clips = clip_extractor(scenes)

# Generate embeddings
video_embedder = InternVideo2Embedder()
video_embeddings = video_embedder(clips)
音频整理
from nemo_curator.audio import (
    ASRInference,
    WERFilter,
    DurationFilter
)

# ASR transcription
asr = ASRInference(model="nvidia/stt_en_fastconformer_hybrid_large_pc")
transcribed = asr(audio_dataset)

# Filter by WER (word error rate)
wer_filter = WERFilter(max_wer=0.3)
high_quality_audio = wer_filter(transcribed)

# Duration filtering
duration_filter = DurationFilter(min_duration=1.0, max_duration=30.0)
filtered_audio = duration_filter(high_quality_audio)

常见模式

网络抓取数据整理(Common Crawl)
from nemo_curator import ScoreFilter, Modify
from nemo_curator.filters import *
from nemo_curator.modules import *
from nemo_curator.datasets import DocumentDataset

# Load Common Crawl data
dataset = DocumentDataset.read_parquet("common_crawl/*.parquet")

# Pipeline
pipeline = [
    # 1. Quality filtering
    WordCountFilter(min_words=100, max_words=50000),
    RepeatedLinesFilter(max_repeated_line_fraction=0.2),
    SymbolToWordRatioFilter(max_symbol_to_word_ratio=0.3),
    UrlRatioFilter(max_url_ratio=0.3),

    # 2. Language filtering
    LanguageIdentificationFilter(target_languages=["en"]),

    # 3. Deduplication
    ExactDuplicates(id_field="id", text_field="text"),
    FuzzyDuplicates(id_field="id", text_field="text", num_hashes=260),

    # 4. PII redaction
    PIIRedactor(),

    # 5. NSFW filtering
    NSFWClassifier(threshold=0.8)
]

# Execute
for stage in pipeline:
    dataset = stage(dataset)

# Save
dataset.to_parquet("curated_common_crawl/")
分布式处理
from nemo_curator import get_client
from dask_cuda import LocalCUDACluster

# Multi-GPU cluster
cluster = LocalCUDACluster(n_workers=8)
client = get_client(cluster=cluster)

# Process large dataset
dataset = DocumentDataset.read_parquet("s3://large_dataset/*.parquet")
deduped = FuzzyDuplicates(...)(dataset)

# Cleanup
client.close()
cluster.close()

性能基准测试

模糊去重(8TB RedPajama v2)
  • CPU(256 核):120 小时
  • GPU(8× A100):7.5 小时
  • 加速比:16×
精确去重(1TB)
  • CPU(64 核):8 小时
  • GPU(4× A100):0.5 小时
  • 加速比:16×
质量过滤(100GB)
  • CPU(32 核):2 小时
  • GPU(2× A100):0.2 小时
  • 加速比:10×

成本对比

基于 CPU 的数据整理(AWS c5.18xlarge × 10):

  • 成本:$3.60/小时 × 10 = $36/小时
  • 处理 8TB 所需时间:120 小时
  • 总计:$4,320

基于 GPU 的数据整理(AWS p4d.24xlarge × 2):

  • 成本:$32.77/小时 × 2 = $65.54/小时
  • 处理 8TB 所需时间:7.5 小时
  • 总计:$491.55

节省:成本降低 89%(节省 $3,828)

支持的数据格式

  • 输入:Parquet、JSONL、CSV
  • 输出:Parquet(推荐)、JSONL
  • WebDataset:用于多模态数据的 TAR 归档

使用场景

生产部署:

  • NVIDIA 使用 NeMo Curator 准备 Nemotron-4 训练数据
  • 已整理的开源数据集:RedPajama v2、The Pile

参考资料

资源

评论

支持 Markdown