mcpField
N
nemo-curator

nemo-curator

github.com/davila7数据与数据库33.0k336 次安装今天更新
代码仓库

关于 nemo-curator

NeMo Curator 是 NVIDIA 用于准备和整理 LLM 训练数据的工具包,面向处理文本及多模态数据的数据团队,提供过滤、去重和 GPU 加速的分布式处理。

主要功能

  1. 01启发式与分类器质量过滤
  2. 02精确、模糊和语义去重
  3. 03PII 检测与脱敏
  4. 04文本、图像、视频和音频整理
  5. 05GPU 与多 GPU 处理

适用场景

  1. 01准备网页抓取数据用于 LLM 训练
  2. 02清除重复或低质量内容
  3. 03脱敏数据集中的个人信息
  4. 04整理图像、视频和音频数据

安装

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

$npx skills add https://github.com/davila7/claude-code-templates --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