import mlflow from typing import Dict, Any, Optional from pathlib import Path from mlpipeline.logging.logger import get_logger logger = get_logger(__name__) class MLflowManager: def __init__(self, tracking_uri: str, experiment_name: str): self.tracking_uri = tracking_uri self.experiment_name = experiment_name mlflow.set_tracking_uri(tracking_uri) mlflow.set_experiment(experiment_name) logger.info(f"MLflow tracking URI: {tracking_uri}") logger.info(f"MLflow experiment: {experiment_name}") def start_run(self, run_name: Optional[str] = None): mlflow.start_run(run_name=run_name) logger.info(f"Started MLflow run: {run_name or 'auto'}") def end_run(self): mlflow.end_run() logger.info("Ended MLflow run") def log_params(self, params: Dict[str, Any]): mlflow.log_params(params) logger.info(f"Logged {len(params)} parameters") def log_metrics(self, metrics: Dict[str, float], step: Optional[int] = None): mlflow.log_metrics(metrics, step=step) logger.info(f"Logged {len(metrics)} metrics") def log_metric(self, key: str, value: float, step: Optional[int] = None): mlflow.log_metric(key, value, step=step) def log_artifact(self, local_path: str, artifact_path: Optional[str] = None): mlflow.log_artifact(local_path, artifact_path) logger.info(f"Logged artifact: {local_path}") def log_model(self, model: Any, artifact_path: str, **kwargs): mlflow.sklearn.log_model(model, artifact_path, **kwargs) logger.info(f"Logged model: {artifact_path}") def register_model(self, model_uri: str, name: str) -> Any: result = mlflow.register_model(model_uri, name) logger.info(f"Registered model: {name}") return result def set_tag(self, key: str, value: str): mlflow.set_tag(key, value) def set_tags(self, tags: Dict[str, str]): mlflow.set_tags(tags) logger.info(f"Set {len(tags)} tags")