DataTrove - Canalizaciones de Procesamiento de Datos para LLMs
DataTrove es una biblioteca de código abierto de Hugging Face para procesar, filtrar y deduplicar grandes conjuntos de datos de texto para entrenamiento de LLMs. Proporciona bloques de canalización componibles — lectores, filtros, etapas de dedup, escritores — que se ejecutan sin cambios en backends de ejecución: localmente, en un clúster Slurm, o en Ray. Es la implementación de referencia detrás de los conjuntos de datos FineWeb y FineWeb-Edu, lo que la convierte en la herramienta de referencia cuando quieres reproducir o adaptar una canalización de curación publicada enfocada en CPU.
Instalación
| Método | Comando |
|---|
| pip | pip install datatrove |
| Con todos los extras | pip install "datatrove[all]" |
| Extras de procesamiento | pip install "datatrove[processing]" |
| Desde fuente | git clone https://github.com/huggingface/datatrove && pip install -e . |
Conceptos Principales
| Concepto | Significado |
|---|
| Canalización | Una lista ordenada de bloques que flujo de datos atraviesa |
| Bloque | Un paso: lector, filtro, dedup, escritor, etc. |
| Documento | La unidad (text, id, metadata) |
| Ejecutor | Dónde se ejecuta la canalización (Local / Slurm / Ray) |
| Tareas | Fragmentos paralelos de la carga de trabajo |
Bloques de Canalización
| Categoría | Ejemplos |
|---|
| Lectores | WarcReader, JsonlReader, ParquetReader, HuggingFaceDatasetReader |
| Extractores | Trafilatura (HTML → texto) |
| Filtros | LanguageFilter, GopherQualityFilter, GopherRepetitionFilter, C4QualityFilter, FineWebQualityFilter, URLFilter |
| Dedup | MinhashDedup, SentenceDedup, ExactSubstrDedup |
| Escritores | JsonlWriter, ParquetWriter |
| Tokenización | DocumentTokenizer |
Una Canalización Básica
from datatrove.executor import LocalPipelineExecutor
from datatrove.pipeline.readers import JsonlReader
from datatrove.pipeline.filters import LanguageFilter, GopherQualityFilter
from datatrove.pipeline.writers import JsonlWriter
pipeline = [
JsonlReader("data/input/"),
LanguageFilter(languages=["en"]),
GopherQualityFilter(),
JsonlWriter("data/output/"),
]
executor = LocalPipelineExecutor(pipeline=pipeline, tasks=8)
executor.run()
Ejecutores (Misma Canalización, Diferentes Backends)
| Ejecutor | Uso |
|---|
LocalPipelineExecutor | Una máquina, multiprocesamiento |
SlurmPipelineExecutor | Clústeres HPC vía trabajos Slurm |
RayPipelineExecutor | Clústeres Ray |
from datatrove.executor import SlurmPipelineExecutor
SlurmPipelineExecutor(
pipeline=pipeline, tasks=1000, time="20:00:00",
partition="cpu", workers=200,
).run()
Deduplicación
Las etapas de dedup de DataTrove típicamente se ejecutan como canalizaciones de múltiples pasos (firmas → cubos → clusters → filtro).
| Método | Bloque |
|---|
| MinHash (difusa) | MinhashDedup (múltiples etapas) |
| Substring exacto | ExactSubstrDedup |
| Nivel de oración | SentenceDedup |
Filtros de Calidad
| Filtro | Heurística |
|---|
GopherQualityFilter | Longitud, ratios de símbolo, límites de bala/elipsis |
GopherRepetitionFilter | Repetición excesiva |
C4QualityFilter | Reglas estilo C4 (puntuación terminal, etc.) |
FineWebQualityFilter | Heurísticas de receta FineWeb |
LanguageFilter | Umbral de ID de idioma fastText |
URLFilter | Bloquea/permite por URL/dominio |
Flujos de Trabajo Comunes
# Reproduce una canalización de web estilo FineWeb (orden conceptual)
# WarcReader → URLFilter → Trafilatura → LanguageFilter →
# GopherQuality/Repetition → Filtros C4/FineWeb → MinhashDedup → JsonlWriter
# Escala la canalización idéntica de portátil a clúster intercambiando el ejecutor:
# LocalPipelineExecutor → SlurmPipelineExecutor → RayPipelineExecutor
DataTrove vs NeMo Curator
| Aspecto | DataTrove | NeMo Curator |
|---|
| Computación | CPU-primero | GPU-nativo (RAPIDS) |
| Mejor para | Reproducción de conjuntos de datos estilo FineWeb | Ejecuciones 10T+ token pesadas en dedup |
| Backends | Local / Slurm / Ray | Ray |
| Origen | Hugging Face | NVIDIA |
Recursos