Перейти к основному содержимому

Nemo Curator

GPU-ускоренная курация данных для обучения LLM. Поддерживает текст/изображения/видео/аудио. Включает нечёткое дедублицирование (в 16 раз быстрее), фильтрацию качества (30+ эвристик), семантическое дедублицирование, редактирование PII, обнаружение NSFW. Масштабируется на нескольких GPU с помощью RAPIDS. Используется для подготовки высококачественных обучающих наборов данных, очистки веб-данных или дедублицирования больших корпусов.

Метаданные навыка​

ИсточникОпционально — установка с помощью vibeos skills install official/mlops/nemo-curator
Путьoptional-skills/mlops/nemo-curator
Версия1.0.0
Автор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​

к сведению

Ниже приведено полное определение навыка, которое VibeOS загружает при его активации. Это инструкции, которые видит агент, когда навык активен.

NeMo Curator — GPU-ускоренная курация данных

Инструментарий NVIDIA для подготовки высококачественных обучающих данных для LLM.

Когда использовать NeMo Curator​

Используйте NeMo Curator, когда:

  • Требуется подготовка данных для обучения LLM из веб-скрапинга (Common Crawl)
  • Нужно быстрое дедублицирование (в 16 раз быстрее, чем на CPU)
  • Курация мультимодальных наборов данных (текст, изображения, видео, аудио)
  • Фильтрация низкокачественного или токсичного контента
  • Масштабирование обработки данных на кластере GPU

Производительность:

  • В 16 раз быстрее нечёткое дедублицирование (8 ТБ RedPajama v2)
  • На 40% ниже TCO по сравнению с CPU-альтернативами
  • Почти линейное масштабирование на узлах GPU

Используйте альтернативы вместо этого:

  • datatrove: CPU-ориентированная обработка данных с открытым исходным кодом
  • dolma: Инструментарий данных от Allen AI
  • Ray Data: Общая обработка данных для ML (без фокуса на курацию)

Быстрый старт​

Установка​

# Курация текста (CUDA 12)
uv pip install "nemo-curator[text_cuda12]"

# Все модальности
uv pip install "nemo-curator[all_cuda12]"

# Только CPU (медленнее)
uv pip install "nemo-curator[cpu]"

Базовый конвейер курации текста​

from nemo_curator import ScoreFilter, Modify
from nemo_curator.datasets import DocumentDataset
import pandas as pd

# Загрузка данных
df = pd.DataFrame({"text": ["Хороший документ", "Плохой док", "Отличный текст"]})
dataset = DocumentDataset(df)

# Фильтрация качества
def quality_score(doc):
return len(doc["text"].split()) > 5 # Фильтр коротких документов

filtered = ScoreFilter(quality_score)(dataset)

# Дедублицирование
from nemo_curator.modules import ExactDuplicates
deduped = ExactDuplicates()(filtered)

# Сохранение
deduped.to_parquet("curated_data/")

Конвейер курации данных​

Этап 1: Фильтрация качества​

from nemo_curator.filters import (
WordCountFilter,
RepeatedLinesFilter,
UrlRatioFilter,
NonAlphaNumericFilter
)

# Применение 30+ эвристических фильтров
from nemo_curator import ScoreFilter

# Фильтр по количеству слов
dataset = dataset.filter(WordCountFilter(min_words=50, max_words=100000))

# Удаление повторяющегося контента
dataset = dataset.filter(RepeatedLinesFilter(max_repeated_line_fraction=0.3))

# Фильтр по доле URL
dataset = dataset.filter(UrlRatioFilter(max_url_ratio=0.2))

Этап 2: Дедублицирование​

Точное дедублицирование:

from nemo_curator.modules import ExactDuplicates

# Удаление точных дубликатов
deduped = ExactDuplicates(id_field="id", text_field="text")(dataset)

Нечёткое дедублицирование (в 16 раз быстрее на GPU):

from nemo_curator.modules import FuzzyDuplicates

# Дедублицирование MinHash + LSH
fuzzy_dedup = FuzzyDuplicates(
id_field="id",
text_field="text",
num_hashes=260, # Параметры MinHash
num_buckets=20,
hash_method="md5"
)

deduped = fuzzy_dedup(dataset)

Семантическое дедублицирование:

from nemo_curator.modules import SemanticDuplicates

# Дедублицирование на основе эмбеддингов
semantic_dedup = SemanticDuplicates(
id_field="id",
text_field="text",
embedding_model="sentence-transformers/all-MiniLM-L6-v2",
threshold=0.8 # Порог косинусного сходства
)

deduped = semantic_dedup(dataset)

Этап 3: Редактирование PII​

from nemo_curator.modules import Modify
from nemo_curator.modifiers import PIIRedactor

# Редактирование личной информации
pii_redactor = PIIRedactor(
supported_entities=["EMAIL_ADDRESS", "PHONE_NUMBER", "PERSON", "LOCATION"],
anonymize_action="replace" # или "redact"
)

redacted = Modify(pii_redactor)(dataset)

Этап 4: Фильтрация классификатором​

from nemo_curator.classifiers import QualityClassifier

# Классификация качества
quality_clf = QualityClassifier(
model_path="nvidia/quality-classifier-deberta",
batch_size=256,
device="cuda"
)

