Spaces:
Sleeping
Sleeping
| from __future__ import annotations | |
| import os | |
| from pathlib import Path | |
| import mlflow | |
| import mlflow.lightgbm | |
| from mlflow.tracking import MlflowClient | |
| try: | |
| from src.mlflow_config import DEFAULT_EXPERIMENT_NAME | |
| except Exception: # pragma: no cover - fallback si import impossible | |
| DEFAULT_EXPERIMENT_NAME = "OC_P6_Credit_Scoring" | |
| # Nom du modèle enregistré et stage cible | |
| MODEL_NAME = "LightGBM" | |
| MODEL_STAGE = "Production" | |
| def resolve_tracking_uri() -> str: | |
| env_uri = os.getenv("MLFLOW_TRACKING_URI") | |
| if env_uri: | |
| return env_uri | |
| local_store = Path("mlruns") | |
| if local_store.exists(): | |
| return local_store.resolve().as_uri() | |
| return mlflow.get_tracking_uri() | |
| tracking_uri = resolve_tracking_uri() | |
| mlflow.set_tracking_uri(tracking_uri) | |
| client = MlflowClient() | |
| model_uri = None | |
| # 1) Essaye le Model Registry avec stage (si présent) | |
| try: | |
| latest_versions = client.get_latest_versions(MODEL_NAME, stages=[MODEL_STAGE]) | |
| if latest_versions: | |
| model_version = latest_versions[0].version | |
| model_uri = f"models:/{MODEL_NAME}/{model_version}" | |
| except Exception: | |
| model_uri = None | |
| # 2) Sinon, prend la dernière version enregistrée (tous stages) | |
| if model_uri is None: | |
| try: | |
| versions = client.search_model_versions(f"name='{MODEL_NAME}'") | |
| if versions: | |
| latest = max(versions, key=lambda v: int(v.version)) | |
| model_uri = f"models:/{MODEL_NAME}/{latest.version}" | |
| except Exception: | |
| model_uri = None | |
| # 3) Sinon, fallback sur le dernier run de l'expérience | |
| if model_uri is None: | |
| experiment_name = os.getenv("MLFLOW_EXPERIMENT_NAME", DEFAULT_EXPERIMENT_NAME) | |
| experiment = mlflow.get_experiment_by_name(experiment_name) | |
| if experiment: | |
| runs = mlflow.search_runs( | |
| [experiment.experiment_id], | |
| order_by=["start_time DESC"], | |
| max_results=1, | |
| ) | |
| if not runs.empty: | |
| run_id = runs.loc[0, "run_id"] | |
| model_uri = f"runs:/{run_id}/model" | |
| if model_uri is None: | |
| raise RuntimeError( | |
| "Aucun modèle trouvé. Vérifie MLFLOW_TRACKING_URI, le Model Registry, " | |
| "ou l'expérience MLflow." | |
| ) | |
| # Charge et sauvegarde en fichier simple | |
| model = mlflow.lightgbm.load_model(model_uri) | |
| output_path = Path("models") / "lightgbm.txt" | |
| output_path.parent.mkdir(parents=True, exist_ok=True) | |
| model.save_model(str(output_path)) | |
| print(f"Modèle exporté depuis {model_uri} vers {output_path}") |