Spaces:
Sleeping
Sleeping
| #!/usr/bin/env python3 | |
| """ | |
| Script pour enregistrer le modèle MLflow dans Hugging Face Hub. | |
| Usage: | |
| python scripts/register_model_to_hf.py | |
| Prérequis: | |
| - HF_TOKEN configuré dans l'environnement ou .env | |
| - Modèle entraîné dans MLflow | |
| """ | |
| import os | |
| import shutil | |
| from pathlib import Path | |
| import mlflow | |
| import mlflow.sklearn | |
| from huggingface_hub import HfApi, login | |
| def register_model_to_hf( | |
| run_id: str, | |
| hf_repo_id: str = "ASI-Engineer/employee-turnover-model", | |
| model_name: str = "Employee_Turnover_XGBoost", | |
| ): | |
| """ | |
| Enregistre le modèle MLflow dans le Model Registry puis l'exporte vers HF Hub. | |
| Args: | |
| run_id: ID du run MLflow contenant le meilleur modèle | |
| hf_repo_id: Repository Hugging Face (format: username/repo-name) | |
| model_name: Nom du modèle dans MLflow Model Registry | |
| """ | |
| print("=" * 80) | |
| print("🚀 ENREGISTREMENT DU MODÈLE DANS HUGGING FACE HUB") | |
| print("=" * 80) | |
| print() | |
| # Configuration MLflow | |
| mlflow.set_tracking_uri("sqlite:///mlflow.db") | |
| # 1. Enregistrer dans MLflow Model Registry | |
| print("📦 Étape 1: Enregistrement dans MLflow Model Registry...") | |
| model_uri = f"runs:/{run_id}/model" | |
| try: | |
| # Créer ou mettre à jour le modèle dans le registry | |
| model_version = mlflow.register_model(model_uri, model_name) | |
| print(f" ✅ Modèle enregistré: {model_name} version {model_version.version}") | |
| print(f" 📍 Run ID: {run_id}") | |
| except Exception as e: | |
| print(f" ℹ️ Modèle déjà enregistré ou erreur: {e}") | |
| model_version = None | |
| print() | |
| # 2. Charger le modèle | |
| print("📥 Étape 2: Chargement du modèle depuis MLflow...") | |
| # Essayer depuis le Model Registry d'abord | |
| try: | |
| model = mlflow.sklearn.load_model(f"models:/{model_name}/latest") | |
| print(f" ✅ Modèle chargé depuis Model Registry: {model_name}") | |
| except Exception: | |
| # Fallback: charger depuis le run | |
| model = mlflow.sklearn.load_model(model_uri) | |
| print(f" ✅ Modèle chargé depuis run: {run_id[:8]}") | |
| print(f" 📦 Type: {type(model).__name__}") | |
| print() | |
| # 3. Exporter vers dossier temporaire | |
| print("💾 Étape 3: Export du modèle...") | |
| export_dir = Path("./model_export") | |
| export_dir.mkdir(exist_ok=True) | |
| # Sauvegarder le modèle au format MLflow | |
| mlflow.sklearn.save_model(model, str(export_dir / "model")) | |
| # Créer un README pour HF | |
| readme_content = f"""--- | |
| tags: | |
| - employee-turnover | |
| - xgboost | |
| - mlflow | |
| - classification | |
| library_name: scikit-learn | |
| --- | |
| # Employee Turnover Prediction Model | |
| Modèle XGBoost pour prédire le turnover des employés. | |
| ## Métriques | |
| - **F1-Score**: Optimisé pour classes déséquilibrées | |
| - **Algorithme**: XGBoost avec SMOTE | |
| - **MLflow Run ID**: `{run_id}` | |
| ## Utilisation | |
| ```python | |
| import mlflow | |
| # Charger depuis Hugging Face Hub | |
| model = mlflow.sklearn.load_model("hf://{hf_repo_id}") | |
| # Prédiction | |
| predictions = model.predict(X) | |
| ``` | |
| ## Preprocessing | |
| Les artifacts de preprocessing (scaler, encoders) sont disponibles dans MLflow. | |
| ## Repository | |
| [GitHub - OC_P5](https://github.com/chaton59/OC_P5) | |
| """ | |
| with open(export_dir / "README.md", "w", encoding="utf-8") as f: | |
| f.write(readme_content) | |
| print(f" ✅ Modèle exporté vers: {export_dir}") | |
| print() | |
| # 4. Upload vers Hugging Face Hub | |
| print("☁️ Étape 4: Upload vers Hugging Face Hub...") | |
| # Login HF (utilise HF_TOKEN depuis env) | |
| hf_token = os.getenv("HF_TOKEN") | |
| if not hf_token: | |
| print(" ⚠️ HF_TOKEN non trouvé dans l'environnement") | |
| print( | |
| " 💡 Conseil: Créez un token sur https://huggingface.co/settings/tokens" | |
| ) | |
| print(" 💡 Puis: export HF_TOKEN='your_token_here'") | |
| return False | |
| try: | |
| login(token=hf_token, add_to_git_credential=False) | |
| print(" ✅ Authentification Hugging Face réussie") | |
| # Upload | |
| api = HfApi() | |
| api.create_repo( | |
| repo_id=hf_repo_id, repo_type="model", exist_ok=True, private=False | |
| ) | |
| api.upload_folder( | |
| repo_id=hf_repo_id, | |
| folder_path=str(export_dir), | |
| repo_type="model", | |
| ) | |
| print(f" ✅ Modèle uploadé vers: https://huggingface.co/{hf_repo_id}") | |
| print() | |
| # Nettoyage | |
| shutil.rmtree(export_dir) | |
| print(" 🧹 Dossier temporaire nettoyé") | |
| return True | |
| except Exception as e: | |
| print(f" ❌ Erreur lors de l'upload: {e}") | |
| return False | |
| finally: | |
| print() | |
| print("=" * 80) | |
| print("✅ ENREGISTREMENT TERMINÉ") | |
| print("=" * 80) | |
| print() | |
| print(f"🔗 Modèle disponible sur: https://huggingface.co/{hf_repo_id}") | |
| print("📝 Pour utiliser dans app.py:") | |
| print(f' model = mlflow.sklearn.load_model("hf://{hf_repo_id}")') | |
| if __name__ == "__main__": | |
| # Utiliser le meilleur run (le plus récent avec modèle) | |
| RUN_ID = "40e43c8e425345bab3d19f27eb8fe5d8" | |
| success = register_model_to_hf( | |
| run_id=RUN_ID, hf_repo_id="ASI-Engineer/employee-turnover-model" | |
| ) | |
| if not success: | |
| print("\n⚠️ Enregistrement incomplet. Vérifiez HF_TOKEN.") | |
| exit(1) | |