Architecture

La plateforme, les dépôts, et la circulation des données et des modèles entre eux.
Auteur
Affiliation

SSP Lab, Insee

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) :

Tayebjee, Meilame, Nina Niederhametner, Bogdan Levagin, et Ariane Lestrade. 2025. From text to code (WP10.4) – MLOps tutorial. AIML4OS project, Work Package 10. https://aiml4os.github.io/WP10_Cluster4_MLOps/.
  • 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.

Avouac, Romain, Thomas Faria, et Frédéric Comte. 2025. « A Cloud-Native Data Science Platform for Official Statistics ». In Foundations and Advances of Machine Learning in Official Statistics. Society, Environment et Statistics. Springer. https://doi.org/10.1007/978-3-032-10004-7_8.
Table 1: Pile technique.
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 :

Table 2: Les dépôts et leurs contrats.
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 :

  • preprocess publie l’emplacement du dernier jeu de données, avec les listes de variables, dans un fichier de configuration partagé sur S3 ; train lit ce fichier.
  • train enregistre dans MLflow un modèle autonome, qui embarque son propre code d’inférence.
  • api té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.
  • cd fixe 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

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
Figure 1: Circulation des données et des modèles entre les dépôts.

Chaque bloc est détaillé dans un chapitre dédié :

Retour au sommet