ce projet s'inscrit dans le cadre de la phase 3 du projet Challenge Rakuten. cette phase utilise les methodes ML Engineering (MLOps) pour déployer en production les modèles de prediction de categories Rakuten. Des methodes MLOps sont utilisées pour industrialiser les modèles de machine learning (svm/tfidf + cnn), en intégrant des étapes comme le versionnage des données et des modèles, l’automatisation des pipelines et le monitoring en production.
[ Client / Swagger ]
|
v
[ Streamlit UI ]
|
v
[ Gateway ] <----> [ Auth API ]
/ | \
/ | \
v v v
[Text API] [Image API] [Training API]
\ / |
\ / v
+----/-------> [DagsHub / MLflow]
^
|
[Airflow]
|
v
[DockerOperator]
|
v
[DVC Runner]
Monitoring:
Prometheus scrape gateway + APIs
Grafana visualise les métriques
une explication plus détaillée des services exposés sont dans README_PRODUCTION.md
mlops_projects/
├── airflow/
│ ├── dags/
│ │ └── mlops_orchestration.py
│ ├── dvc/
│ │ └── Dockerfile
│ └── requirements.txt
├── data/
├── gateway/
│ ├── dockerfile
│ ├── gateway_main.py
│ └── requirements.txt
├── models/
├── monitoring/
│ ├── grafana/
│ └── prometheus.yml
├── src/
│ ├── common/
│ ├── gateway/
│ ├── inference/
│ ├── mlflow/
│ ├── preprocessing/
│ ├── train_models/
│ └── training/
├── tests/
│ ├── conftest.py
│ ├── requirements_dev.txt
│ └── test_api_gateway.py
├── .github/workflows/ci.yml
├── docker-compose.yml
└── README.md
- Docker Desktop installé et démarré
- Git installé
- DVC installé (
pip install "dvc[s3]") - Un compte DagsHub avec accès au repo
Fouxy84/mlops_projects(token d'accès requis)
git clone https://github.com/Fouxy84/mlops_projects.git
cd mlops_projectsCréer un fichier .env à la racine du dossier cloné:
DAGSHUB_USER=<ton_username_dagshub>
DAGSHUB_TOKEN=<ton_token_dagshub>
GIT_REPO_URL=https://github.com/Fouxy84/mlops_projects.git
DAGSHUB_REPO_URL=https://dagshub.com/Fouxy84/mlops_projects
PROJECT_ROOT_HOST=<chemin_absolu_vers_le_dossier_cloné>
# Laisser vide = charge la version Production par défaut depuis MLflow
TEXT_MLFLOW_MODEL_VERSION=
IMAGE_MLFLOW_MODEL_VERSION=
TEXT_MLFLOW_VECTORIZER_ARTIFACT_PATH=preprocessing/tfidf.joblibLe
PROJECT_ROOT_HOSTdoit être le chemin Windows absolu vers le dossier cloné, ex:c:/Users/monnom/projets/mlops_projects
Si les APIs de prédiction ne trouvent pas de modèle en Production, forcer une version explicite dans le .env:
TEXT_MLFLOW_MODEL_VERSION=3
IMAGE_MLFLOW_MODEL_VERSION=2Puis redémarrer:
docker compose up -d predict-text-api predict-image-apiLes modèles ne sont pas dans le repo Git. Ils sont téléchargés depuis DagsHub / MLflow au démarrage des conteneurs. Sans
dvc pull, les dossiersdata/raw/etdata/processed/seront vides mais la stack démarre quand même.
dvc remote add -d dagshub https://dagshub.com/Fouxy84/mlops_projects.dvc
dvc remote modify dagshub --local auth basic
dvc remote modify dagshub --local user <ton_username_dagshub>
dvc remote modify dagshub --local password <ton_token_dagshub>
dvc pulldocker compose up --build -dLa première fois le build prend plusieurs minutes (images Python, Torch, etc.).
docker compose ps
docker compose logs gateway
docker compose logs predict-text-api
docker compose logs predict-image-api
docker compose logs training-apiOuvrir http://localhost:8000/docs
POST /loginavecadmin/adminGET /mePOST /predict/svmPOST /predict/cnnPOST /predict/multimodalGET /infoPOST /data/check-updates/baselineGET /data/check-updatesPOST /orchestrate/train/svmPOST /reload/svmPOST /logout
{
"text": "le tableau de chat est tres joli"
}{
"image_path": "image_528113_product_923222.jpg"
}{
"text": "le tableau de chat est tres joli",
"image_path": "image_528113_product_923222.jpg"
}Lancer Streamlit:
streamlit run options/option_1_streamlit_interface/streamlit_app.pyOuvrir http://localhost:8501, puis:
- Se connecter avec
admin / admin - Tester la prédiction texte, image et multimodale depuis l'interface
- Consulter l'état des services (monitoring)
Workflow: .github/workflows/ci.yml
Pipeline actuel:
- tests unitaires
- validation du DAG Airflow actif
- build Docker
- push DockerHub uniquement sur
pushversmaster - Deploiement vers Dagshub
Images construites:
mlops-gatewaymlops-auth-apimlops-predict-text-apimlops-predict-image-apimlops-training-apimlops-mlflowmlops-dvc-runner
Tests actifs:
python -m pytest tests -qValidation Docker Compose:
docker compose config- GitHub:
https://github.com/Fouxy84/mlops_projects - DagsHub:
https://dagshub.com/Fouxy84/mlops_projects
Deux stratégies peuvent être appliquées selon le niveau d’urgence.
Objectif:
- restaurer rapidement des modèles déjà entraînés
- repartir d’un état connu sans refaire tout le pipeline
Principe:
- retrouver un commit Git cohérent datant d’environ 7 jours
- restaurer les pointeurs DVC de ce commit
- récupérer les artefacts correspondants depuis DagsHub
- recharger les modèles dans les APIs
Étapes:
- retrouver un commit de référence datant d’environ 7 jours:
git log --since="10 days ago" --until="7 days ago" --oneline- créer une branche de reprise:
git checkout -b rollback-prod-7j <SHA_COMMIT>- restaurer les données versionnées:
dvc pull data/raw.dvc data/processed.dvc
dvc checkout- relancer les services utiles:
docker compose up -d --build gateway predict-text-api predict-image-api training-api- se connecter sur Swagger du gateway:
POST /loginavecadmin/admin
- recharger les modèles en production locale:
POST /reload/svmPOST /reload/cnn
- vérifier:
GET /infoPOST /predict/svmPOST /predict/cnnPOST /predict/multimodal
Usage recommandé:
- si l’objectif est de remettre rapidement un service stable
- si les modèles d’il y a 7 jours sont déjà validés
Objectif:
- rejouer complètement la chaîne d’entraînement
- reconstruire les artefacts à partir d’un snapshot de données plus ancien
Principe:
- revenir au repo et aux pointeurs DVC d’environ 14 jours
- récupérer les données correspondantes via DVC
- relancer le training des 2 modèles
- recharger les modèles dans les APIs
Étapes:
- retrouver un commit de référence datant d’environ 14 jours:
git log --since="17 days ago" --until="14 days ago" --oneline- créer une branche dédiée:
git checkout -b retrain-prod-14j <SHA_COMMIT>- restaurer les données de cette période:
dvc pull data/raw.dvc data/processed.dvc
dvc checkout- relancer la stack:
docker compose up -d --build gateway training-api predict-text-api predict-image-api airflow- choisir un mode de relance:
Option A - via Swagger du gateway:
POST /loginavecadmin/adminPOST /orchestrate/train/svmPOST /orchestrate/train/cnnPOST /reload/svmPOST /reload/cnn
Option B - via Airflow:
- ouvrir
http://localhost:8080 - lancer le DAG
mlops_orchestration - laisser tourner:
dvc_pull_artifactstrain_svmtrain_cnnreload_svmreload_cnn
- vérifier que les runs sont remontés dans DagsHub / MLflow:
https://dagshub.com/Fouxy84/mlops_projectshttps://dagshub.com/Fouxy84/mlops_projects.mlflow
- valider le résultat via les endpoints:
GET /infoPOST /predict/svmPOST /predict/cnnPOST /predict/multimodal
Usage recommandé:
- si tu veux reconstruire complètement les modèles
- si tu soupçonnes une corruption ou une dérive récente des données ou modèles
Utiliser le cas 1 si:
- il faut restaurer vite
- tu fais confiance aux modèles déjà entraînés
Utiliser le cas 2 si:
- il faut recalculer proprement toute la chaîne
- tu veux repartir d’un historique de données plus ancien et stable
Le dossier options/ propose deux evolutions possibles pour ouvrir la reflexion vers un projet plus complet, sans remplacer la stack de reference basee sur docker-compose.yml.
Dossier: options/option_1_streamlit_interface/
Cette option ajoute une interface metier legere qui consomme uniquement le gateway existant.
Ce que cela apporte:
- une interface plus simple que Swagger pour la demo
- une experience utilisateur plus accessible pour la prediction texte, image et multimodale
- aucun changement structurel sur les APIs existantes
Ce que cela ne change pas:
- le gateway reste le point d'entree principal
- Docker Compose reste le mode de lancement de reference
- la securite et la logique MLOps actuelles restent identiques
Dossier: options/option_2_k3s_scalability/
Cette option prepare une migration progressive vers Kubernetes en choisissant K3s, plus leger qu'un cluster Kubernetes complet et plus adapte a un petit projet ou une soutenance.
Ce que cela apporte:
- replication plus simple des APIs
- base pour l'auto-healing et le scaling horizontal
- exposition centralisee via Ingress
- possibilite d'ajouter Streamlit comme front metier dans une architecture plus industrielle
Ce que cela ne change pas:
- la stack actuelle reste la reference pour la demo, la CI et le developpement
- K3s est une projection d'evolution, pas un remplacement impose
Utiliser l'option Streamlit si l'objectif est d'ameliorer l'experience de demo sans complexifier le projet.
Utiliser l'option K3s si l'objectif est de montrer qu'une evolution vers une architecture plus scalable est deja pensee, tout en gardant une cible legere et realiste.