flowchart LR
subgraph SRC["Sources"]
SIR["Extractions Sirene"]
ANN["Annotations d'experts<br/>(Label Studio)"]
LLM["Recodage par LLM<br/>(codif-ape-nace-revision, vLLM)"]
end
subgraph PRE["codif-ape-preprocess"]
RUL["Moteur de règles<br/>+ logs d'audit"]
SPL["Splits<br/>train / validation / test"]
end
subgraph TRN["codif-ape-train"]
TTC["torchTextClassifiers<br/>(Lightning, GPU)"]
EVAL["Évaluation<br/>calibration, niveaux 1–5"]
end
REG[("Model registry<br/>MLflow")]
subgraph SRV["Mise en production"]
IMG["codif-ape-api<br/>image Docker"]
GIT["codif-ape-cd<br/>manifestes"]
K8S["Kubernetes<br/>(Argo CD)"]
end
SIR --> RUL
LLM --> RUL
ANN --> RUL
RUL --> SPL --> TTC --> EVAL --> REG
REG -->|"nom + version du modèle"| K8S
IMG --> K8S
GIT --> K8S
K8S -->|"prédictions, logs"| MON["Dashboard<br/>de monitoring"]
MON -->|"échantillons à annoter"| ANN
Architecture
1 Principes de conception
Le pipeline repose sur quelques principes, partagés avec le cadre MLOps européen développé dans le projet AIML4OS (Tayebjee et al. 2025) :
- Séparer données, code et calcul.
- Les données sont stockées au format Parquet, dans un stockage objet S3.
- Le code est versionné dans Git.
- Les calculs tournent dans des conteneurs lancés à la demande.
- Tout rendre reproductible.
- Chaque entraînement est piloté par un fichier de configuration.
- Chaque environnement est figé (lockfiles uv, images Docker).
- Chaque jeu de données, chaque modèle et chaque image est versionné.
- Packager le modèle avec son prétraitement, pour que ce qui est servi soit exactement ce qui a été évalué (pas de training/serving skew).
- Des déploiements déclaratifs. L’état de chaque environnement est décrit par des manifestes stockés dans Git, et un contrôleur GitOps aligne le cluster dessus.
- Garder l’humain dans la boucle. Les prédictions peu sûres partent en reprise manuelle, et la qualité se mesure grâce à l’annotation humaine.
2 La plateforme
Le développement, l’entraînement et la préproduction se font entièrement sur le SSP Cloud, la plateforme de data science du service statistique public français. Le SSP Cloud repose sur le projet open source Onyxia (Avouac et al. 2025). C’est possible parce que les libellés d’activité de Sirene ne sont pas des données sensibles.
| Composant | Outil | Rôle dans le pipeline |
|---|---|---|
| Stockage objet | MinIO (API S3) | Extractions brutes, jeux de données nettoyés, splits, tokenizers, artefacts de modèles, exports d’annotation |
| Environnements interactifs | Onyxia (VS Code, Jupyter) | Exploration et développement |
| Orchestration | Argo Workflows | Jobs batch de préparation des données et d’entraînement sur nœuds GPU (A2, H100) |
| Tracking des expériences et model registry | MLflow | Paramètres, métriques, figures et jeux de données de chaque run ; modèles versionnés |
| Serving | FastAPI sur Kubernetes | API REST qui expose le modèle |
| CI/CD | GitHub Actions, Argo CD | Build des images Docker ; synchronisation GitOps du cluster |
| Annotation | Label Studio | Campagnes d’annotation par les experts |
| Inférence LLM | vLLM (API compatible OpenAI) | Recodage hors ligne (NAF 2025), audit et données synthétiques (GRAAL) |
La production tourne sur l’infrastructure Kubernetes interne de l’Insee. Un modèle n’y passe qu’après avoir été qualifié sur une préproduction identique à la production.
3 Dépôts
Le code est découpé en dépôts qui font chacun une seule chose, regroupés dans l’organisation GitHub InseeFrLab :
| Dépôt | Produit | Consomme |
|---|---|---|
| codif-ape-nace-revision | Labels NAF 2025 des données d’entraînement, recodés par LLM | Extractions Sirene, table de passage, notes explicatives, annotations des experts |
| codif-ape-preprocess | Données d’entraînement nettoyées et augmentées ; splits train / validation / test ; logs d’audit de chaque modification de label | Extractions brutes de Sirene, données recodées en NAF 2025, tables de référence |
| codif-ape-train | Un modèle entraîné, packagé en pyfunc MLflow, avec ses métriques et ses figures de diagnostic |
Splits produits par preprocess ; torchTextClassifiers |
| codif-ape-api | Une image Docker de l’API REST | Un modèle enregistré dans MLflow, chargé au démarrage |
| codif-ape-cd | Les manifestes Kubernetes de tous les services (API, dashboard, ETL d’annotation, applications de revue) | Images Docker ; noms et versions des modèles |
| torchTextClassifiers | Une librairie PyTorch générique de classification de texte (publiée sur PyPI) | — |
| GRAAL | Des agents LLM pour coder, auditer et générer des labels ; des applications de revue | Le graphe de la nomenclature (Neo4j), les notes explicatives, l’API de production |
| codif-ape-prez | Présentations et articles | — |
Les dépôts ne s’importent pas entre eux. Ils communiquent via des artefacts :
preprocesspublie l’emplacement du dernier jeu de données, avec les listes de variables, dans un fichier de configuration partagé sur S3 ;trainlit ce fichier.trainenregistre dans MLflow un modèle autonome, qui embarque son propre code d’inférence.apitélécharge ce modèle au démarrage, à partir d’un nom et d’une version de modèle passés en variables d’environnement.cdfixe l’image et la version du modèle déployées dans chaque environnement.
Déployer un nouveau modèle revient donc à modifier une ligne d’un manifeste, qui se relit en code review comme n’importe quel autre changement.
4 Flux de bout en bout
Chaque bloc est détaillé dans un chapitre dédié :
- Données : sources, nettoyage des labels et passage à la NAF 2025.
- Données présente aussi GRAAL, les agents LLM qui auditent et proposent des codes hors ligne.
- Modèle : architecture, torchTextClassifiers et entraînement.
- Évaluation : quelles métriques, sur quelles données.
- Mise en production : packaging, API et GitOps.
- Monitoring et annotation : boucler la boucle.
- Protocole de réentraînement : comment la boucle débouche, sans risque, sur un nouveau modèle.
- Défis organisationnels et d’infrastructure : qui fait quoi, et la plateforme de qualification.