Spaces:
Sleeping
Credit Scoring MLOps Project
Projet de deploiement et de monitoring d'un modele de scoring credit base sur Home Credit Default Risk.
Le depot couvre la chaine MLOps complete autour d'un modele de scoring :
- preparation des donnees ;
- entrainement et tracking MLflow ;
- export d'artefacts de serving ;
- API FastAPI ;
- interface Streamlit ;
- stockage des predictions ;
- monitoring technique ;
- analyse de drift ;
- benchmarks de performance ;
- tests automatises ;
- CI/CD ;
- deploiement Hugging Face Spaces.
Objectif
Servir un score de defaut en quasi temps reel, journaliser les predictions et monitorer la solution en local et a distance.
Stack
Local
Docker Compose
|- FastAPI API
|- PostgreSQL
|- Streamlit
|- Prometheus
`- Grafana
Distant
Hugging Face Docker Space
|- Nginx on port 7860
|- Streamlit on /
|- FastAPI on /api
`- Supabase PostgreSQL logging
Structure du depot
src/credexp/
config.py
data/
db/
modeling/
monitoring/
serving/
utils/
scripts/
build_features.py
train_mlflow.py
train_final.py
tune_optuna.py
explainability.py
init_db.py
run_api.py
monitoring_drift.py
profile_inference.py
benchmark_api.py
benchmark_batching.py
benchmark_onnx.py
tests/
test_api.py
test_data_io.py
test_one_hot_encoder.py
test_threshold.py
streamlit_app/
app.py
pages/
docker/
api.Dockerfile
prometheus.Dockerfile
prometheus/prometheus.yml
deploy/huggingface/
Dockerfile
README.md
nginx.conf
start.sh
.github/workflows/
ci.yml
deploy_huggingface.yml
notebooks/
01_build_features.ipynb
02_eda.ipynb
03_training_mlflow.ipynb
04_tuning_registry_final.ipynb
05_explainability.ipynb
06_drift_monitoring.ipynb
07_performance_optimization.ipynb
reports/
coverage/
monitoring/
performance/
screenshots/
demo.md
soutenance_marp.md
artifacts/models/
pipeline.joblib
threshold.json
feature_columns.json
Modele et artefacts
Le serving s'appuie sur trois artefacts minimaux :
artifacts/models/pipeline.joblib
artifacts/models/threshold.json
artifacts/models/feature_columns.json
MLflow sert au tracking et au registry pendant l'entrainement. Le deploiement embarque ensuite les artefacts exportes pour garder une image Docker autonome.
API FastAPI
Implementation :
src/credexp/serving/api.py
Endpoints locaux :
| Endpoint | Methode | Role |
|---|---|---|
/health |
GET | Healthcheck |
/model-info |
GET | Metadonnees du modele charge |
/predict |
POST | Prediction unitaire |
/predict_batch |
POST | Prediction batch |
/metrics |
GET | Metriques Prometheus |
/docs |
GET | Swagger UI |
URL locale :
http://127.0.0.1:8000/docs
URL distante :
https://bijeytis-prjperso-credexp.hf.space/api/docs
Le modele est charge une seule fois au demarrage de l'API puis reutilise pour toutes les requetes.
Interface Streamlit
Fichiers :
streamlit_app/app.py
streamlit_app/pages/1_Scoring_Client.py
streamlit_app/pages/2_Monitoring_Dev.py
Pages disponibles :
Scoring ClientMonitoring Dev
URL locale :
http://127.0.0.1:8501
URL distante :
https://bijeytis-prjperso-credexp.hf.space
Stockage des predictions
Table cible : predictions
Champs suivis :
request_idsk_id_currmodel_namemodel_versionthresholdproba_defaultdecisionlatency_msstatus_codeerror_messageinput_payloadoutput_payload
Base locale :
postgresql+psycopg://postgres:postgres@localhost:5432/credexp
Base distante :
DATABASE_URL=postgresql+psycopg://USER:PASSWORD@HOST:PORT/postgres?sslmode=require
Monitoring
Prometheus
http://127.0.0.1:9090
http://127.0.0.1:9090/targets
La cible attendue est credexp_api en statut UP.
Grafana
http://127.0.0.1:3000
Identifiants par defaut :
admin / admin
Drift Evidently
Commande :
uv run python scripts/monitoring_drift.py --limit 500
Sorties :
reports/monitoring/evidently_drift.html
reports/monitoring/evidently_drift_meta.json
Notebook associe :
notebooks/06_drift_monitoring.ipynb
Performance
Commandes principales :
uv run python scripts/profile_inference.py
uv run python scripts/benchmark_api.py
uv run python scripts/benchmark_batching.py
uv run python scripts/benchmark_onnx.py
Sorties :
reports/performance/cprofile_inference_top20.txt
reports/performance/inference_benchmark.json
reports/performance/api_benchmark.json
reports/performance/batching_benchmark.json
reports/performance/onnx_benchmark.json
Notebook associe :
notebooks/07_performance_optimization.ipynb
Lancement local
Prerequis : Python 3.12, uv, Docker Desktop.
Installation :
uv sync --all-groups
Demarrage de la stack :
docker compose down -v
docker compose up --build -d
Start-Sleep -Seconds 30
docker compose ps
Generation de predictions de demo :
1..50 | ForEach-Object { .\api_examples\test_api.ps1 }
Verification PostgreSQL :
docker exec -it credexp_db psql -U postgres -d credexp -c "\dt"
docker exec -it credexp_db psql -U postgres -d credexp -c "SELECT created_at, sk_id_curr, model_version, proba_default, decision, latency_ms FROM predictions ORDER BY created_at DESC LIMIT 10;"
Services locaux :
| Service | URL |
|---|---|
| FastAPI Swagger | http://127.0.0.1:8000/docs |
| Streamlit | http://127.0.0.1:8501 |
| Prometheus | http://127.0.0.1:9090 |
| Grafana | http://127.0.0.1:3000 |
Tests et qualite
Lint :
uv run ruff check .
uv run ruff format --check .
Tests :
uv run pytest -q
Rapports :
reports/coverage/coverage.xml
reports/coverage/html/
Le seuil de couverture configure dans pyproject.toml est de 20.
CI/CD
Workflow CI :
.github/workflows/ci.yml
Declencheurs :
pushsurmainetdeveloppull_requestsurmainetdevelop
Contenu :
- sync des dependances avec
uv - ruff check et format
pytest- validation de
docker compose - build de l'image
docker/api.Dockerfile
Workflow de deploiement Hugging Face :
.github/workflows/deploy_huggingface.yml
Declencheurs :
pushsurdevelopworkflow_dispatch
Secrets attendus :
HF_TOKEN
HF_SPACE_ID
DATABASE_URL
Captures et support de soutenance
Notes de demo :
reports/demo.md
Support Marp :
reports/soutenance_marp.md
Captures disponibles dans :
reports/screenshots/
Exemples utiles :
01_github_history.png
02_github_actions_success.png
03_fastapi_docs.png
04_fastapi_predict_response.png
05_streamlit_scoring.png
06_streamlit_monitoring.png
07_postgres_predictions.png
08_prometheus_target_up.png
09_grafana_dashboard.png.png
10_evidently_drift_report.png
11_mlflow_registry_model_v2.png
12_performance_notebook.png
13_onnx_benchmark_json.png
14_supabase_predictions.png
15_huggingface_space_streamlit.png
16_huggingface_space_api_docs.png
17_github_action_deploy_hf_success.png
18_pytest_coverage.png
19_supabase_prediction_from_hf.png
Limites et suites
- Les donnees brutes Kaggle ne sont pas versionnees dans Git.
- Le drift reste qualitatif quand le volume de predictions est faible.
- Le deploiement Hugging Face est une preuve de concept realiste, pas une infra cloud complete.
- Les prochaines evolutions naturelles sont l'alerting, le retraining et des tests end-to-end de staging.