anomalyOS / mlops /promote_model.py
CaffeinatedCoding's picture
Upload folder using huggingface_hub
e72f783 verified
"""
Model promotion and deployment
"""
import logging
from typing import Dict, Any
from datetime import datetime
logger = logging.getLogger(__name__)
class ModelPromoter:
"""
Handles model promotion and versioning for deployment.
"""
def __init__(self, models_dir: str = "models/"):
"""
Initialize model promoter.
Args:
models_dir: Directory containing models
"""
self.models_dir = models_dir
logger.info(f"ModelPromoter initialized with models directory: {models_dir}")
def evaluate_model_quality(self, model_metrics: Dict[str, float], thresholds: Dict[str, float]) -> bool:
"""
Evaluate if model meets quality thresholds.
Args:
model_metrics: Model performance metrics
thresholds: Minimum acceptable thresholds
Returns:
True if model passes quality checks
"""
logger.info("Evaluating model quality...")
passes_all = True
for metric, threshold in thresholds.items():
actual = model_metrics.get(metric, 0.0)
if actual < threshold:
logger.warning(f"Model fails {metric} check: {actual} < {threshold}")
passes_all = False
else:
logger.info(f"Model passes {metric} check: {actual} >= {threshold}")
return passes_all
def promote_model(self, model_name: str, version: str, metrics: Dict[str, float]) -> bool:
"""
Promote model to production.
Args:
model_name: Name of the model
version: Model version
metrics: Performance metrics
Returns:
True if promotion successful
"""
logger.info(f"Promoting model {model_name} v{version} to production")
# Define quality thresholds
thresholds = {
"auroc": 0.90,
"f1_score": 0.85,
"inference_time": 150 # milliseconds
}
# Check quality
if not self.evaluate_model_quality(metrics, thresholds):
logger.error("Model does not meet quality thresholds")
return False
# Promote model
try:
promotion_record = {
"model_name": model_name,
"version": version,
"promoted_at": datetime.now().isoformat(),
"metrics": metrics,
"status": "promoted"
}
logger.info(f"Model promoted successfully: {model_name} v{version}")
return True
except Exception as e:
logger.error(f"Model promotion failed: {e}")
return False
def rollback_model(self, model_name: str, target_version: str) -> bool:
"""
Rollback to a previous model version.
Args:
model_name: Name of the model
target_version: Version to rollback to
Returns:
True if rollback successful
"""
logger.info(f"Rolling back model {model_name} to version {target_version}")
try:
# Implementation for model rollback
logger.info(f"Model rolled back successfully: {model_name} to v{target_version}")
return True
except Exception as e:
logger.error(f"Model rollback failed: {e}")
return False
def compare_models(self, model1_metrics: Dict, model2_metrics: Dict) -> Dict[str, Any]:
"""
Compare two model versions.
Args:
model1_metrics: Metrics of first model
model2_metrics: Metrics of second model
Returns:
Comparison report
"""
logger.info("Comparing model versions...")
comparison = {}
for metric in model1_metrics.keys():
diff = model2_metrics.get(metric, 0) - model1_metrics.get(metric, 0)
comparison[f"{metric}_diff"] = diff
return comparison