跳到主要内容

Nemo Curator

用于大语言模型(LLM)训练的 GPU 加速数据整理工具。支持文本/图像/视频/音频。具备模糊去重(速度提升 16 倍)、质量过滤(30+ 启发式规则)、语义去重、个人身份信息(PII)脱敏、非安全内容(NSFW)检测等功能。借助 RAPIDS 实现跨 GPU 扩展。适用于准备高质量训练数据集、清洗网络数据或对大规模语料库进行去重。

技能元数据

来源可选 — 使用 hermes skills install official/mlops/nemo-curator 安装
路径optional-skills/mlops/nemo-curator
版本1.0.0
作者Orchestra Research
许可证MIT
依赖项nemo-curator, cudf, dask, rapids
标签Data Processing, NeMo Curator, Data Curation, GPU Acceleration, Deduplication, Quality Filtering, NVIDIA, RAPIDS, PII Redaction, Multimodal, LLM Training Data

参考:完整 SKILL.md

信息

以下是 Hermes 在触发此技能时加载的完整技能定义。这是技能激活时代理所看到的指令。

NeMo Curator - GPU 加速数据整理

NVIDIA 用于为大语言模型(LLM)准备高质量训练数据的工具包。

何时使用 NeMo Curator

在以下情况使用 NeMo Curator:

  • 从网络抓取数据(Common Crawl)中准备 LLM 训练数据
  • 需要快速去重(比 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

参考资料

资源