Modèle / jeu de données
datajuicer/data-juicer avatar
datajuicer/data-juicer

Data-Juicer : un système d'exploitation de données pour la curation de corpus de modèles de fondation

Data processing for and with foundation models! 🍎 🍋 🌽 ➡️ ➡️🍸 🍹 🍷

7 047 étoiles425 forksPythonApache-2.0

En bref

De quoi s’agit-il ?
Data-Juicer transforme le nettoyage de données en pipeline YAML reproductible, avec plus de 200 opérateurs couvrant texte, image, audio et vidéo. Le projet est mature sur l'outillage, mais son coût réel se situe dans l'exploitation du cluster, pas dans l'installation.
À qui s’adresse-t-il ?
Data-Juicer convient aux équipes qui doivent produire des corpus reproductibles à grande échelle et qui disposent déjà d'un cluster Ray ou d'une plateforme capable de l'héberger. Il ne convient pas à un projet qui veut nettoyer quelques milliers de lignes dans un notebook : la valeur vient de la reproductibilité des recettes et de la distribution, pas du nettoyage lui-même.
Puis-je l’utiliser commercialement ?
Oui. Apache-2.0 est une licence permissive : vous pouvez utiliser, modifier et vendre un logiciel qui en dépend, à condition de conserver les mentions de droit d’auteur et de licence.
Est-il encore maintenu ?
Oui. Les derniers commits datent d’il y a 1 jour.
En quel langage est-il écrit ?
Principalement Python, d’après les statistiques de langage de GitHub.

Ces réponses reposent sur les données GitHub du projet (dernière synchronisation le 15 septembre 2026) et sur notre analyse. Elles ne constituent pas un avis juridique.

ANALYSE OPEN SOURCE APPROFONDIE

Le problème : la curation de données n'est pas un script, c'est une chaîne de traitement

Un pipeline de préparation de corpus pour modèle de fondation commence par des fichiers bruts et finit par un jeu d'entraînement. Entre les deux, il y a de la déduplication, du filtrage par longueur, de la normalisation d'espaces, de l'extraction, de l'étiquetage sémantique, et parfois de la synthèse. Chacune de ces étapes est facile à écrire isolément. Les assembler de façon reproductible, sur des volumes qui dépassent la mémoire d'une machine, est un autre exercice. Data-Juicer prend position sur ce point précis : le traitement de données est traité comme une infrastructure composable, avec des blocs modulaires décrits dans des fichiers YAML versionnables.

Le public visé est celui qui entraîne ou affine des modèles, pas celui qui fait de l'analyse exploratoire. Le README mentionne explicitement trois cas : la déduplication de corpus de pré-entraînement à l'échelle du web, la curation de traces d'interaction d'agents, et la préparation d'index RAG spécifiques à un domaine. Ces trois cas partagent une contrainte : le volume dépasse ce qu'un script pandas absorbe sans douleur, et la reproductibilité compte autant que le résultat.

La question à se poser avant d'investir du temps est simple. Si votre nettoyage tient dans une fonction de quelques dizaines de lignes que vous relancez rarement, Data-Juicer ajoute une couche de configuration dont vous n'avez pas besoin. Si vous devez relancer le même nettoyage sur des corpus successifs et justifier ce qui a été filtré, la couche de configuration devient le produit.

Opérateurs, recettes et fusion automatique : la mécanique interne

Le modèle d'exécution repose sur deux objets. Les opérateurs (OP) sont des unités de traitement typées : filtres, mappeurs, déduplicateurs, sélecteurs. Le README annonce plus de 200 opérateurs couvrant texte, image, audio, vidéo et multimodal. Les recettes sont des pipelines YAML qui enchaînent ces opérateurs. Une recette se versionne, se partage et se forke comme du code, ce qui est l'argument central du projet.

L'API Python montre le flux de données concrètement. On construit un `NestedDataset` à partir d'un dictionnaire, puis on appelle `ds.process([...])` avec une liste d'instances d'opérateurs. L'exemple du README enchaîne `TextLengthFilter(min_len=10)` et `WhitespaceNormalizationMapper()`. Le résultat est un dataset parcourable. Cette API est utile pour prototyper une chaîne courte avant de la transposer en YAML.

