ASI-Engineer commited on
Commit
fc65c4d
·
verified ·
1 Parent(s): ff01128

Upload folder using huggingface_hub

Browse files
Files changed (4) hide show
  1. app.py +20 -2
  2. src/Dockerfile +6 -5
  3. src/gradio_ui.py +35 -17
  4. src/models.py +20 -8
app.py CHANGED
@@ -6,11 +6,29 @@ Lance l'interface Gradio pour la prédiction de turnover.
6
  """
7
  import sys
8
  import os
 
9
 
10
- from src.gradio_ui import launch_standalone
 
 
 
 
 
 
 
11
 
12
  # Ajouter le répertoire src au path
13
  sys.path.insert(0, os.path.join(os.path.dirname(__file__), "src"))
14
 
15
  if __name__ == "__main__":
16
- launch_standalone()
 
 
 
 
 
 
 
 
 
 
 
6
  """
7
  import sys
8
  import os
9
+ import logging
10
 
11
+ # Configurer le logging avant toute chose
12
+ logging.basicConfig(
13
+ level=logging.DEBUG,
14
+ format="%(asctime)s - %(levelname)s - %(message)s",
15
+ stream=sys.stdout,
16
+ force=True,
17
+ )
18
+ logger = logging.getLogger(__name__)
19
 
20
  # Ajouter le répertoire src au path
21
  sys.path.insert(0, os.path.join(os.path.dirname(__file__), "src"))
22
 
23
  if __name__ == "__main__":
24
+ try:
25
+ logger.info("🚀 Démarrage de l'application Gradio...")
26
+ from src.gradio_ui import launch_standalone
27
+
28
+ launch_standalone()
29
+ except KeyboardInterrupt:
30
+ logger.info("⏹️ Application arrêtée par l'utilisateur")
31
+ sys.exit(0)
32
+ except Exception as e:
33
+ logger.error(f"❌ Erreur fatale: {e}", exc_info=True)
34
+ sys.exit(1)
src/Dockerfile CHANGED
@@ -35,10 +35,11 @@ EXPOSE 7860
35
  ENV DEBUG=false
36
  ENV LOG_LEVEL=INFO
37
  ENV API_KEY=change-me-in-production
 
38
 
39
- # Healthcheck - vérifier que FastAPI répond sur /health
40
- HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
41
- CMD curl -f http://localhost:7860/health || exit 1
42
 
43
- # Commande de démarrage - FastAPI avec Gradio monté sur /ui
44
- CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]
 
35
  ENV DEBUG=false
36
  ENV LOG_LEVEL=INFO
37
  ENV API_KEY=change-me-in-production
38
+ ENV PYTHONUNBUFFERED=1
39
 
40
+ # Healthcheck - vérifier que Gradio répond
41
+ HEALTHCHECK --interval=30s --timeout=10s --start-period=120s --retries=3 \
42
+ CMD curl -f http://localhost:7860/ || exit 1
43
 
44
+ # Commande de démarrage - Lancer l'app Gradio directement
45
+ CMD ["python", "app.py"]
src/gradio_ui.py CHANGED
@@ -586,37 +586,55 @@ def create_gradio_interface():
586
  def launch_standalone():
587
  """Lance Gradio en mode standalone (pour HuggingFace Spaces)."""
588
  import sys
 
589
 
590
- print("🚀 Démarrage de l'application Gradio...", flush=True)
591
- print(f"Python version: {sys.version}", flush=True)
 
 
 
 
 
 
 
592
 
593
  # Pré-charger le modèle pour éviter le timeout au premier appel
594
- print("📦 Pré-chargement du modèle...", flush=True)
595
  try:
596
  from src.models import load_model
597
 
598
  model = load_model()
599
- print(f"✅ Modèle chargé: {type(model).__name__}", flush=True)
600
  except Exception as e:
601
- print(f"⚠️ Erreur chargement modèle: {e}", flush=True)
 
602
 
603
- print("🎨 Création de l'interface Gradio...", flush=True)
604
- demo = create_gradio_interface()
 
 
 
 
 
 
 
605
 
606
  # Configuration pour HuggingFace Spaces
607
- # Ne pas utiliser queue() qui peut causer des problèmes sur HF Spaces
608
- # car il nécessite un serveur websocket supplémentaire
609
-
610
- print("🌐 Lancement du serveur sur 0.0.0.0:7860...", flush=True)
611
  sys.stdout.flush()
612
  sys.stderr.flush()
613
 
614
- demo.launch(
615
- server_name="0.0.0.0",
616
- server_port=7860,
617
- share=False,
618
- show_error=True,
619
- )
 
 
 
 
 
620
 
621
 
622
  # Pour lancer en standalone
 
586
  def launch_standalone():
