nemo-curator について
NeMo Curatorは、LLMの学習データを準備するNVIDIAのツールキットです。データや機械学習のチーム向けに、テキストとマルチモーダルデータのフィルタリング、重複除去、個人情報の除去、分類をGPUで処理できます。
主な機能
- 01ヒューリスティックと分類器による品質フィルタリング
- 02完全一致・近似・意味的な重複除去
- 03個人情報の除去
- 04テキスト・画像・動画・音声のキュレーション
- 05分散GPU処理
活用シーン
- 01Common 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 高速化データキュレーション
LLM 向けの高品質なトレーニングデータを準備する NVIDIA のツールキットです。
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:汎用的な ML データ処理(キュレーションに特化していません)
クイックスタート
インストール
# 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
参考資料
- フィルタリングガイド - 30 種類以上の品質フィルター、ヒューリスティック
- 重複排除ガイド - 完全一致、ファジー、セマンティック方式
リソース
- GitHub:https://github.com/NVIDIA/NeMo-Curator ⭐ 500+
- ドキュメント:https://docs.nvidia.com/nemo-framework/user-guide/latest/datacuration/
- バージョン:0.4.0+
- ライセンス:Apache 2.0
エージェントの実行手順
- 環境を確認します。 GPU メモリ、モデルのチェックポイントとライセンス、フレームワークのバージョン、入力形式を確認します。
- 入力を特定します。 データまたはユーザーに確認して、形式、識別子、パラメーターを確定します。結果に影響する値については推測せず、質問します。
- まず小規模に実行します。 最初に、単一のサンプルを低解像度または短い長さで推論します。
- 上記の手順と参考資料を使用して、タスク全体を実行します。
- 結果を検証します。 出力を定性的に評価し、タスクの指標でも確認します。生成コンテンツに関するライセンス制限も確認します。
- 報告します。 実行した内容(バージョン、コマンド、パラメーター)、確認した内容、未確認の事項を明記します。
| この状況が発生した場合 | 次の対応 |
|---|---|
| 大きな入力でメモリ不足が発生する | 解像度またはシーケンス長を下げる、半精度を使用する、または入力をタイルに分割します。 |
| インストール済みバージョンに、この手順に記載された関数、フラグ、またはエンドポイントがない | インストール済みバージョンのドキュメント(help()、--help、公式ドキュメント)を確認し、適宜調整してユーザーに伝えます。API を捏造してはいけません。 |
| 必須の入力、識別子、またはパラメーターが曖昧である | ユーザーに質問するか、実行前に前提を明示します。 |
誠実性に関するルール
- 結果、パラメーター、識別子、引用、統計情報を決して捏造しません。実行または検証できないことがあれば、明確に伝えます。
- 商用利用または公開の前に、モデルとデータセットのライセンスを確認します。
- ここに記載されたバージョン固有の情報は古くなっている可能性があるため、インストール済みバージョンの公式ドキュメントで確認します。
- 費用が発生する、共有 GPU やクラウドのクォータを消費する、個人データや患者データに触れる、または取り消せない操作を行う場合は、事前に許可を求めます。
関連スキル
nemo-guardrails:Colang 2.0 フローで設定された NVIDIA NeMo Guardrails を使用して、LLM アプリケーションに実行時の安全対策を追加します。modal:Modal は、オンデマンドの GPU を含め、オンデマンドで Python を実行できるサーバーレスクラウドプラットフォームです。exa-search:科学・技術コンテンツに最適化された、Exa を活用するウェブツールキットです。
コメント
Markdown 対応