关于 nemo-curator
NeMo Curator 是 NVIDIA 用于准备 LLM 训练数据的工具包,适合数据与机器学习团队。它可筛选、去重、脱敏和分类文本及多模态数据,并支持 GPU 与多 GPU 处理。
主要功能
- 01启发式与分类器质量筛选
- 02精确、模糊及语义去重
- 03个人信息脱敏
- 04文本、图像、视频和音频整理
- 05分布式 GPU 处理
适用场景
- 01清理 Common Crawl 训练数据
- 02移除数据集中的重复文档
- 03训练前脱敏个人信息
- 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
参考资料
资源
- GitHub:https://github.com/NVIDIA/NeMo-Curator ⭐ 500+
- 文档:https://docs.nvidia.com/nemo-framework/user-guide/latest/datacuration/
- 版本:0.4.0+
- 许可证:Apache 2.0
Agent 操作流程
- 检查环境。 确认 GPU 内存、模型检查点和许可证、框架版本及输入格式。
- 明确输入。 根据数据或用户确认格式、标识符和参数。任何会影响结果的取值都应询问,不要猜测。
- 先运行小规模版本。 先以较低分辨率或较短长度对单个样本运行推理。
- 根据上述说明和参考资料执行完整任务。
- 验证结果。 通过定性方式和任务指标检查输出;检查生成内容的许可证限制。
- 报告。 说明运行了什么(版本、命令、参数)、检查了什么,以及还有哪些不确定之处。
| 如果出现这种情况 | 请这样做 |
|---|---|
| 大型输入导致内存不足 | 降低分辨率或序列长度、使用半精度,或对输入进行分块处理。 |
| 这些说明中的函数、标志或端点在已安装版本中不存在 | 查阅已安装版本自身的文档(help()、--help、官方文档),调整操作,并告知用户。切勿编造 API。 |
| 必需的输入、标识符或参数含糊不清 | 询问用户,或在运行前明确说明所作假设。 |
诚信守则
- 切勿伪造结果、参数、标识符、引用或统计数据。如果无法运行或验证某项内容,请明确说明。
- 商业用途或发布前,检查模型和数据集的许可证。
- 此处与版本相关的细节可能已过时:请根据已安装版本的官方文档进行确认。
- 在执行会产生费用、占用共享 GPU 或云配额、接触个人或患者数据,或无法撤销的操作前,请先征求同意。
相关技能
nemo-guardrails:使用 NVIDIA NeMo Guardrails 为 LLM 应用添加运行时安全护栏,并通过 Colang 2.0 工作流进行配置。modal:Modal 是一个无服务器云平台,可按需运行 Python,包括按需使用 GPU。exa-search:由 Exa 提供支持的网络工具包,专为科学和技术内容优化。
评论
支持 Markdown