# Фильтрация низкокачественных документов
high_quality = dataset.filter(lambda doc: quality_clf(doc["text"]) > 0.5)

GPU-ускорение​

Производительность GPU vs CPU​

ОперацияCPU (16 ядер)GPU (A100)Ускорение
Нечёткое дедублицирование (8 ТБ)120 часов7.5 часов16×
Точное дедублицирование (1 ТБ)8 часов0.5 часов16×
Фильтрация качества2 часа0.2 часа10×

Масштабирование на нескольких GPU​

from nemo_curator import get_client
import dask_cuda

# Инициализация GPU-кластера
client = get_client(cluster_type="gpu", n_workers=8)

# Обработка с 8 GPU
deduped = FuzzyDuplicates(...)(dataset)

Мультимодальная курация​

Курация изображений​

from nemo_curator.image import (
AestheticFilter,
NSFWFilter,
CLIPEmbedder
)

# Оценка эстетики
aesthetic_filter = AestheticFilter(threshold=5.0)
filtered_images = aesthetic_filter(image_dataset)

# Обнаружение NSFW
nsfw_filter = NSFWFilter(threshold=0.9)
safe_images = nsfw_filter(filtered_images)

# Генерация эмбеддингов CLIP
clip_embedder = CLIPEmbedder(model="openai/clip-vit-base-patch32")
image_embeddings = clip_embedder(safe_images)

Курация видео​

from nemo_curator.video import (
SceneDetector,
ClipExtractor,
InternVideo2Embedder
)

# Обнаружение сцен
scene_detector = SceneDetector(threshold=27.0)
scenes = scene_detector(video_dataset)

# Извлечение клипов
clip_extractor = ClipExtractor(min_duration=2.0, max_duration=10.0)
clips = clip_extractor(scenes)

# Генерация эмбеддингов
video_embedder = InternVideo2Embedder()
video_embeddings = video_embedder(clips)

Курация аудио​

from nemo_curator.audio import (
ASRInference,
WERFilter,
DurationFilter
)

# Транскрипция ASR
asr = ASRInference(model="nvidia/stt_en_fastconformer_hybrid_large_pc")
transcribed = asr(audio_dataset)

# Фильтрация по WER (частота ошибок в словах)
wer_filter = WERFilter(max_wer=0.3)
high_quality_audio = wer_filter(transcribed)

# Фильтрация по длительности
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

# Загрузка данных Common Crawl
dataset = DocumentDataset.read_parquet("common_crawl/*.parquet")

# Конвейер
pipeline = [
# 1. Фильтрация качества
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. Языковая фильтрация
LanguageIdentificationFilter(target_languages=["en"]),

# 3. Дедублицирование
ExactDuplicates(id_field="id", text_field="text"),
FuzzyDuplicates(id_field="id", text_field="text", num_hashes=260),

# 4. Редактирование PII
PIIRedactor(),

# 5. Фильтрация NSFW
NSFWClassifier(threshold=0.8)
]

# Выполнение
for stage in pipeline:
dataset = stage(dataset)

# Сохранение
dataset.to_parquet("curated_common_crawl/")

Распределённая обработка​

from nemo_curator import get_client
from dask_cuda import LocalCUDACluster

# Многопроцессорный GPU-кластер
cluster = LocalCUDACluster(n_workers=8)
client = get_client(cluster=cluster)

# Обработка большого набора данных
dataset = DocumentDataset.read_parquet("s3://large_dataset/*.parquet")
deduped = FuzzyDuplicates(...)(dataset)

# Очистка
client.close()
cluster.close()

Бенчмарки производительности​

Нечёткое дедублицирование (8 ТБ RedPajama v2)​

  • CPU (256 ядер): 120 часов
  • GPU (8× A100): 7.5 часов
  • Ускорение: 16×

Точное дедублицирование (1 ТБ)​

  • CPU (64 ядра): 8 часов
  • GPU (4× A100): 0.5 часов
  • Ускорение: 16×

Фильтрация качества (100 ГБ)​

  • CPU (32 ядра): 2 часа
  • GPU (2× A100): 0.2 часа
  • Ускорение: 10×

Сравнение стоимости​

Курация на CPU (AWS c5.18xlarge × 10):

  • Стоимость: $3.60/час × 10 = $36/час
  • Время для 8 ТБ: 120 часов
  • Итого: $4,320

Курация на GPU (AWS p4d.24xlarge × 2):

  • Стоимость: $32.77/час × 2 = $65.54/час
  • Время для 8 ТБ: 7.5 часов
  • Итого: $491.55

Экономия: 89% ($3,828 сэкономлено)

Поддерживаемые форматы данных​

  • Входные: Parquet, JSONL, CSV
  • Выходные: Parquet (рекомендуется), JSONL
  • WebDataset: TAR-архивы для мультимодальных данных

Варианты использования​

Продуктовые развёртывания:

  • NVIDIA использовала NeMo Curator для подготовки данных обучения Nemotron-4
  • Курированные наборы данных с открытым исходным кодом: RedPajama v2, The Pile

Ссылки​

  • Руководство по фильтрации — 30+ фильтров качества, эвристики
  • Руководство по дедублицированию — Точные, нечёткие, семантические методы

Ресурсы​