Architecture de cache hybride basée sur 6 entités métier avec gestion des dépendances, versioning automatique et récupération intelligente. Aucune dépendance aux run IDs - tout est basé sur des clés métier sémantiques.
# Recherche par contexte métier (même stratégie, crypto, timeframe)# Date la plus récente compatiblecontext_match=find_by_context(crypto,timeframe,strategy,model_type)
# Meilleur modèle disponible pour ce crypto/timeframe# Classé par performance descendantebest_available=find_best_by_performance(crypto,timeframe,model_type)
classCVNTradeCacheManager:def__init__(self,mlflow_uri:str):self.client=MlflowClient(mlflow_uri)self.cache_strategies={CacheLevel.EXACT:ExactMatchStrategy(),CacheLevel.CONTEXT:ContextMatchStrategy(),CacheLevel.BEST_AVAILABLE:BestAvailableStrategy(),CacheLevel.DEFAULT:DefaultConfigStrategy()}defget_cached_entity(self,entity_type:EntityType,criteria:Dict)->CacheResult:"""Récupère une entité avec fallback automatique"""defstore_entity(self,entity_type:EntityType,key:str,data:Any,metadata:Dict):"""Stocke une entité avec métadonnées standardisées"""definvalidate_dependencies(self,entity_key:str):"""Invalide les entités dépendantes"""
classEntityRegistry:DEPENDENCIES={EntityType.LABELS:[EntityType.FEATURE_STORE],EntityType.FEATURE_ENGINEERING:[EntityType.FEATURE_STORE,EntityType.LABELS],EntityType.FEATURE_SELECTION:[EntityType.FEATURE_ENGINEERING],EntityType.HPO_PARAMS:[EntityType.FEATURE_SELECTION],EntityType.TRAINED_MODEL:[EntityType.HPO_PARAMS,EntityType.FEATURE_SELECTION]}defget_dependencies(self,entity_type:EntityType)->List[EntityType]:"""Retourne les dépendances d'une entité"""defvalidate_dependencies(self,entity_key:str)->bool:"""Vérifie que toutes les dépendances sont satisfaites"""
classCVNTradeCache:def__init__(self):self.manager=CVNTradeCacheManager()self.registry=EntityRegistry()# API simple pour chaque entitédefget_feature_store(self,crypto:str,timeframe:str,date:str)->FeatureStore:defget_labels(self,crypto:str,timeframe:str,date:str,strategy:str)->Labels:defget_feature_engineering(self,crypto:str,timeframe:str,date:str,strategy:str)->FeatureEngineering:defget_feature_selection(self,crypto:str,timeframe:str,strategy:str,model_type:str)->FeatureSelection:defget_hpo_params(self,crypto:str,timeframe:str,strategy:str,model_type:str)->HpoParams:defget_trained_model(self,crypto:str,timeframe:str,date:str,strategy:str,model_type:str)->TrainedModel:
exportFORCE_RETRAIN=true# Force le réentraînementexportFORCE_HPO=true# Force la ré-optimisation HPOexportFORCE_FEATURE_SELECTION=true# Force la re-sélection de featuresexportFORCE_FEATURE_ENGINEERING=true# Force le re-calcul FEexportFORCE_LABELS=true# Force le re-calcul des labelsexportFORCE_FEATURE_STORE=true# Force le rechargement des donnéesexportCACHE_STRATEGY=flexible# exact|flexible|best_availableexportCACHE_TTL=7d# Durée de vie du cache
classCVNTradeCacheAdmin:def__init__(self,mlflow_uri:str,s3_bucket:str):self.client=MlflowClient(mlflow_uri)self.s3_client=boto3.client('s3')self.bucket=s3_bucketself.cache_manager=CVNTradeCacheManager(mlflow_uri)defcleanup_expired_caches(self,ttl_days:int=30)->Dict[str,int]:"""Nettoie les caches expirés selon la politique TTL"""defverify_cache_integrity(self,entity_type:EntityType=None)->Dict[str,bool]:"""Vérifie l'intégrité des caches et leurs dépendances"""defmigrate_cache_entity(self,source_key:str,target_key:str)->bool:"""Déplace une entité de cache vers une nouvelle clé"""defdelete_cache_entity(self,entity_key:str,cascade:bool=False)->bool:"""Supprime une entité de cache avec option de cascade"""defrebuild_cache_indexes(self)->Dict[str,int]:"""Reconstruit les index de performance et de dépendances"""defgenerate_cache_report(self)->Dict[str,Any]:"""Génère un rapport complet de l'état des caches"""
# Nettoyage des caches expiréspython-msrc.cache.admincleanup--ttl30--dry-run
# Vérification de l'intégritépython-msrc.cache.adminverify--entity-typehpo_params--fix-broken
# Migration d'entitéspython-msrc.cache.adminmigrate\--source"BTCUSDT_15m_SL1.2_TP1.3_H4_xgboost_v1"\--target"BTCUSDT_15m_SL1.2_TP1.3_H4_xgboost_v2"# Suppression avec cascadepython-msrc.cache.admindelete\--entity"BTCUSDT_15m_20251001_SL1.2_TP1.3_H4_FE_v1"\--cascade
# Rapport completpython-msrc.cache.adminreport--outputcache_report.json
# Reconstruction des indexpython-msrc.cache.adminrebuild-indexes
# Statistiques d'utilisationpython-msrc.cache.adminstats--formattable
classCacheCleanupOrchestrator:def__init__(self):self.admin=CVNTradeCacheAdmin()self.policies=CacheCleanupPolicies()defdaily_maintenance(self):"""Maintenance quotidienne automatisée"""# 1. Nettoyer les caches expirésexpired=self.admin.cleanup_expired_caches(ttl_days=30)# 2. Vérifier l'intégritéintegrity=self.admin.verify_cache_integrity()# 3. Optimiser les indexifany(notstatusforstatusinintegrity.values()):self.admin.rebuild_cache_indexes()# 4. Archiver les anciens modèlesself.archive_old_models(keep_best_n=5)# 5. Rapport de maintenancereturnself.admin.generate_cache_report()defemergency_cleanup(self,free_space_gb:float):"""Nettoyage d'urgence pour libérer de l'espace"""# Supprimer par ordre de priorité décroissantestrategies=[lambda:self.cleanup_duplicate_features(),lambda:self.cleanup_failed_experiments(),lambda:self.cleanup_old_hpo_studies(),lambda:self.cleanup_intermediate_models()]forstrategyinstrategies:ifself.get_available_space()>free_space_gb:breakstrategy()
classCVNTradeCacheUIPlugin:"""Plugin MLflow pour interface cache CVNTrade"""defregister_custom_views(self):"""Enregistre les vues personnalisées dans MLflow UI"""@app.route("/cache-dashboard")defcache_dashboard():"""Tableau de bord des caches CVNTrade"""cache_stats=self.get_cache_statistics()returnrender_template("cache_dashboard.html",stats=cache_stats)@app.route("/cache-explorer/<entity_type>")defcache_explorer(entity_type):"""Explorateur d'entités de cache"""entities=self.get_entities_by_type(entity_type)returnrender_template("cache_explorer.html",entities=entities)@app.route("/cache-lineage/<entity_key>")defcache_lineage(entity_key):"""Visualisation de la lignée des dépendances"""lineage=self.build_dependency_graph(entity_key)returnrender_template("cache_lineage.html",lineage=lineage)
MLFLOW_ENRICHED_TAGS={# Tags de navigation"cache.entity_type":str,# feature_store|labels|feature_eng|..."cache.crypto_symbol":str,# BTCUSDT|ETHUSDT"cache.timeframe":str,# 15m|1h|4h|1d"cache.strategy":str,# SL1.2_TP1.3_H4"cache.model_type":str,# xgboost|lightgbm|catboost"cache.version":str,# v1|v2|v3# Tags de qualité"cache.performance_score":float,# Score de performance"cache.data_quality":str,# excellent|good|fair|poor"cache.validation_status":str,# validated|pending|failed# Tags de lifecycle"cache.created_date":str,# 2025-10-02"cache.last_accessed":str,# 2025-10-02T15:30:00Z"cache.access_count":int,# Nombre d'accès"cache.ttl_expires":str,# Date d'expiration# Tags de provenance"cache.source_run_id":str,# Run source original"cache.dependencies":str,# JSON des dépendances"cache.compute_time":float,# Temps de calcul en secondes"cache.data_hash":str,# Hash des données sources# Tags fonctionnels"cache.production_ready":bool,# Prêt pour production"cache.experimental":bool,# Version expérimentale"cache.archived":bool,# Archivé"cache.backup_location":str# Localisation de sauvegarde}
@app.route("/api/cache/entities/<entity_type>")deflist_cache_entities(entity_type):"""API REST pour lister les entités de cache"""entities=cache_manager.list_entities(entity_type)returnjsonify({"entity_type":entity_type,"count":len(entities),"entities":[entity.to_dict()forentityinentities]})@app.route("/api/cache/search")defsearch_caches():"""API de recherche dans les caches"""query=request.args.get('q','')filters=request.args.getlist('filter')results=cache_manager.search(query,filters)returnjsonify({"query":query,"filters":filters,"results":results,"total":len(results)})@app.route("/api/cache/dependency-graph/<entity_key>")defget_dependency_graph(entity_key):"""API pour récupérer le graphe de dépendances"""graph=cache_manager.build_dependency_graph(entity_key)returnjsonify(graph)
Est-ce que cette architecture répond à vos 6 entités métier ?
Les clés sémantiques sont-elles suffisamment expressives ?
La hiérarchie de fallback est-elle appropriée ?
L'interface d'API vous convient-elle ?
La structure S3 est-elle optimale pour vos besoins ?
Les fonctions d'administration couvrent-elles vos cas d'usage ?
L'intégration MLflow UI facilite-t-elle la navigation ?
Y a-t-il des cas d'usage non couverts ?
Des modifications ou améliorations souhaitées ?
Cette architecture élimine la fragilité actuelle et fournit une base solide, maintenable et scalable pour la gestion des caches MLflow avec une administration complète et une accessibilité optimisée.