featrixsphere 0.2.1439__tar.gz → 0.2.1461__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.1439 → featrixsphere-0.2.1461}/PKG-INFO +1 -1
- featrixsphere-0.2.1461/VERSION +1 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/featrixsphere/__init__.py +1 -1
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/featrixsphere/client.py +20 -3
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/featrixsphere.egg-info/PKG-INFO +1 -1
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/api.py +151 -5
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/auto_upgrade_monitor.py +1 -1
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/celery_app.py +434 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/cli.py +6 -6
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/featrix_queue.py +130 -36
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/convergence_monitor.py +8 -4
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/es_projections.py +2 -2
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/embedded_space.py +88 -41
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/encoders.py +19 -1
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/movie_frame_task.py +31 -8
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/scalar_codec.py +52 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/set_codec.py +39 -6
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/setlist_codec.py +27 -1
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/single_predictor.py +38 -4
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/string_codec.py +154 -88
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/vector_codec.py +29 -2
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/single_predictor_training.py +10 -31
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/structureddata.py +22 -4
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/manage_churro.sh +1 -1
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/node-install.sh +183 -30
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/recreate_session.py +3 -3
- featrixsphere-0.2.1461/src/run_api_server.sh +103 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/start_churro_server.sh +2 -2
- featrixsphere-0.2.1439/VERSION +0 -1
- featrixsphere-0.2.1439/src/run_api_server.sh +0 -37
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/MANIFEST.in +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/README.md +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/featrix-update.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/featrixsphere/cli.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/featrixsphere/test_client.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/featrixsphere.egg-info/SOURCES.txt +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/featrixsphere.egg-info/dependency_links.txt +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/featrixsphere.egg-info/entry_points.txt +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/featrixsphere.egg-info/not-zip-safe +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/featrixsphere.egg-info/requires.txt +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/featrixsphere.egg-info/top_level.txt +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/nv-install.sh +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/requirements.txt +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/setup.cfg +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/setup.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/build_version.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/config.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/demo_existing_model.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/demo_label_updates.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/deploy.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/deploy_cache_debug.sh +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/ensure_watchdog_running.sh +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/error_tracker.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/event_log.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/example_api_usage.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/example_prediction_feedback.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/example_train_predictor.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/featrix_watchdog.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/gc_cleanup.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/epoch_projections.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/es_training.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/__init__.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/MetaDataCache.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/__init__.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/calibration_utils.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/classification_metrics.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/config.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/data_frame_data_set.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/dataloader_utils.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/detect.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/device.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/domain_codec.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/dropout_scheduler.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/embedding_lr_scheduler.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/embedding_space_utils.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/embedding_utils.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/enrich.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/es_projection.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/exceptions.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/featrix_csv.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/featrix_json.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/featrix_module_dict.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/featrix_token.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/guardrails.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/hubspot_free_domains_list_may_2025.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/input_data_file.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/input_data_set.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/integrity.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/json_cache.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/json_codec.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/logging_config.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/mask_tracker.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/model_config.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/model_hash.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/network_viz.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/prng_control.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/demo_advisor_decisions.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/example_complete_workflow.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/generate_focal_report.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/model_advisor.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/show_results.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/test_adaptive_training.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/test_confusion_matrix_metadata.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/test_embedding_quality.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/test_embedding_space.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/test_extend_embedding_space.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/test_focal_comparison.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/test_focal_comparison_enhanced.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/test_focal_loss_single_predictor.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/test_label_smoothing.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/test_monitor_integration.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/test_piecewise_epochs.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/test_predict_during_training.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/test_timeline_quick.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/test_training_monitor.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/test_warning_tracking.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/qa/visualize_training_timeline.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/simple_mlp.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/single_predictor_mlp.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/sphere_config.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/sqlite_utils.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/stopwatch.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/string_analysis.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/string_cache.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/string_list_codec.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/timestamp_codec.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/training_context_manager.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/training_event.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/training_exceptions.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/training_history_db.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/transformer_encoder.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/url_codec.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/url_parser.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/utils.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix/neural/world_data.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/featrix_debug.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/json_encoder_cache.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/knn_training.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/single_predictor_cv.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/sphere_config.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/training_monitor.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/utils.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/vector_db.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/webhook_helpers.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/lib/weightwatcher_tracking.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/llm_client.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/neural.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/prediction_drift_monitor.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/prediction_persistence_worker.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/quick_test_deployment.sh +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/redis_prediction_cli.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/redis_prediction_store.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/regenerate_training_movie.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/render_sphere.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/restart_celery_worker.sh +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/send_email.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/slack.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/standalone_prediction.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/start_celery_worker.sh +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/tail-watch.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/test_api_client.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/test_complete_workflow.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/test_json_tables_prediction.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/test_redis_predictions.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/test_server_connection.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/test_session_models.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/test_single_predictor_api.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/test_upload_endpoint.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/tree.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/utils.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/src/version.py +0 -0
- {featrixsphere-0.2.1439 → featrixsphere-0.2.1461}/system_monitor.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.2.1461
|
|
@@ -1635,7 +1635,7 @@ class FeatrixSphereClient:
|
|
|
1635
1635
|
ax.text(0.5, 0.5, f'Error plotting embedding: {e}',
|
|
1636
1636
|
transform=ax.transAxes, ha='center', va='center')
|
|
1637
1637
|
|
|
1638
|
-
def create_embedding_space(self, name: str, s3_training_dataset: str, s3_validation_dataset: str, webhooks: Dict[str, str] = None) -> SessionInfo:
|
|
1638
|
+
def create_embedding_space(self, name: str, s3_training_dataset: str, s3_validation_dataset: str, webhooks: Dict[str, str] = None, user_metadata: Dict[str, Any] = None) -> SessionInfo:
|
|
1639
1639
|
"""
|
|
1640
1640
|
Create a new embedding space from S3 training and validation datasets.
|
|
1641
1641
|
|
|
@@ -1644,6 +1644,7 @@ class FeatrixSphereClient:
|
|
|
1644
1644
|
s3_training_dataset: S3 URL for training dataset (must start with 's3://')
|
|
1645
1645
|
s3_validation_dataset: S3 URL for validation dataset (must start with 's3://')
|
|
1646
1646
|
webhooks: Optional dict with webhook configuration keys (webhook_callback_secret, s3_backup_url, model_id_update_url)
|
|
1647
|
+
user_metadata: Optional user metadata for ES/SP identification (max 32KB)
|
|
1647
1648
|
|
|
1648
1649
|
Returns:
|
|
1649
1650
|
SessionInfo for the newly created embedding space session
|
|
@@ -1668,6 +1669,10 @@ class FeatrixSphereClient:
|
|
|
1668
1669
|
}
|
|
1669
1670
|
if webhooks:
|
|
1670
1671
|
data['webhooks'] = webhooks
|
|
1672
|
+
if user_metadata:
|
|
1673
|
+
import json
|
|
1674
|
+
data['user_metadata'] = json.dumps(user_metadata)
|
|
1675
|
+
print(f"User metadata: {user_metadata}")
|
|
1671
1676
|
|
|
1672
1677
|
response_data = self._post_json("/compute/create-embedding-space", data)
|
|
1673
1678
|
|
|
@@ -1689,7 +1694,8 @@ class FeatrixSphereClient:
|
|
|
1689
1694
|
parent_embedding_space_path: str = None,
|
|
1690
1695
|
s3_training_dataset: str = None,
|
|
1691
1696
|
s3_validation_dataset: str = None,
|
|
1692
|
-
webhooks: Dict[str, str] = None
|
|
1697
|
+
webhooks: Dict[str, str] = None,
|
|
1698
|
+
user_metadata: Dict[str, Any] = None
|
|
1693
1699
|
) -> SessionInfo:
|
|
1694
1700
|
"""
|
|
1695
1701
|
Fine-tune an existing embedding space on new data.
|
|
@@ -1785,6 +1791,10 @@ class FeatrixSphereClient:
|
|
|
1785
1791
|
|
|
1786
1792
|
if webhooks:
|
|
1787
1793
|
data['webhooks'] = webhooks
|
|
1794
|
+
if user_metadata:
|
|
1795
|
+
import json
|
|
1796
|
+
data['user_metadata'] = json.dumps(user_metadata)
|
|
1797
|
+
print(f"User metadata: {user_metadata}")
|
|
1788
1798
|
|
|
1789
1799
|
response_data = self._post_json("/compute/fine-tune-embedding-space", data)
|
|
1790
1800
|
|
|
@@ -4203,7 +4213,8 @@ class FeatrixSphereClient:
|
|
|
4203
4213
|
class_imbalance: dict = None,
|
|
4204
4214
|
poll_interval: int = 30, max_poll_time: int = 3600,
|
|
4205
4215
|
verbose: bool = True,
|
|
4206
|
-
webhooks: Dict[str, str] = None
|
|
4216
|
+
webhooks: Dict[str, str] = None,
|
|
4217
|
+
user_metadata: Dict[str, Any] = None) -> SessionInfo:
|
|
4207
4218
|
"""
|
|
4208
4219
|
Train a single predictor on a foundation model (existing embedding space).
|
|
4209
4220
|
|
|
@@ -4227,6 +4238,7 @@ class FeatrixSphereClient:
|
|
|
4227
4238
|
max_poll_time: Maximum time to poll in seconds (default: 3600 = 1 hour)
|
|
4228
4239
|
verbose: Whether to print status updates during polling (default: True)
|
|
4229
4240
|
webhooks: Optional dict with webhook configuration keys (webhook_callback_secret, s3_backup_url, model_id_update_url)
|
|
4241
|
+
user_metadata: Optional user metadata for ES/SP identification (max 32KB)
|
|
4230
4242
|
|
|
4231
4243
|
Returns:
|
|
4232
4244
|
SessionInfo for the newly created predictor training session
|
|
@@ -4318,6 +4330,11 @@ class FeatrixSphereClient:
|
|
|
4318
4330
|
if webhooks:
|
|
4319
4331
|
import json
|
|
4320
4332
|
data["webhooks"] = json.dumps(webhooks)
|
|
4333
|
+
if user_metadata:
|
|
4334
|
+
import json
|
|
4335
|
+
data["user_metadata"] = json.dumps(user_metadata)
|
|
4336
|
+
if verbose:
|
|
4337
|
+
print(f"User metadata: {user_metadata}")
|
|
4321
4338
|
|
|
4322
4339
|
# Send request with file if provided
|
|
4323
4340
|
try:
|
|
@@ -1031,7 +1031,49 @@ def create_app() -> FastAPI:
|
|
|
1031
1031
|
|
|
1032
1032
|
processes.append(process_info)
|
|
1033
1033
|
|
|
1034
|
-
# Calculate cumulative stats for
|
|
1034
|
+
# Calculate cumulative GPU stats for ALL supervisorctl processes (main + children)
|
|
1035
|
+
# This ensures every daemon process shows total GPU usage including all child processes
|
|
1036
|
+
for process in processes:
|
|
1037
|
+
process_pid = process.get('pid')
|
|
1038
|
+
if not process_pid:
|
|
1039
|
+
continue
|
|
1040
|
+
|
|
1041
|
+
try:
|
|
1042
|
+
main_proc = psutil.Process(process_pid)
|
|
1043
|
+
# Get all child processes recursively
|
|
1044
|
+
children = main_proc.children(recursive=True)
|
|
1045
|
+
|
|
1046
|
+
# Start with main process GPU stats from the pre-built map
|
|
1047
|
+
main_gpu_percent, main_gpu_vram_percent = gpu_stats_map.get(process_pid, (0.0, 0.0))
|
|
1048
|
+
|
|
1049
|
+
# Sum GPU stats from all children using the pre-built map
|
|
1050
|
+
children_gpu_total = 0.0
|
|
1051
|
+
children_vram_total = 0.0
|
|
1052
|
+
|
|
1053
|
+
for child in children:
|
|
1054
|
+
try:
|
|
1055
|
+
child_gpu_percent, child_gpu_vram_percent = gpu_stats_map.get(child.pid, (0.0, 0.0))
|
|
1056
|
+
children_gpu_total += child_gpu_percent
|
|
1057
|
+
children_vram_total += child_gpu_vram_percent
|
|
1058
|
+
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
|
|
1059
|
+
continue
|
|
1060
|
+
|
|
1061
|
+
# Add children totals to main process stats
|
|
1062
|
+
total_gpu_percent = main_gpu_percent + children_gpu_total
|
|
1063
|
+
total_gpu_vram_percent = main_gpu_vram_percent + children_vram_total
|
|
1064
|
+
|
|
1065
|
+
# Update the process with total GPU stats (main + all children)
|
|
1066
|
+
process['gpu_percent'] = round(total_gpu_percent, 1)
|
|
1067
|
+
process['gpu_vram_percent'] = round(total_gpu_vram_percent, 1)
|
|
1068
|
+
|
|
1069
|
+
except (psutil.NoSuchProcess, psutil.AccessDenied) as e:
|
|
1070
|
+
logger.debug(f"Could not get children for {process.get('name')} (PID {process_pid}): {e}")
|
|
1071
|
+
# Keep existing GPU stats (main process only)
|
|
1072
|
+
except Exception as e:
|
|
1073
|
+
logger.debug(f"Error calculating GPU stats for {process.get('name')} (PID {process_pid}): {e}")
|
|
1074
|
+
# Keep existing GPU stats (main process only)
|
|
1075
|
+
|
|
1076
|
+
# Legacy: Calculate cumulative stats for multiprocess workers of train_es (for backward compatibility)
|
|
1035
1077
|
for process in processes:
|
|
1036
1078
|
if process.get('name') == 'worker-train_es':
|
|
1037
1079
|
train_es_pid = process.get('pid')
|
|
@@ -1411,7 +1453,49 @@ def create_app() -> FastAPI:
|
|
|
1411
1453
|
|
|
1412
1454
|
processes.append(process_info)
|
|
1413
1455
|
|
|
1414
|
-
# Calculate cumulative stats for
|
|
1456
|
+
# Calculate cumulative GPU stats for ALL supervisorctl processes (main + children)
|
|
1457
|
+
# This ensures every daemon process shows total GPU usage including all child processes
|
|
1458
|
+
for process in processes:
|
|
1459
|
+
process_pid = process.get('pid')
|
|
1460
|
+
if not process_pid:
|
|
1461
|
+
continue
|
|
1462
|
+
|
|
1463
|
+
try:
|
|
1464
|
+
main_proc = psutil.Process(process_pid)
|
|
1465
|
+
# Get all child processes recursively
|
|
1466
|
+
children = main_proc.children(recursive=True)
|
|
1467
|
+
|
|
1468
|
+
# Start with main process GPU stats from the pre-built map
|
|
1469
|
+
main_gpu_percent, main_gpu_vram_percent = gpu_stats_map.get(process_pid, (0.0, 0.0))
|
|
1470
|
+
|
|
1471
|
+
# Sum GPU stats from all children using the pre-built map
|
|
1472
|
+
children_gpu_total = 0.0
|
|
1473
|
+
children_vram_total = 0.0
|
|
1474
|
+
|
|
1475
|
+
for child in children:
|
|
1476
|
+
try:
|
|
1477
|
+
child_gpu_percent, child_gpu_vram_percent = gpu_stats_map.get(child.pid, (0.0, 0.0))
|
|
1478
|
+
children_gpu_total += child_gpu_percent
|
|
1479
|
+
children_vram_total += child_gpu_vram_percent
|
|
1480
|
+
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
|
|
1481
|
+
continue
|
|
1482
|
+
|
|
1483
|
+
# Add children totals to main process stats
|
|
1484
|
+
total_gpu_percent = main_gpu_percent + children_gpu_total
|
|
1485
|
+
total_gpu_vram_percent = main_gpu_vram_percent + children_vram_total
|
|
1486
|
+
|
|
1487
|
+
# Update the process with total GPU stats (main + all children)
|
|
1488
|
+
process['gpu_percent'] = round(total_gpu_percent, 1)
|
|
1489
|
+
process['gpu_vram_percent'] = round(total_gpu_vram_percent, 1)
|
|
1490
|
+
|
|
1491
|
+
except (psutil.NoSuchProcess, psutil.AccessDenied) as e:
|
|
1492
|
+
logger.debug(f"Could not get children for {process.get('name')} (PID {process_pid}): {e}")
|
|
1493
|
+
# Keep existing GPU stats (main process only)
|
|
1494
|
+
except Exception as e:
|
|
1495
|
+
logger.debug(f"Error calculating GPU stats for {process.get('name')} (PID {process_pid}): {e}")
|
|
1496
|
+
# Keep existing GPU stats (main process only)
|
|
1497
|
+
|
|
1498
|
+
# Legacy: Calculate cumulative stats for multiprocess workers of train_es (for backward compatibility)
|
|
1415
1499
|
for process in processes:
|
|
1416
1500
|
if process.get('name') == 'worker-train_es':
|
|
1417
1501
|
train_es_pid = process.get('pid')
|
|
@@ -6177,7 +6261,8 @@ def create_app() -> FastAPI:
|
|
|
6177
6261
|
class_imbalance: Optional[str] = Form(None), # JSON string
|
|
6178
6262
|
use_class_weights: bool = Form(False),
|
|
6179
6263
|
optimize_for: Optional[str] = Form(None), # DEPRECATED: Ignored, kept for backward compatibility
|
|
6180
|
-
webhooks: Optional[str] = Form(None) # JSON string
|
|
6264
|
+
webhooks: Optional[str] = Form(None), # JSON string
|
|
6265
|
+
user_metadata: Optional[str] = Form(None) # JSON string
|
|
6181
6266
|
) -> JSONResponse:
|
|
6182
6267
|
"""
|
|
6183
6268
|
Train a single predictor on a foundation model (existing embedding space).
|
|
@@ -6213,6 +6298,15 @@ def create_app() -> FastAPI:
|
|
|
6213
6298
|
except json.JSONDecodeError:
|
|
6214
6299
|
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail="webhooks must be valid JSON")
|
|
6215
6300
|
|
|
6301
|
+
user_metadata_dict = None
|
|
6302
|
+
if user_metadata:
|
|
6303
|
+
try:
|
|
6304
|
+
user_metadata_dict = json.loads(user_metadata)
|
|
6305
|
+
logger.info(f"User metadata received: {len(str(user_metadata_dict))} chars")
|
|
6306
|
+
except json.JSONDecodeError:
|
|
6307
|
+
logger.warning(f"Invalid user_metadata JSON: {user_metadata}")
|
|
6308
|
+
user_metadata_dict = None
|
|
6309
|
+
|
|
6216
6310
|
try:
|
|
6217
6311
|
# Handle file upload if provided
|
|
6218
6312
|
final_input_filename = input_filename
|
|
@@ -6310,7 +6404,8 @@ def create_app() -> FastAPI:
|
|
|
6310
6404
|
foundation_model_id=foundation_model_id,
|
|
6311
6405
|
target_spec=target_spec,
|
|
6312
6406
|
input_filename=final_input_filename,
|
|
6313
|
-
name=name
|
|
6407
|
+
name=name,
|
|
6408
|
+
user_metadata=user_metadata_dict
|
|
6314
6409
|
)
|
|
6315
6410
|
|
|
6316
6411
|
# Save the session
|
|
@@ -6354,6 +6449,57 @@ def create_app() -> FastAPI:
|
|
|
6354
6449
|
post_slack_alert(f"foundation_model={foundation_model_id}; error starting predictor training on foundation model: {error_msg}")
|
|
6355
6450
|
raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail=f"Error starting predictor training on foundation model: {error_msg}")
|
|
6356
6451
|
|
|
6452
|
+
@app.post("/session/{id}/dump-to-backplane")
|
|
6453
|
+
async def dump_session_to_backplane(id: str) -> JSONResponse:
|
|
6454
|
+
"""
|
|
6455
|
+
Dispatch a Celery task to copy a session's workspace to /backplane/backplane1.
|
|
6456
|
+
|
|
6457
|
+
This task:
|
|
6458
|
+
1. Verifies /backplane/backplane1 is mounted and different from /backplane
|
|
6459
|
+
2. Rsyncs the session workspace to the backplane
|
|
6460
|
+
3. Creates a LAST_HOST_DUMP.json marker file with metadata
|
|
6461
|
+
|
|
6462
|
+
Args:
|
|
6463
|
+
id: Session ID to dump
|
|
6464
|
+
|
|
6465
|
+
Returns:
|
|
6466
|
+
dict with task_id for polling
|
|
6467
|
+
"""
|
|
6468
|
+
try:
|
|
6469
|
+
from celery_app import dump_to_backplane
|
|
6470
|
+
|
|
6471
|
+
# Verify session exists
|
|
6472
|
+
session = load_session(id)
|
|
6473
|
+
|
|
6474
|
+
# Dispatch Celery task
|
|
6475
|
+
task = dump_to_backplane.delay(id)
|
|
6476
|
+
|
|
6477
|
+
logger.info(f"✅ Dispatched dump_to_backplane task for session {id} (task_id: {task.id})")
|
|
6478
|
+
|
|
6479
|
+
return JSONResponse({
|
|
6480
|
+
"task_id": task.id,
|
|
6481
|
+
"status": "submitted",
|
|
6482
|
+
"session_id": id,
|
|
6483
|
+
"message": f"Dump task submitted for session {id}"
|
|
6484
|
+
})
|
|
6485
|
+
|
|
6486
|
+
except FileNotFoundError:
|
|
6487
|
+
raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail=f"Session not found: {id}")
|
|
6488
|
+
except ImportError as e:
|
|
6489
|
+
logger.error(f"❌ Celery not available: {e}")
|
|
6490
|
+
raise HTTPException(
|
|
6491
|
+
status_code=HTTPStatus.SERVICE_UNAVAILABLE,
|
|
6492
|
+
detail="Celery service not available - dump_to_backplane requires Celery"
|
|
6493
|
+
)
|
|
6494
|
+
except Exception as e:
|
|
6495
|
+
error_msg = str(e) if str(e) else repr(e)
|
|
6496
|
+
logger.error(f"❌ DUMP_TO_BACKPLANE - Exception: {error_msg}")
|
|
6497
|
+
logger.exception(e)
|
|
6498
|
+
raise HTTPException(
|
|
6499
|
+
status_code=HTTPStatus.INTERNAL_SERVER_ERROR,
|
|
6500
|
+
detail=f"Error dispatching dump task: {error_msg}"
|
|
6501
|
+
)
|
|
6502
|
+
|
|
6357
6503
|
@app.post("/compute/session/{id}/mark_for_deletion")
|
|
6358
6504
|
async def mark_session_for_deletion(id: str) -> JSONResponse:
|
|
6359
6505
|
"""
|
|
@@ -8701,7 +8847,7 @@ def create_app() -> FastAPI:
|
|
|
8701
8847
|
'create_structured_data': '📊 Data Processing',
|
|
8702
8848
|
'train_es': '🧠 Embedding Space',
|
|
8703
8849
|
'train_knn': '🔍 Vector Database',
|
|
8704
|
-
'
|
|
8850
|
+
'run_clustering': '📈 2D Projections',
|
|
8705
8851
|
'train_single_predictor': '🎯 Single Predictor'
|
|
8706
8852
|
}
|
|
8707
8853
|
return display_names.get(job_type, f'⚙️ {job_type}')
|
|
@@ -119,7 +119,7 @@ CHECK_INTERVAL = 3600 # Check every 60 minutes (3600 seconds)
|
|
|
119
119
|
TRAINING_QUEUES = [
|
|
120
120
|
"train_es",
|
|
121
121
|
"train_knn",
|
|
122
|
-
"
|
|
122
|
+
"run_clustering",
|
|
123
123
|
"train_single_predictor",
|
|
124
124
|
"cpu_data_tasks" # create_structured_data runs here
|
|
125
125
|
]
|