Deux mécanismes méritent l'attention. D'abord la fusion automatique d'opérateurs, que le README présente comme un gain de 2 à 10x. Ensuite le rechargement à chaud, qui permet d'itérer sur un opérateur sans redémarrer le pipeline. Ces deux points sont des choix d'architecture, pas des détails : ils supposent que vous passez beaucoup de temps à ajuster des opérateurs, ce qui est le cas quand on construit un corpus, moins quand on exécute une recette figée.

La version v1.6.0 ajoute une validation de configuration qui intercepte les paramètres d'opérateur invalides et les incompatibilités entre exécuteur et schéma avant le traitement. C'est une amélioration de robustesse réelle pour les recettes longues, où une erreur de paramètre ne se manifeste qu'après plusieurs heures de calcul.

Installation et première exécution

Le README donne deux chemins. Le premier est l'exploration sans installation, via un JupyterLab Playground avec tutoriels et un assistant nommé DJ Copilot. Le second est l'installation locale, avec `uv pip install py-data-juicer`, puis l'exécution d'une recette : `dj-process --config demos/process_simple/process.yaml`. La commande `dj-process` est le point d'entrée en ligne de commande, et le fichier de configuration est un YAML de recette.

Pour une utilisation programmatique, l'import se fait depuis `data_juicer.core.data` pour `NestedDataset`, depuis `data_juicer.ops.filter` pour les filtres et `data_juicer.ops.mapper` pour les mappeurs. La séparation entre filtres et mappeurs n'est pas cosmétique : un filtre retire des lignes, un mappeur les transforme. Confondre les deux dans une recette produit un pipeline qui tourne mais ne fait pas ce qu'on croit.

La version v1.5.5 mentionne le support des plugins d'opérateurs externes, ce qui permet d'ajouter des opérateurs sans modifier le dépôt principal. Le backend LiteLLM arrive en v1.6.0 : on sélectionne `api_backend="litellm"` dans `prepare_api_model` pour les requêtes de chat, d'embedding et de Responses. Le backend compatible OpenAI reste la valeur par défaut. Ce détail compte pour les équipes qui routent leurs appels vers plusieurs fournisseurs.

Rien dans le matériel fourni ne permet de dire combien de temps prend l'installation sur une machine donnée, ni quelles dépendances CUDA sont requises en pratique. Le README mentionne l'accélération CUDA comme option d'optimisation, sans détailler la matrice de compatibilité.

Ce que la documentation ne dit pas sur le passage à l'échelle

Le README avance deux chiffres de performance : 70 milliards d'échantillons traités en 2 heures sur 50 nœuds Ray (6400 cœurs), et 5 To dédupliqués en 2,8 heures sur 1280 cœurs. Ces chiffres proviennent du projet lui-même. Ils décrivent une configuration matérielle précise et ne se transposent pas à un cluster plus petit sans mesure préalable. Un lecteur qui dispose de 8 nœuds ne peut pas diviser ces durées par six : la déduplication a un coût de communication qui ne décroît pas linéairement.

La v1.6.0 introduit un partitionnement conscient du cluster, où le nombre de partitions par défaut s'appuie sur les ressources Ray disponibles. Le mécanisme de partitionnement manuel via `partition.size` découpe les données aux frontières de lignes, y compris quand le nombre de blocs d'entrée est inférieur au nombre de partitions. C'est un point de friction classique dans les pipelines distribués, et le fait qu'il soit traité explicitement suggère qu'il posait problème.

La limite la plus sérieuse n'est pas technique au sens strict. C'est le coût d'exploitation. Un pipeline Ray de 50 nœuds demande une équipe capable de diagnostiquer un nœud qui tombe, un déséquilibre de partitions, ou une fuite mémoire dans un opérateur. Le README mentionne la traçabilité intégrée pour le débogage et l'audit, ce qui aide, mais ne remplace pas cette compétence. Pour une équipe sans expérience Ray, le temps passé à opérer le cluster peut dépasser le temps gagné sur le nettoyage.

Le choix de la recette YAML face aux scripts maison

