mcpField
N
nemo-curator

nemo-curator

github.com/kalarislabs其他7342 次安装4 天前更新
代码仓库

关于 nemo-curator

NeMo Curator 是 NVIDIA 用于准备 LLM 训练数据的工具包,适合数据与机器学习团队。它可筛选、去重、脱敏和分类文本及多模态数据,并支持 GPU 与多 GPU 处理。

主要功能

  1. 01启发式与分类器质量筛选
  2. 02精确、模糊及语义去重
  3. 03个人信息脱敏
  4. 04文本、图像、视频和音频整理
  5. 05分布式 GPU 处理

适用场景

  1. 01清理 Common Crawl 训练数据
  2. 02移除数据集中的重复文档
  3. 03训练前脱敏个人信息
  4. 04整理图像、视频和音频数据

安装

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

$npx skills add https://github.com/kalarislabs/research-agent-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)
  • 与 CPU 替代方案相比,TCO 低 40%
  • 在 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

参考资料

资源

Agent 操作流程

  1. 检查环境。 确认 GPU 内存、模型检查点和许可证、框架版本及输入格式。
  2. 明确输入。 根据数据或用户确认格式、标识符和参数。任何会影响结果的取值都应询问,不要猜测。
  3. 先运行小规模版本。 先以较低分辨率或较短长度对单个样本运行推理。
  4. 根据上述说明和参考资料执行完整任务。
  5. 验证结果。 通过定性方式和任务指标检查输出;检查生成内容的许可证限制。
  6. 报告。 说明运行了什么(版本、命令、参数)、检查了什么,以及还有哪些不确定之处。
如果出现这种情况请这样做
大型输入导致内存不足降低分辨率或序列长度、使用半精度,或对输入进行分块处理。
这些说明中的函数、标志或端点在已安装版本中不存在查阅已安装版本自身的文档(help()、--help、官方文档),调整操作,并告知用户。切勿编造 API。
必需的输入、标识符或参数含糊不清询问用户,或在运行前明确说明所作假设。

诚信守则

  • 切勿伪造结果、参数、标识符、引用或统计数据。如果无法运行或验证某项内容,请明确说明。
  • 商业用途或发布前,检查模型和数据集的许可证。
  • 此处与版本相关的细节可能已过时:请根据已安装版本的官方文档进行确认。
  • 在执行会产生费用、占用共享 GPU 或云配额、接触个人或患者数据,或无法撤销的操作前,请先征求同意。

相关技能

  • nemo-guardrails:使用 NVIDIA NeMo Guardrails 为 LLM 应用添加运行时安全护栏,并通过 Colang 2.0 工作流进行配置。
  • modal:Modal 是一个无服务器云平台,可按需运行 Python,包括按需使用 GPU。
  • exa-search:由 Exa 提供支持的网络工具包,专为科学和技术内容优化。

评论

支持 Markdown