featrixsphere 0.2.1637__tar.gz → 0.2.1830__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/PKG-INFO +1 -1
- featrixsphere-0.2.1830/VERSION +1 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/featrix-update.py +14 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/featrixsphere/__init__.py +1 -1
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/featrixsphere/client.py +213 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/featrixsphere.egg-info/PKG-INFO +1 -1
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/featrixsphere.egg-info/SOURCES.txt +3 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/api.py +552 -4
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/celery_app.py +197 -7
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/featrix_watchdog.py +89 -2
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/gc_cleanup.py +39 -1
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/convergence_monitor.py +43 -0
- featrixsphere-0.2.1830/src/lib/crash_tracker.py +283 -0
- featrixsphere-0.2.1830/src/lib/distribution_shift_detector.py +481 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/es_training.py +1 -2
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/es_training_wrapper.py +13 -4
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/dataloader_utils.py +52 -13
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/embedded_space.py +1097 -356
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/embedding_space_utils.py +5 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/encoders.py +79 -24
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/io_utils.py +249 -61
- featrixsphere-0.2.1830/src/lib/featrix/neural/logging_config.py +118 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/mask_tracker.py +23 -6
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/model_config.py +1 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/set_codec.py +1 -1
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/single_predictor.py +637 -178
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/sphere_config.py +37 -5
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/string_cache.py +238 -186
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/string_codec.py +323 -275
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/utils.py +29 -8
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/job_manager.py +41 -11
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/session_chains.py +15 -23
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/session_manager.py +70 -2
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/single_predictor_cv.py +4 -3
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/single_predictor_training.py +122 -47
- featrixsphere-0.2.1830/src/lib/system_health_monitor.py +465 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/weightwatcher_tracking.py +70 -10
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/node-install.sh +327 -16
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/start_celery_cpu_worker.sh +0 -1
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/start_celery_gpu_worker.sh +0 -1
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/start_celery_worker.sh +0 -1
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/system_monitor.py +498 -86
- featrixsphere-0.2.1637/VERSION +0 -1
- featrixsphere-0.2.1637/src/lib/featrix/neural/logging_config.py +0 -67
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/MANIFEST.in +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/README.md +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/featrixsphere/test_client.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/featrixsphere.egg-info/dependency_links.txt +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/featrixsphere.egg-info/entry_points.txt +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/featrixsphere.egg-info/not-zip-safe +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/featrixsphere.egg-info/requires.txt +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/featrixsphere.egg-info/top_level.txt +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/nv-install.sh +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/requirements.txt +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/setup.cfg +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/setup.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/auto_upgrade_monitor.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/build_version.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/config.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/demo_existing_model.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/demo_label_updates.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/deploy.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/deploy_cache_debug.sh +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/ensure_watchdog_running.sh +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/error_tracker.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/event_log.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/example_api_usage.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/example_prediction_feedback.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/example_train_predictor.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/api_event_retry.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/celery_job_recovery.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/epoch_projections.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/es_projections.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/__init__.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/MetaDataCache.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/__init__.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/calibration_utils.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/classification_metrics.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/config.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/data_frame_data_set.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/detect.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/device.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/domain_codec.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/dropout_scheduler.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/embedding_lr_scheduler.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/embedding_utils.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/enrich.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/es_projection.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/exceptions.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/featrix_csv.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/featrix_json.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/featrix_module_dict.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/featrix_token.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/guardrails.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/hubspot_free_domains_list_may_2025.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/input_data_file.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/input_data_set.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/integrity.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/json_cache.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/json_codec.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/model_hash.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/movie_frame_task.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/network_viz.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/prng_control.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/qa/demo_advisor_decisions.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/qa/example_complete_workflow.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/qa/generate_focal_report.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/qa/model_advisor.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/qa/show_results.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/qa/test_adaptive_training.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/qa/test_checkpoint_dict_reconstruction.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/qa/test_confusion_matrix_metadata.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/qa/test_embedding_quality.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/qa/test_embedding_space.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/qa/test_extend_embedding_space.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/qa/test_focal_comparison.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/qa/test_focal_comparison_enhanced.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/qa/test_focal_loss_single_predictor.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/qa/test_label_smoothing.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/qa/test_monitor_integration.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/qa/test_piecewise_epochs.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/qa/test_predict_during_training.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/qa/test_timeline_quick.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/qa/test_training_monitor.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/qa/test_warning_tracking.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/qa/visualize_training_timeline.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/scalar_codec.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/setlist_codec.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/simple_mlp.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/single_predictor_mlp.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/sqlite_utils.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/stopwatch.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/string_analysis.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/string_list_codec.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/timestamp_codec.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/training_context_manager.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/training_event.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/training_exceptions.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/training_history_db.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/transformer_encoder.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/url_codec.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/url_parser.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/vector_codec.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix/neural/world_data.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/featrix_debug.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/json_encoder_cache.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/knn_training.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/queue_manager.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/sphere_config.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/structureddata.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/training_monitor.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/utils.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/vector_db.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/lib/webhook_helpers.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/llm_client.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/manage_churro.sh +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/migrate_string_cache_naming.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/neural.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/prediction_drift_monitor.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/prediction_persistence_worker.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/quick_test_deployment.sh +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/recreate_session.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/redis_job_progress.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/redis_prediction_cli.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/redis_prediction_store.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/regenerate_training_movie.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/render_sphere.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/restart_celery_worker.sh +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/run_api_server.sh +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/send_email.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/slack.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/standalone_prediction.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/start_churro_server.sh +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/tail-watch.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/test_api_client.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/test_complete_workflow.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/test_json_tables_prediction.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/test_redis_predictions.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/test_server_connection.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/test_session_models.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/test_single_predictor_api.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/test_upload_endpoint.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/tree.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/utils.py +0 -0
- {featrixsphere-0.2.1637 → featrixsphere-0.2.1830}/src/version.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.2.1830
|
|
@@ -409,10 +409,24 @@ def main():
|
|
|
409
409
|
newest_version = newest['version']
|
|
410
410
|
newest_filename = newest['filename']
|
|
411
411
|
newest_hash = newest.get('hash')
|
|
412
|
+
newest_date = newest.get('date_modified')
|
|
412
413
|
newest_url = f"{FIRMWARE_SERVER}/{newest_filename}"
|
|
413
414
|
|
|
415
|
+
# Format date if available
|
|
416
|
+
date_str = ""
|
|
417
|
+
if newest_date:
|
|
418
|
+
try:
|
|
419
|
+
# Parse ISO format date and format nicely
|
|
420
|
+
date_obj = datetime.fromisoformat(newest_date.replace('Z', '+00:00'))
|
|
421
|
+
date_str = date_obj.strftime("%Y-%m-%d %H:%M:%S")
|
|
422
|
+
except Exception:
|
|
423
|
+
# Fallback to raw date if parsing fails
|
|
424
|
+
date_str = newest_date
|
|
425
|
+
|
|
414
426
|
print(f"\n📊 Available versions:")
|
|
415
427
|
print(f" Newest: {newest_version} ({newest_filename})")
|
|
428
|
+
if date_str:
|
|
429
|
+
print(f" Date: {date_str}")
|
|
416
430
|
if newest_hash:
|
|
417
431
|
print(f" Hash: {newest_hash[:16]}...")
|
|
418
432
|
|
|
@@ -5372,6 +5372,219 @@ class FeatrixSphereClient:
|
|
|
5372
5372
|
if verbose:
|
|
5373
5373
|
print(f"❌ Error starting predictor continuation: {e}")
|
|
5374
5374
|
raise
|
|
5375
|
+
|
|
5376
|
+
def train_on_partial_foundation(
|
|
5377
|
+
self,
|
|
5378
|
+
foundation_session_id: str,
|
|
5379
|
+
local_data_file: str,
|
|
5380
|
+
target_column: str,
|
|
5381
|
+
target_column_type: str,
|
|
5382
|
+
checkpoint_epoch: int = None,
|
|
5383
|
+
epochs: int = 0,
|
|
5384
|
+
rare_label_value: str = None,
|
|
5385
|
+
use_class_weights: bool = True,
|
|
5386
|
+
class_imbalance: dict = None,
|
|
5387
|
+
cost_false_positive: float = None,
|
|
5388
|
+
cost_false_negative: float = None,
|
|
5389
|
+
name: str = None,
|
|
5390
|
+
session_name_prefix: str = None,
|
|
5391
|
+
webhooks: Dict[str, str] = None,
|
|
5392
|
+
poll_interval: int = 30,
|
|
5393
|
+
max_poll_time: int = 3600,
|
|
5394
|
+
verbose: bool = True
|
|
5395
|
+
) -> Dict[str, Any]:
|
|
5396
|
+
"""
|
|
5397
|
+
Train a predictor on a partial/in-progress foundation model.
|
|
5398
|
+
|
|
5399
|
+
Designed for use while the foundation model is STILL TRAINING. Test predictor
|
|
5400
|
+
performance on intermediate checkpoints without waiting for full ES training
|
|
5401
|
+
to complete. Also works with completed foundation training.
|
|
5402
|
+
|
|
5403
|
+
Creates a NEW session using:
|
|
5404
|
+
- Checkpoint from foundation's ES training (specific epoch or best/latest)
|
|
5405
|
+
- Your uploaded data file for predictor training
|
|
5406
|
+
- Metadata about foundation training progress at checkpoint time
|
|
5407
|
+
|
|
5408
|
+
Perfect for:
|
|
5409
|
+
- Testing predictor performance while ES is still training
|
|
5410
|
+
- Training on partially-trained foundation models
|
|
5411
|
+
- Running parallel experiments on different checkpoint epochs
|
|
5412
|
+
|
|
5413
|
+
Args:
|
|
5414
|
+
foundation_session_id: Session ID with ES training (in-progress or completed)
|
|
5415
|
+
local_data_file: Path to CSV file on YOUR MACHINE (will be uploaded)
|
|
5416
|
+
target_column: Column to predict
|
|
5417
|
+
target_column_type: "set" for classification, "scalar" for regression
|
|
5418
|
+
checkpoint_epoch: Which epoch checkpoint to use (None = best/latest available)
|
|
5419
|
+
epochs: Predictor training epochs (0 = auto-calculate based on data size)
|
|
5420
|
+
rare_label_value: Minority class label for binary classification
|
|
5421
|
+
use_class_weights: Enable class weighting for imbalanced data
|
|
5422
|
+
class_imbalance: Expected class distribution from real world
|
|
5423
|
+
cost_false_positive: Cost of false positive (classification only)
|
|
5424
|
+
cost_false_negative: Cost of false negative (classification only)
|
|
5425
|
+
name: Optional name for the new session
|
|
5426
|
+
session_name_prefix: Optional prefix for session ID
|
|
5427
|
+
webhooks: Webhook configuration dict
|
|
5428
|
+
poll_interval: Seconds between status checks (default: 30)
|
|
5429
|
+
max_poll_time: Maximum polling time in seconds (default: 3600 = 1 hour)
|
|
5430
|
+
verbose: Print status updates
|
|
5431
|
+
|
|
5432
|
+
Returns:
|
|
5433
|
+
dict with:
|
|
5434
|
+
- new_session_id: Created session ID
|
|
5435
|
+
- foundation_session_id: Original foundation session
|
|
5436
|
+
- checkpoint_epoch: Epoch used for checkpoint
|
|
5437
|
+
- foundation_training_metadata: Progress info when checkpoint was created
|
|
5438
|
+
- target_column: Column being predicted
|
|
5439
|
+
- predictor_epochs: Training epochs
|
|
5440
|
+
|
|
5441
|
+
Example:
|
|
5442
|
+
```python
|
|
5443
|
+
# Train on epoch 50 checkpoint while ES is still training
|
|
5444
|
+
result = client.train_on_partial_foundation(
|
|
5445
|
+
foundation_session_id="abc-def-ghi",
|
|
5446
|
+
local_data_file="my_data.csv",
|
|
5447
|
+
target_column="price",
|
|
5448
|
+
target_column_type="scalar",
|
|
5449
|
+
checkpoint_epoch=50,
|
|
5450
|
+
epochs=100
|
|
5451
|
+
)
|
|
5452
|
+
|
|
5453
|
+
print(f"New session: {result['new_session_id']}")
|
|
5454
|
+
print(f"Foundation was {result['foundation_training_metadata']['training_progress_percent']}% trained")
|
|
5455
|
+
```
|
|
5456
|
+
"""
|
|
5457
|
+
import os
|
|
5458
|
+
from pathlib import Path
|
|
5459
|
+
|
|
5460
|
+
# Validate inputs
|
|
5461
|
+
if not os.path.exists(local_data_file):
|
|
5462
|
+
raise FileNotFoundError(f"Local data file not found: {local_data_file}")
|
|
5463
|
+
|
|
5464
|
+
if target_column_type not in ["set", "scalar"]:
|
|
5465
|
+
raise ValueError("target_column_type must be 'set' or 'scalar'")
|
|
5466
|
+
|
|
5467
|
+
# Prepare form data
|
|
5468
|
+
form_data = {
|
|
5469
|
+
'target_column': target_column,
|
|
5470
|
+
'target_column_type': target_column_type,
|
|
5471
|
+
'epochs': str(epochs),
|
|
5472
|
+
'use_class_weights': str(use_class_weights).lower(),
|
|
5473
|
+
}
|
|
5474
|
+
|
|
5475
|
+
if checkpoint_epoch is not None:
|
|
5476
|
+
form_data['checkpoint_epoch'] = str(checkpoint_epoch)
|
|
5477
|
+
if rare_label_value:
|
|
5478
|
+
form_data['rare_label_value'] = rare_label_value
|
|
5479
|
+
if class_imbalance:
|
|
5480
|
+
import json
|
|
5481
|
+
form_data['class_imbalance'] = json.dumps(class_imbalance)
|
|
5482
|
+
if cost_false_positive is not None:
|
|
5483
|
+
form_data['cost_false_positive'] = str(cost_false_positive)
|
|
5484
|
+
if cost_false_negative is not None:
|
|
5485
|
+
form_data['cost_false_negative'] = str(cost_false_negative)
|
|
5486
|
+
if name:
|
|
5487
|
+
form_data['name'] = name
|
|
5488
|
+
if session_name_prefix:
|
|
5489
|
+
form_data['session_name_prefix'] = session_name_prefix
|
|
5490
|
+
if webhooks:
|
|
5491
|
+
import json
|
|
5492
|
+
form_data['webhooks'] = json.dumps(webhooks)
|
|
5493
|
+
|
|
5494
|
+
# Upload file
|
|
5495
|
+
try:
|
|
5496
|
+
with open(local_data_file, 'rb') as f:
|
|
5497
|
+
files = {'file': (Path(local_data_file).name, f, 'text/csv')}
|
|
5498
|
+
response_data = self._post_multipart(
|
|
5499
|
+
f"/compute/session/{foundation_session_id}/train_on_partial_foundation",
|
|
5500
|
+
data=form_data,
|
|
5501
|
+
files=files
|
|
5502
|
+
)
|
|
5503
|
+
|
|
5504
|
+
new_session_id = response_data.get('new_session_id')
|
|
5505
|
+
checkpoint_epoch_used = response_data.get('checkpoint_epoch')
|
|
5506
|
+
training_metadata = response_data.get('foundation_training_metadata', {})
|
|
5507
|
+
|
|
5508
|
+
if verbose:
|
|
5509
|
+
print(f"✅ {response_data.get('message')}")
|
|
5510
|
+
print(f" New session ID: {new_session_id}")
|
|
5511
|
+
print(f" Checkpoint epoch: {checkpoint_epoch_used}")
|
|
5512
|
+
if training_metadata.get('training_progress_percent'):
|
|
5513
|
+
print(f" Foundation training progress: {training_metadata['training_progress_percent']}%")
|
|
5514
|
+
if training_metadata.get('validation_loss_at_checkpoint'):
|
|
5515
|
+
print(f" Val loss at checkpoint: {training_metadata['validation_loss_at_checkpoint']:.4f}")
|
|
5516
|
+
|
|
5517
|
+
# Poll for completion if requested
|
|
5518
|
+
if poll_interval > 0 and max_poll_time > 0 and new_session_id:
|
|
5519
|
+
import time
|
|
5520
|
+
start_time = time.time()
|
|
5521
|
+
last_message = ""
|
|
5522
|
+
|
|
5523
|
+
while time.time() - start_time < max_poll_time:
|
|
5524
|
+
try:
|
|
5525
|
+
session_info = self.get_session_status(new_session_id)
|
|
5526
|
+
jobs = session_info.jobs if hasattr(session_info, 'jobs') else {}
|
|
5527
|
+
|
|
5528
|
+
# Find predictor training jobs
|
|
5529
|
+
sp_jobs = {j_id: j for j_id, j in jobs.items()
|
|
5530
|
+
if 'train_single_predictor' in j.get('type', '')}
|
|
5531
|
+
|
|
5532
|
+
if not sp_jobs:
|
|
5533
|
+
if verbose:
|
|
5534
|
+
print("⏳ Waiting for predictor job to start...")
|
|
5535
|
+
time.sleep(poll_interval)
|
|
5536
|
+
continue
|
|
5537
|
+
|
|
5538
|
+
# Check statuses
|
|
5539
|
+
running = [j_id for j_id, j in sp_jobs.items() if j.get('status') == 'running']
|
|
5540
|
+
done = [j_id for j_id, j in sp_jobs.items() if j.get('status') == 'done']
|
|
5541
|
+
failed = [j_id for j_id, j in sp_jobs.items() if j.get('status') == 'failed']
|
|
5542
|
+
|
|
5543
|
+
status_msg = f"Running: {len(running)}, Done: {len(done)}, Failed: {len(failed)}"
|
|
5544
|
+
if status_msg != last_message and verbose:
|
|
5545
|
+
print(f"📊 {status_msg}")
|
|
5546
|
+
last_message = status_msg
|
|
5547
|
+
|
|
5548
|
+
if not running and (done or failed):
|
|
5549
|
+
if done:
|
|
5550
|
+
if verbose:
|
|
5551
|
+
print(f"✅ Predictor training completed!")
|
|
5552
|
+
return {
|
|
5553
|
+
**response_data,
|
|
5554
|
+
"status": "completed",
|
|
5555
|
+
"poll_time": int(time.time() - start_time)
|
|
5556
|
+
}
|
|
5557
|
+
elif failed:
|
|
5558
|
+
if verbose:
|
|
5559
|
+
print(f"❌ Predictor training failed")
|
|
5560
|
+
return {
|
|
5561
|
+
**response_data,
|
|
5562
|
+
"status": "failed",
|
|
5563
|
+
"failed_jobs": failed,
|
|
5564
|
+
"poll_time": int(time.time() - start_time)
|
|
5565
|
+
}
|
|
5566
|
+
|
|
5567
|
+
time.sleep(poll_interval)
|
|
5568
|
+
except Exception as poll_error:
|
|
5569
|
+
if verbose:
|
|
5570
|
+
print(f"⚠️ Polling error: {poll_error}")
|
|
5571
|
+
time.sleep(poll_interval)
|
|
5572
|
+
|
|
5573
|
+
if verbose:
|
|
5574
|
+
print(f"⏰ Polling timeout ({max_poll_time}s). Training may still be in progress.")
|
|
5575
|
+
|
|
5576
|
+
return {
|
|
5577
|
+
**response_data,
|
|
5578
|
+
"status": "timeout",
|
|
5579
|
+
"poll_time": max_poll_time
|
|
5580
|
+
}
|
|
5581
|
+
|
|
5582
|
+
return response_data
|
|
5583
|
+
|
|
5584
|
+
except Exception as e:
|
|
5585
|
+
if verbose:
|
|
5586
|
+
print(f"❌ Error training on partial foundation: {e}")
|
|
5587
|
+
raise
|
|
5375
5588
|
|
|
5376
5589
|
def foundation_model_train_more(self, session_id: str, es_id: str = None, data_passes: int = None,
|
|
5377
5590
|
epochs: int = None, poll_interval: int = 30, max_poll_time: int = 3600,
|
|
@@ -71,6 +71,8 @@ src/version.py
|
|
|
71
71
|
src/lib/api_event_retry.py
|
|
72
72
|
src/lib/celery_job_recovery.py
|
|
73
73
|
src/lib/convergence_monitor.py
|
|
74
|
+
src/lib/crash_tracker.py
|
|
75
|
+
src/lib/distribution_shift_detector.py
|
|
74
76
|
src/lib/epoch_projections.py
|
|
75
77
|
src/lib/es_projections.py
|
|
76
78
|
src/lib/es_training.py
|
|
@@ -86,6 +88,7 @@ src/lib/single_predictor_cv.py
|
|
|
86
88
|
src/lib/single_predictor_training.py
|
|
87
89
|
src/lib/sphere_config.py
|
|
88
90
|
src/lib/structureddata.py
|
|
91
|
+
src/lib/system_health_monitor.py
|
|
89
92
|
src/lib/training_monitor.py
|
|
90
93
|
src/lib/utils.py
|
|
91
94
|
src/lib/vector_db.py
|