oc_p5-dev / scripts /register_model_to_hf.py
ASI-Engineer's picture
Upload folder using huggingface_hub
04e665f verified
raw
history blame
5.32 kB
#!/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)