587
  """Lance Gradio en mode standalone (pour HuggingFace Spaces)."""
588
  import sys
589
+ import logging
590
 
591
+ logging.basicConfig(
592
+ level=logging.DEBUG,
593
+ format="%(asctime)s - %(levelname)s - %(message)s",
594
+ force=True,
595
+ )
596
+ logger = logging.getLogger(__name__)
597
+
598
+ logger.info("🚀 Démarrage de l'application Gradio...")
599
+ logger.info(f"Python version: {sys.version}")
600
 
601
  # Pré-charger le modèle pour éviter le timeout au premier appel
602
+ logger.info("📦 Pré-chargement du modèle...")
603
  try:
604
  from src.models import load_model
605
 
606
  model = load_model()
607
+ logger.info(f"✅ Modèle chargé: {type(model).__name__}")
608
  except Exception as e:
609
+ logger.warning(f"⚠️ Erreur chargement modèle au démarrage: {e}")
610
+ logger.warning("L'application continuera sans préchargement du modèle")
611
 
612
+ try:
613
+ logger.info("🎨 Création de l'interface Gradio...")
614
+ demo = create_gradio_interface()
615
+ logger.info("✅ Interface Gradio créée avec succès")
616
+ except Exception as e:
617
+ logger.error(
618
+ f"❌ Erreur lors de la création de l'interface: {e}", exc_info=True
619
+ )
620
+ sys.exit(1)
621
 
622
  # Configuration pour HuggingFace Spaces
623
+ logger.info("🌐 Lancement du serveur sur 0.0.0.0:7860...")
 
 
 
624
  sys.stdout.flush()
625
  sys.stderr.flush()
626
 
627
+ try:
628
+ demo.launch(
629
+ server_name="0.0.0.0",
630
+ server_port=7860,
631
+ share=False,
632
+ show_error=True,
633
+ quiet=False,
634
+ )
635
+ except Exception as e:
636
+ logger.error(f"❌ Erreur lors du lancement du serveur: {e}", exc_info=True)
637
+ sys.exit(1)
638
 
639
 
640
  # Pour lancer en standalone
src/models.py CHANGED
@@ -48,15 +48,24 @@ def load_model(force_reload: bool = False) -> Any:
48
 
49
  try:
50
  import joblib
 
51
 
52
- print(f"🔄 Chargement du modèle depuis HF Hub: {HF_MODEL_REPO}")
53
 
54
- # Télécharger le modèle depuis Hugging Face Hub
55
- model_path = hf_hub_download(
56
- repo_id=HF_MODEL_REPO, filename=MODEL_FILENAME, repo_type="model"
57
- )
58
 
59
- print(f"📦 Modèle téléchargé: {model_path}")
 
 
 
 
 
 
 
 
 
 
 
60
 
61
  # Charger le modèle avec joblib
62
  model = joblib.load(model_path)
@@ -64,12 +73,15 @@ def load_model(force_reload: bool = False) -> Any:
64
  # Mettre en cache
65
  _model_cache = model
66
 
67
- print(f"✅ Modèle chargé avec succès: {type(model).__name__}")
68
  return model
69
 
70
  except Exception as e:
 
 
 
71
  error_msg = f"❌ Erreur lors du chargement du modèle: {str(e)}"
72
- print(error_msg)
73
  raise HTTPException(
74
  status_code=500,
75
  detail={
 
48
 
49
  try:
50
  import joblib
51
+ import logging
52
 
53
+ logger = logging.getLogger(__name__)
54
 
55
+ logger.info(f"🔄 Chargement du modèle depuis HF Hub: {HF_MODEL_REPO}")
 
 
 
56
 
57
+ # Télécharger le modèle depuis Hugging Face Hub
58
+ try:
59
+ model_path = hf_hub_download(
60
+ repo_id=HF_MODEL_REPO,
61
+ filename=MODEL_FILENAME,
62
+ repo_type="model",
63
+ )
64
+ except Exception as download_error:
65
+ logger.error(f"Erreur téléchargement HF Hub: {download_error}")
66
+ raise
67
+
68
+ logger.info(f"📦 Modèle téléchargé: {model_path}")
69
 
70
  # Charger le modèle avec joblib
71
  model = joblib.load(model_path)
 
73
  # Mettre en cache
74
  _model_cache = model
75
 
76
+ logger.info(f"✅ Modèle chargé avec succès: {type(model).__name__}")
77
  return model
78
 
79
  except Exception as e:
80
+ import logging
81
+
82
+ logger = logging.getLogger(__name__)
83
  error_msg = f"❌ Erreur lors du chargement du modèle: {str(e)}"
84
+ logger.error(error_msg)
85
  raise HTTPException(
86
  status_code=500,
87
  detail={