Nemo Curator
目次
- skill の情報
- 参考: SKILL.md 全文
- NeMo Curator を使う場面
- すぐ試す
- 導入
- テキスト整備の基本パイプライン
- データ整備のパイプライン
- 段階 1: 品質での絞り込み
- 段階 2: 重複除去
- 段階 3: 個人情報の伏せ字化
- 段階 4: 分類器での絞り込み
- GPU での高速化
- GPU と CPU の性能差
- 複数 GPU へのスケール
- マルチモーダルなデータ整備
- 画像の整備
- 動画の整備
- 音声の整備
- よくある組み合わせ
- Web クロールの整備(Common Crawl)
- 分散処理
- 性能の実測値
- あいまい重複の除去(8TB の RedPajama v2)
- 完全一致の重複除去(1TB)
- 品質での絞り込み(100GB)
- 費用の比較
- 扱えるデータ形式
- 使われている場面
- 参考資料
- 関連情報
LLM の学習データを整えます。重複除去・絞り込み・個人情報の伏せ字化を行います。
skill の情報
| 提供元 | 追加インストール — hermes skills install official/mlops/nemo-curator で導入します |
| パス | optional-skills/mlops/nemo-curator |
| バージョン | 1.0.1 |
| 作者 | Orchestra Research |
| ライセンス | MIT |
| 依存関係 | nemo-curator, cudf, dask, rapids |
| 対応プラットフォーム | linux, macos |
| タグ | Data Processing, NeMo Curator, Data Curation, GPU Acceleration, Deduplication, Quality Filtering, NVIDIA, RAPIDS, PII Redaction, Multimodal, LLM Training Data |
参考: SKILL.md 全文
NeMo Curator - GPU で高速化するデータ整備
LLM 向けの質の高い学習データを用意するための、NVIDIA のツール群です。
NeMo Curator を使う場面
次のようなときに NeMo Curator を使います:
- Web クロール(Common Crawl)から LLM の学習データを用意したい
- 重複除去を速くしたい(CPU の 16 倍)
- テキスト・画像・動画・音声にまたがるデータセットを整えたい
- 品質の低い内容や有害な内容を除きたい
- GPU クラスタでデータ処理をスケールさせたい
性能:
- あいまい重複の除去が 16 倍高速(8TB の RedPajama v2)
- CPU での処理に比べ 総保有コストが 40% 低い
- GPU ノードを増やすと ほぼ線形にスケール
次の場合は別の選択肢を使います:
- datatrove: CPU ベースのオープンソースなデータ処理
- dolma: Allen AI のデータ処理ツール群
- Ray Data: 汎用の ML データ処理(データ整備に特化していない)
すぐ試す
導入
# NeMo Curator 1.x installs with uv. Extras use hyphens (PyPI-normalized):
# text-cuda12 / text-cpu (and image/video/audio/math variants), or `all`.
# Text curation (CUDA 12)
uv pip install "nemo-curator[text-cuda12]"
# All modalities
uv pip install "nemo-curator[all]"
# CPU-only text (slower)
uv pip install "nemo-curator[text-cpu]"テキスト整備の基本パイプライン
> メジャーバージョンでの作り直し(1.x): NeMo Curator は Ray ベースの > パイプライン/ステージ構成に書き直されました。0.x にあった DocumentDataset + > nemo_curator.modules.* / ScoreFilter / Modify を、データセットに対してオブジェクトとして > 呼び出す API はなくなっています。1.x では ProcessingStage を組み合わせて Pipeline を作り、 > 実行役(executor)で走らせます。ステージや import の顔ぶれはモダリティごとに違うので、 > 以下の例は 考え方を示すもの(0.x 形式) と捉え、実際の 1.x の API は最新の > quickstart > と text guide を見て、 > import をそのまま書き写さないでください。
上流の quickstart にある、1.x のパイプラインの形は次のとおりです。
from nemo_curator.pipeline import Pipeline
from nemo_curator.stages.base import ProcessingStage
from nemo_curator.stages.resources import Resources
from nemo_curator.backends.xenna import XennaExecutor
from nemo_curator.core.client import RayClient
# 1. Define/compose stages (load -> filter -> dedupe -> classify -> write).
# Each stage declares its own Resources (CPU cores, GPU memory, replicas).
pipeline = Pipeline(name="curation", stages=[...])
# 2. Run it with an executor (Ray-backed).
client = RayClient()
client.start()
pipeline.run(XennaExecutor())
client.stop()以降の節にある 0.x 形式のコードは、*考え方*(品質での絞り込み、完全一致・あいまい・意味的な重複除去、個人情報の伏せ字化、分類器での絞り込み)を示すためのものです。そのまま動く 1.x のコードにするには、それぞれの考え方をモダリティ別ガイドの対応するステージに置き換えてください。
データ整備のパイプライン
段階 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: 個人情報の伏せ字化
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
# 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)よくある組み合わせ
Web クロールの整備(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(A100 × 8): 7.5 時間
- 速度差: 16 倍
完全一致の重複除去(1TB)
- CPU(64 コア): 8 時間
- GPU(A100 × 4): 0.5 時間
- 速度差: 16 倍
品質での絞り込み(100GB)
- CPU(32 コア): 2 時間
- GPU(A100 × 2): 0.2 時間
- 速度差: 10 倍
費用の比較
CPU でのデータ整備(AWS c5.18xlarge × 10):
- 費用: 1 時間あたり $3.60 × 10 = $36
- 8TB にかかる時間: 120 時間
- 合計: $4,320
GPU でのデータ整備(AWS p4d.24xlarge × 2):
- 費用: 1 時間あたり $32.77 × 2 = $65.54
- 8TB にかかる時間: 7.5 時間
- 合計: $491.55
削減幅: 89% 減($3,828 の節約)
扱えるデータ形式
- 入力: Parquet、JSONL、CSV
- 出力: Parquet(おすすめ)、JSONL
- WebDataset: マルチモーダル向けの TAR アーカイブ
使われている場面
実運用での採用例:
- NVIDIA は Nemotron-4 の学習データ作りに NeMo Curator を使いました
- 整備されたオープンソースのデータセット: RedPajama v2、The Pile
参考資料
関連情報
- GitHub: https://github.com/NVIDIA-NeMo/Curator
- ドキュメント: https://docs.nvidia.com/nemo/curator/latest/
- バージョン: 1.2.0(1.x は Ray ベースのパイプラインへの書き直しです。0.x のコードを写す前に quickstart を確認してください)
- ライセンス: Apache 2.0