project5 / model /Makefile
GitHub Action
Deploy to HuggingFace Spaces from main branch
66a0674
# Makefile pour la génération et gestion du modèle ML
.PHONY: help model train validate clean info backup restore test
# Variables
PYTHON = python
MODEL_FILE = model.pkl
MODEL_INFO = model_info.json
BACKUP_DIR = backup
TIMESTAMP = $(shell date +%Y%m%d_%H%M%S)
# Couleurs pour l'affichage
GREEN = \033[0;32m
YELLOW = \033[0;33m
RED = \033[0;31m
NC = \033[0m
# Help - Affiche l'aide
help: ## Affiche cette aide
@echo "$(GREEN)Makefile pour la gestion du modele ML$(NC)"
@echo ""
@echo "$(YELLOW)Generation du modele:$(NC)"
@echo " $(YELLOW)model $(NC) Alias pour train"
@echo " $(YELLOW)train $(NC) Genere le modele ML via model.py"
@echo " $(YELLOW)retrain $(NC) Force la regeneration du modele"
@echo " $(YELLOW)setup $(NC) Configuration et generation complete"
@echo ""
@echo "$(YELLOW)Validation et tests:$(NC)"
@echo " $(YELLOW)validate $(NC) Valide l'existence et l'integrite du modele"
@echo " $(YELLOW)test $(NC) Lance les tests de validation du modele"
@echo " $(YELLOW)test-prediction $(NC) Test une prediction simple"
@echo ""
@echo "$(YELLOW)Gestion et maintenance:$(NC)"
@echo " $(YELLOW)info $(NC) Affiche les informations detaillees du modele"
@echo " $(YELLOW)model-size $(NC) Affiche la taille des fichiers du modele"
@echo " $(YELLOW)backup $(NC) Sauvegarde le modele actuel"
@echo " $(YELLOW)restore $(NC) Restaure le dernier modele sauvegarde"
@echo " $(YELLOW)list-backups $(NC) Liste toutes les sauvegardes disponibles"
@echo " $(YELLOW)clean $(NC) Supprime les fichiers du modele actuel"
@echo " $(YELLOW)clean-all $(NC) Supprime tout (modele + sauvegardes)"
@echo ""
@echo "$(YELLOW)Environnement et verifications:$(NC)"
@echo " $(YELLOW)check-deps $(NC) Verifie les dependances Python"
@echo " $(YELLOW)check-db $(NC) Verifie la connexion a la base de donnees"
# Génération du modèle
model: train ## Alias pour train
train: ## Génère le modèle ML via model.py
@echo "$(GREEN)Generation du modele de Machine Learning...$(NC)"
@if [ ! -f "$(MODEL_FILE)" ]; then \
echo "$(YELLOW)Aucun modele existant trouve. Generation d'un nouveau modele...$(NC)"; \
else \
echo "$(YELLOW)Un modele existant a ete trouve. Sauvegarde avant regeneration...$(NC)"; \
$(MAKE) backup; \
fi
$(PYTHON) model.py
@echo "$(GREEN)✅ Modele genere avec succes!$(NC)"
@if [ -f "$(MODEL_INFO)" ]; then \
echo "$(YELLOW)Informations du modele:$(NC)"; \
cat $(MODEL_INFO) | head -10; \
fi
retrain: clean train ## Force la régénération du modèle
# Validation et tests
validate: ## Valide l'existence et l'intégrité du modèle
@echo "$(GREEN)Validation du modele...$(NC)"
@if [ ! -f "$(MODEL_FILE)" ]; then \
echo "$(RED)❌ Fichier modele manquant: $(MODEL_FILE)$(NC)"; \
exit 1; \
else \
echo "$(GREEN)✅ Fichier modele trouve: $(MODEL_FILE)$(NC)"; \
fi
@if [ ! -f "$(MODEL_INFO)" ]; then \
echo "$(RED)❌ Fichier d'information manquant: $(MODEL_INFO)$(NC)"; \
exit 1; \
else \
echo "$(GREEN)✅ Fichier d'information trouve: $(MODEL_INFO)$(NC)"; \
fi
@echo "$(GREEN)✅ Modele valide avec succes!$(NC)"
test: validate ## Lance les tests de validation du modèle
@echo "$(GREEN)Test de chargement du modele...$(NC)"
@$(PYTHON) -c "import joblib; model = joblib.load('$(MODEL_FILE)'); print('✅ Modele charge avec succes'); print(f'Type: {type(model).__name__}'); import json; info = json.load(open('$(MODEL_INFO)')); print(f'Accuracy: {info.get(\"accuracy\", \"N/A\")}'); print(f'Features: {len(info.get(\"features\", []))} variables')"
test-prediction: validate ## Test une prédiction simple
@echo "$(GREEN)Test de prediction...$(NC)"
@$(PYTHON) -c "import joblib; import json; import numpy as np; model = joblib.load('$(MODEL_FILE)'); info = json.load(open('$(MODEL_INFO)')); features = info['features']; test_data = np.random.random((1, len(features))); pred = model.predict(test_data); print(f'✅ Prediction test reussie: {pred[0]:.4f}')"
# Gestion et maintenance
info: ## Affiche les informations détaillées du modèle
@echo "$(GREEN)Informations du modele:$(NC)"
@if [ -f "$(MODEL_INFO)" ]; then \
cat $(MODEL_INFO); \
else \
echo "$(RED)❌ Fichier d'information non trouve$(NC)"; \
exit 1; \
fi
model-size: ## Affiche la taille des fichiers du modèle
@echo "$(GREEN)Taille des fichiers:$(NC)"
@if [ -f "$(MODEL_FILE)" ]; then \
ls -lh $(MODEL_FILE) | awk '{print "Modele: " $$5 " (" $$9 ")"}'; \
fi
@if [ -f "$(MODEL_INFO)" ]; then \
ls -lh $(MODEL_INFO) | awk '{print "Info: " $$5 " (" $$9 ")"}'; \
fi
backup: ## Sauvegarde le modèle actuel
@echo "$(GREEN)Sauvegarde du modele...$(NC)"
@mkdir -p $(BACKUP_DIR)
@if [ -f "$(MODEL_FILE)" ]; then \
cp $(MODEL_FILE) $(BACKUP_DIR)/model_$(TIMESTAMP).pkl; \
echo "$(GREEN)✅ Modele sauvegarde: $(BACKUP_DIR)/model_$(TIMESTAMP).pkl$(NC)"; \
fi
@if [ -f "$(MODEL_INFO)" ]; then \
cp $(MODEL_INFO) $(BACKUP_DIR)/model_info_$(TIMESTAMP).json; \
echo "$(GREEN)✅ Info sauvegardee: $(BACKUP_DIR)/model_info_$(TIMESTAMP).json$(NC)"; \
fi
restore: ## Restaure le dernier modèle sauvegardé
@echo "$(GREEN)Restauration du dernier modele...$(NC)"
@if [ ! -d "$(BACKUP_DIR)" ]; then \
echo "$(RED)❌ Aucune sauvegarde trouvee$(NC)"; \
exit 1; \
fi
@LATEST_MODEL=$$(ls -t $(BACKUP_DIR)/model_*.pkl 2>/dev/null | head -1); \
LATEST_INFO=$$(ls -t $(BACKUP_DIR)/model_info_*.json 2>/dev/null | head -1); \
if [ -n "$$LATEST_MODEL" ]; then \
cp "$$LATEST_MODEL" $(MODEL_FILE); \
echo "$(GREEN)✅ Modele restaure: $$LATEST_MODEL$(NC)"; \
fi; \
if [ -n "$$LATEST_INFO" ]; then \
cp "$$LATEST_INFO" $(MODEL_INFO); \
echo "$(GREEN)✅ Info restauree: $$LATEST_INFO$(NC)"; \
fi
list-backups: ## Liste toutes les sauvegardes disponibles
@echo "$(GREEN)Sauvegardes disponibles:$(NC)"
@if [ -d "$(BACKUP_DIR)" ]; then \
ls -la $(BACKUP_DIR)/ | grep -E '\.(pkl|json)$$' | awk '{print $$9 " (" $$5 " bytes, " $$6 " " $$7 " " $$8 ")"}' || echo "$(YELLOW)Aucune sauvegarde trouvee$(NC)"; \
else \
echo "$(YELLOW)Aucun dossier de sauvegarde$(NC)"; \
fi
clean: ## Supprime les fichiers du modèle actuel
@echo "$(GREEN)Nettoyage des fichiers du modele...$(NC)"
@if [ -f "$(MODEL_FILE)" ]; then \
rm $(MODEL_FILE); \
echo "$(GREEN)$(MODEL_FILE) supprime$(NC)"; \
fi
@if [ -f "$(MODEL_INFO)" ]; then \
rm $(MODEL_INFO); \
echo "$(GREEN)$(MODEL_INFO) supprime$(NC)"; \
fi
clean-all: clean ## Supprime tout (modèle + sauvegardes)
@echo "$(GREEN)Nettoyage complet...$(NC)"
@if [ -d "$(BACKUP_DIR)" ]; then \
rm -rf $(BACKUP_DIR); \
echo "$(GREEN)✅ Dossier de sauvegarde supprime$(NC)"; \
fi
# Environnement et dépendances
check-deps: ## Vérifie les dépendances Python
@echo "$(GREEN)Verification des dependances...$(NC)"
@$(PYTHON) -c "import sklearn, pandas, numpy, joblib; print('✅ Toutes les dependances sont disponibles')" || (echo "$(RED)❌ Dependances manquantes$(NC)" && exit 1)
check-db: ## Vérifie la connexion à la base de données
@echo "$(GREEN)Verification de la connexion DB...$(NC)"
@$(PYTHON) -c "from sqlalchemy import create_engine; import os; engine = create_engine(os.getenv('DATABASE_URL', 'postgresql://user:password@localhost/dbname')); engine.connect(); print('✅ Connexion DB reussie')" || (echo "$(RED)❌ Erreur de connexion DB$(NC)" && exit 1)
# Workflow complet
setup: check-deps check-db train ## Configuration et génération complète
@echo "$(GREEN)✅ Setup complet termine!$(NC)"
# Commande par défaut
.DEFAULT_GOAL := help