From e05163deb7423c29c615d60f48593e66f9b40cbd Mon Sep 17 00:00:00 2001 From: Dobromir Popov Date: Sun, 10 Aug 2025 03:42:03 +0300 Subject: [PATCH] models CKPts auto save --- core/orchestrator.py | 36 ++++++++++++++++++++++++++++++++++++ web/clean_dashboard.py | 9 +-------- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/core/orchestrator.py b/core/orchestrator.py index 5a34610..dc9c23b 100644 --- a/core/orchestrator.py +++ b/core/orchestrator.py @@ -7930,6 +7930,42 @@ class TradingOrchestrator: logger.error(f"Error initializing checkpoint manager: {e}") self.checkpoint_manager = None + def autosave_models(self): + """Attempt to autosave best model checkpoints periodically.""" + try: + if not self.checkpoint_manager: + return + # CNN autosave when current_loss equals best_loss + try: + cnn_stats = self.model_states.get('cnn', {}) + if cnn_stats and cnn_stats.get('current_loss') is not None: + if cnn_stats.get('best_loss') is not None and cnn_stats['current_loss'] <= cnn_stats['best_loss']: + path = self.checkpoint_manager.save_model_checkpoint( + model_name='enhanced_cnn', + model=self.cnn_model, + metrics={'loss': float(cnn_stats['current_loss'])}, + metadata={'source': 'autosave'} + ) + if path: + logger.info(f"Autosaved CNN checkpoint: {path}") + except Exception: + pass + # COB RL autosave + try: + cob_stats = self.model_states.get('cob_rl', {}) + if cob_stats and cob_stats.get('current_loss') is not None: + if cob_stats.get('best_loss') is not None and cob_stats['current_loss'] <= cob_stats['best_loss']: + self.checkpoint_manager.save_model_checkpoint( + model_name='cob_rl', + model=self.cob_rl_agent, + metrics={'loss': float(cob_stats['current_loss'])}, + metadata={'source': 'autosave'} + ) + except Exception: + pass + except Exception as e: + logger.debug(f"Autosave models skipped: {e}") + def _schedule_database_cleanup(self): """Schedule periodic database cleanup""" try: diff --git a/web/clean_dashboard.py b/web/clean_dashboard.py index 4ec4ce8..ed7dbb7 100644 --- a/web/clean_dashboard.py +++ b/web/clean_dashboard.py @@ -958,14 +958,7 @@ class CleanTradingDashboard: def update_model_inference_toggle(value): return self._handle_model_toggle(model_name, 'inference', value) - # Create training toggle callback - @self.app.callback( - Output(f'{model_name}-training-toggle', 'value'), - [Input(f'{model_name}-training-toggle', 'value')], - prevent_initial_call=True - ) - def update_model_training_toggle(value): - return self._handle_model_toggle(model_name, 'training', value) + # Skip training toggle callback registration until components exist in layout logger.debug(f"Created toggle callbacks for model: {model_name}")