Projet de fin de module apprentissage profond, construit comme un mini-projet hospitalier: pipeline d'entrainement CPU-first en PyTorch, API FastAPI, interface web de demonstration, gouvernance des donnees et logique de mise en production. https://deeplearning-project-7wed.onrender.com/
- Construire un classifieur
MALIGNANTvsBENIGNfiable sur le jeu de donnees Wisconsin. - Travailler selon une logique reelle: reproductibilite, auditabilite, metriques cliniques.
- Limiter la consommation CPU/memoire et les couts cloud avec une strategie de cache.
- Preparer une extension future vers MIAS (imagerie).
- Cadrage produit et medical
- Cible clinique: outil de triage (pas un diagnostic autonome).
- Priorisation de la sensibilite (detection des cas malins).
- Definition d'une gouvernance de donnees (
docs/data_governance.md).
- Pipeline data tabulaire
- Chargement robuste CSV.
- Normalisation des noms de colonnes (
spaces -> underscores). - Exclusion des colonnes non exploitables (
id,Unnamed*, colonnes 100% NaN). - Encodage du target (
M -> 1,B -> 0). - Split stratifie train/test.
- Modelisation PyTorch CPU-first
- Modele
TabularMLP(src/breast_cancer_ai/model.py). - Regularisation: dropout, batch norm, weight decay.
- Entrainement avec:
BCEWithLogitsLossponderee (desequilibre des classes),- gradient clipping,
- scheduler
ReduceLROnPlateau, - early stopping.
- Controle de l'overfitting
- Holdout test externe (evaluation finale).
- Cross-validation stratifiee K-fold sur train+val.
- Probabilites OOF (out-of-fold) pour choisir le seuil.
- Seuil choisi pour atteindre d'abord une sensibilite cible.
- Rapport des ecarts trainval vs test (
overfit_gap).
- Artefacts, cache et tracabilite
- Versionning par run dans
models/runs/.... - Alias stable dans
models/latest/. training_signature= hash (config + signature dataset).- Si signature identique, reutilisation des artefacts sans reentrainement (
cache_hit). - Ecriture automatique de:
model.pt,metrics.json,report.md,cache_manifest.json.
- API de prod (FastAPI)
- Endpoints:
GET /healthGET /model_infoPOST /predictPOST /predict_batch
- Validation stricte des payloads (Pydantic).
- Chargement du modele au demarrage (lifespan).
request_idpar appel pour audit.
- Interface web de demo
GET /sert une interface HTML/CSS/JS branchee a l'API.- Design moderne, couleurs fortes, responsive mobile/desktop.
- Generation dynamique du formulaire depuis
feature_names. - Affichage resultat: probabilite, label, seuil, request id.
- Telechargement d'un compte-rendu medical patient (
.txt) apres inference. - Dashboard Plotly separe pour medecins (
/performance-dashboard): AUC, sensibilite/specificite, matrice de confusion.
- Scripts d'exploitation et maintenance
- Initialisation d'environnement virtuel avec cache de dependances.
- Lancement train/API.
- Monitoring memoire/stockage/API.
- Nettoyage des caches/fichiers intermediaires.
- Containerisation Docker
- API en conteneur CPU.
- Volume des modeles monte en local.
- Auto-train au demarrage seulement si
model.ptabsent.
- Qualite de code
- Corrections Pylance/Pylint.
- Typage renforce (TypedDict, cast controles, signatures explicites).
- Tests unitaires sur data, metriques et modele.
src/breast_cancer_ai/data.py: ingestion, nettoyage, splits.src/breast_cancer_ai/model.py: MLP tabulaire.src/breast_cancer_ai/train.py: CV OOF, entrainement final, artefacts, cache.src/breast_cancer_ai/inference.py: chargement artefact + prediction.src/breast_cancer_ai/api.py: service FastAPI + interface.src/breast_cancer_ai/web/*: frontend.configs/train_config.yaml: hyperparametres.scripts/*.ps1: operations.docs/*: gouvernance, fiche modele, checklist prod, plan MIAS.notebooks/01_eda_wisconsin.ipynb: exploration de donnees reproductible.docs/eda_summary.md: synthese EDA pour la soutenance.
Option session courante uniquement (recommandee):
Set-ExecutionPolicy -Scope Process -ExecutionPolicy BypassOu execution one-shot:
powershell -ExecutionPolicy Bypass -File .\scripts\setup.ps1.\scripts\setup.ps1Forcer une reinstallation des dependances:
.\scripts\setup.ps1 -ForceInstall.\scripts\run_train.ps1Forcer un nouvel entrainement (ignorer cache):
.\scripts\run_train.ps1 -ForceRetrainAvec config personnalisee:
.\scripts\run_train.ps1 -ConfigPath configs/train_config.yaml.\scripts\run_api.ps1
Start-Process http://127.0.0.1:8000/Routes utiles:
- Interface web:
http://127.0.0.1:8000/ - Dashboard performance medecins:
http://127.0.0.1:8000/performance-dashboard - Documentation API (Swagger):
http://127.0.0.1:8000/docs - Health:
http://127.0.0.1:8000/health - Endpoint metriques dashboard:
http://127.0.0.1:8000/performance
Resolution automatique des metriques:
- Priorite 1: variable d'environnement
METRICS_PATH. - Priorite 2: fichier
metrics.jsonvoisin duMODEL_PATHcharge. - Priorite 3:
models/latest/metrics.json.
Invoke-RestMethod http://127.0.0.1:8000/health | ConvertTo-JsonTest prediction sur la premiere ligne de data.csv:
$row = Import-Csv data.csv | Select-Object -First 1
$features = @{}
foreach ($p in $row.PSObject.Properties) {
if ([string]::IsNullOrWhiteSpace($p.Name)) { continue }
if ($p.Name -in @('id','diagnosis')) { continue }
if ($p.Name -like 'Unnamed*') { continue }
if ([string]::IsNullOrWhiteSpace([string]$p.Value)) { continue }
$features[$p.Name.Trim().Replace(' ','_')] = [double]$p.Value
}
$body = @{features=$features} | ConvertTo-Json -Depth 6
Invoke-RestMethod -Uri http://127.0.0.1:8000/predict -Method Post -ContentType 'application/json' -Body $body | ConvertTo-Json -Depth 6$env:PYTHONPATH='src'
python -m notebook notebooks/01_eda_wisconsin.ipynbSi notebook n'est pas installe:
pip install notebook
python -m notebook notebooks/01_eda_wisconsin.ipynb.\scripts\monitor.ps1Ce script affiche:
- sante API,
- metriques dashboard via
/performance, - test rapide
/predict, - memoire process API (si local Python),
- espace disque (drives),
- taille totale projet,
- taille detaillee des artefacts
models/.
Nettoyage standard:
.\scripts\clean.ps1Nettoyage profond (inclut models/latest):
.\scripts\clean.ps1 -DeepPurge cache pip:
.\scripts\clean.ps1 -PipCache$env:PYTHONPATH='src'
pytest -q testsDemarrage standard:
docker compose upRebuild image (si dependances/Dockerfile changent):
docker compose up --buildArret:
docker compose down- Pousser le projet sur GitHub.
- Sur Render:
New +->Web Service-> connecter le repo. - Parametres service:
- Runtime:
Docker - Branch:
main(ou ta branche de release) - Region: la plus proche de vos utilisateurs
- Health Check Path:
/health
- Variables d'environnement (optionnelles):
MODEL_PATH=/app/models/latest/model.ptMETRICS_PATH=/app/models/latest/metrics.json
- Lancer le deploy.
Notes importantes:
- Le conteneur demarre l'API sur le port fourni par l'environnement cloud (
PORT). - Si
model.ptest absent dans l'image, le conteneur entraine automatiquement un modele avant de lancer l'API. - L'interface est servie sur la racine
/, donc une seule URL suffit pour API + dashboard.
- Initialisation avec cache des dependances (
requirementshash). - Cache d'entrainement par signature (evite les re-train inutiles).
num_workers=0etpin_memory=Falseen CPU.- Nettoyage memoire periodique (
cleanup_memory+gc). - Nettoyage artefacts/caches via
scripts/clean.ps1. - Docker relance API sans rebuild systematique.
Voir:
docs/data_governance.mddocs/model_card.mddocs/production_checklist.mddocs/eda_summary.md
Points cles:
- pas d'identifiants patients dans les entrees modele,
- tracabilite des versions et seuils,
- controle de la sensibilite cible,
- revue interne avant release.
configs/
docs/
models/
scripts/
src/breast_cancer_ai/
tests/
data.csv
Dockerfile
docker-compose.yml
requirements.txt
- Ajouter pipeline imagerie MIAS separe.
- Ajouter la route API
/predict_image. - Ajouter calibration avancee (courbe de calibration + decision curve).
- Ajouter CI (tests + lint) pour collaboration a 5.