L'alternative la plus directe n'est pas un autre framework, c'est un script Python écrit à la main. Beaucoup d'équipes nettoient leurs corpus avec du pandas, du multiprocessing et quelques fonctions utilitaires. Cette approche a un avantage réel : elle ne demande aucune infrastructure et se débogue avec un point d'arrêt.

La différence se situe sur deux axes. Le premier est la reproductibilité. Une recette YAML décrit la chaîne complète dans un fichier versionnable, ce qui permet de rejouer exactement le même nettoyage six mois plus tard, ou de comparer deux versions d'un corpus en ne changeant qu'un paramètre. Un script maison dérive silencieusement : quelqu'un modifie un seuil, personne ne le note. Le second axe est la distribution. Écrire soi-même un déduplicateur distribué correct, avec gestion des partitions et reprise après incident, représente un travail conséquent. Data-Juicer fournit ce composant.

Le revers est la dépendance à un cadre de configuration. Quand un opérateur ne fait pas exactement ce qu'on veut, il faut soit le paramétrer, soit écrire un plugin externe (supporté depuis la v1.5.5), soit contourner le cadre. Dans un script maison, on modifie trois lignes. C'est un arbitrage entre contrôle et structure, et il n'y a pas de réponse universelle.

Il faut noter que le README mentionne l'intégration de Data-Juicer dans Alibaba Cloud PAI. C'est un signal d'adoption industrielle, mais cela ne dit rien sur la facilité d'usage hors de cette plateforme.

Maintenance, licence et coût de mise à jour

Le projet est sous licence Apache-2.0, ce qui autorise l'usage commercial, la modification et la redistribution, avec les obligations habituelles de conservation des mentions de licence et d'avis. Cette licence ne couvre que le code du dépôt. Les modèles, jeux de données ou recettes externes référencés depuis le projet peuvent avoir leurs propres conditions, et rien dans le matériel fourni ne permet de les inventorier. Un examen au cas par cas reste nécessaire avant un usage en production commerciale.

Le rythme de publication est soutenu. Trois versions apparaissent dans les données fournies : v1.5.4 le 23 juillet 2026, v1.5.5 le 7 août, v1.6.0 le 9 septembre. Un cycle d'environ trois à cinq semaines. Ce rythme a deux conséquences. Les correctifs de robustesse arrivent vite, ce qui est utile quand on dépend d'un opérateur précis. Mais chaque mise à jour peut modifier un comportement : la v1.6.0 corrige l'isolation du cache des filtres fusionnés, la réutilisation de l'état MinHash, les déclarations de mode d'exécution des déduplicateurs, et la gestion des types d'extension pandas. Ces corrections changent des résultats, pas seulement des performances.

La conséquence pratique est qu'une recette validée sur une version peut produire un corpus légèrement différent sur la suivante. La validation de configuration introduite en v1.6.0 aide à détecter les incompatibilités de paramètres, mais elle ne détecte pas un changement silencieux dans le comportement d'un opérateur. Épingler la version dans vos dépendances et comparer les statistiques de sortie entre deux exécutions est la seule protection que le matériel fourni permette de recommander.

Conclusion éditoriale

Data-Juicer convient aux équipes qui doivent produire des corpus reproductibles à grande échelle et qui disposent déjà d'un cluster Ray ou d'une plateforme capable de l'héberger. Il ne convient pas à un projet qui veut nettoyer quelques milliers de lignes dans un notebook : la valeur vient de la reproductibilité des recettes et de la distribution, pas du nettoyage lui-même. Avant d'adopter, vérifiez trois choses concrètes : que les opérateurs dont vous avez besoin existent réellement dans la liste documentée et pas seulement dans le README, que votre environnement peut exécuter `dj-process --config` avec un fichier de configuration minimal, et que la validation de configuration introduite en v1.6.0 accepte vos schémas d'entrée. Le reste se joue sur le cluster, pas dans le dépôt.

Sources officielles

  1. datajuicer/data-juicer on GitHub
  2. License: Apache-2.0
  3. Project website
  4. README
  5. Releases
Notes de la communauté

Notes de la communauté