weightslab 1.2.1__tar.gz → 1.2.2__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.
- {weightslab-1.2.1 → weightslab-1.2.2}/.github/workflows/ci.yml +7 -3
- {weightslab-1.2.1 → weightslab-1.2.2}/.gitignore +3 -0
- weightslab-1.2.2/AGENTS.md +209 -0
- weightslab-1.2.2/CHANGELOG.md +1 -0
- {weightslab-1.2.1/weightslab.egg-info → weightslab-1.2.2}/PKG-INFO +120 -219
- {weightslab-1.2.1 → weightslab-1.2.2}/README.md +118 -218
- {weightslab-1.2.1 → weightslab-1.2.2}/docs/quickstart.rst +55 -4
- {weightslab-1.2.1 → weightslab-1.2.2}/pyproject.toml +1 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/__init__.py +25 -37
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/_version.py +3 -3
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/data/data_utils.py +34 -1
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/data/dataframe_manager.py +1 -1
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/data/h5_dataframe_store.py +12 -0
- weightslab-1.2.2/weightslab/data/point_cloud_utils.py +722 -0
- weightslab-1.2.2/weightslab/examples/PyTorch/ws-classification/certs-debug/.grpc_auth_token +1 -0
- weightslab-1.2.2/weightslab/examples/PyTorch/ws-classification/certs-debug/backend-server.crt +26 -0
- weightslab-1.2.2/weightslab/examples/PyTorch/ws-classification/certs-debug/backend-server.key +28 -0
- weightslab-1.2.2/weightslab/examples/PyTorch/ws-classification/certs-debug/ca.crt +30 -0
- weightslab-1.2.2/weightslab/examples/PyTorch/ws-classification/certs-debug/envoy-client.crt +24 -0
- weightslab-1.2.2/weightslab/examples/PyTorch/ws-classification/certs-debug/envoy-client.key +28 -0
- weightslab-1.2.2/weightslab/examples/PyTorch/ws-classification/certs-debug/envoy-server.crt +25 -0
- weightslab-1.2.2/weightslab/examples/PyTorch/ws-classification/certs-debug/envoy-server.key +28 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-classification/config.yaml +7 -8
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-classification/main.py +11 -3
- {weightslab-1.2.1/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.2/weightslab/examples/PyTorch/ws-clustering}/config.yaml +1 -1
- {weightslab-1.2.1/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.2/weightslab/examples/PyTorch/ws-clustering}/main.py +8 -8
- weightslab-1.2.2/weightslab/examples/PyTorch/ws-detection/README.md +102 -0
- weightslab-1.2.2/weightslab/examples/PyTorch/ws-detection/config.yaml +50 -0
- weightslab-1.2.2/weightslab/examples/PyTorch/ws-detection/main.py +340 -0
- weightslab-1.2.2/weightslab/examples/PyTorch/ws-detection/utils/criterions.py +247 -0
- weightslab-1.2.2/weightslab/examples/PyTorch/ws-detection/utils/data.py +226 -0
- weightslab-1.2.2/weightslab/examples/PyTorch/ws-detection/utils/model.py +134 -0
- {weightslab-1.2.1/weightslab/examples/PyTorch/ws-vad → weightslab-1.2.2/weightslab/examples/PyTorch/ws-generation}/config.yaml +4 -4
- {weightslab-1.2.1/weightslab/examples/PyTorch/ws-vad → weightslab-1.2.2/weightslab/examples/PyTorch/ws-generation}/main.py +2 -2
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/config.yaml +3 -3
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/main.py +4 -8
- {weightslab-1.2.1/weightslab/examples/PyTorch/ws-detection/src → weightslab-1.2.2/weightslab/examples/Ultralytics/ws-detection}/config.yaml +1 -1
- weightslab-1.2.2/weightslab/examples/Usecases/ws-2d-lidar-detection/README.md +66 -0
- weightslab-1.2.2/weightslab/examples/Usecases/ws-2d-lidar-detection/config.yaml +46 -0
- weightslab-1.2.2/weightslab/examples/Usecases/ws-2d-lidar-detection/main.py +194 -0
- weightslab-1.2.2/weightslab/examples/Usecases/ws-2d-lidar-detection/utils/criterions.py +156 -0
- weightslab-1.2.2/weightslab/examples/Usecases/ws-2d-lidar-detection/utils/data.py +162 -0
- weightslab-1.2.2/weightslab/examples/Usecases/ws-2d-lidar-detection/utils/model.py +148 -0
- weightslab-1.2.2/weightslab/examples/Usecases/ws-3d-lidar-detection/README.md +190 -0
- weightslab-1.2.2/weightslab/examples/Usecases/ws-3d-lidar-detection/config.yaml +72 -0
- weightslab-1.2.2/weightslab/examples/Usecases/ws-3d-lidar-detection/main.py +431 -0
- weightslab-1.2.2/weightslab/examples/Usecases/ws-3d-lidar-detection/utils/criterions.py +279 -0
- weightslab-1.2.2/weightslab/examples/Usecases/ws-3d-lidar-detection/utils/data.py +597 -0
- weightslab-1.2.2/weightslab/examples/Usecases/ws-3d-lidar-detection/utils/kitti_download.py +190 -0
- weightslab-1.2.2/weightslab/examples/Usecases/ws-3d-lidar-detection/utils/model.py +232 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/integrations/ultralytics/trainer.py +0 -5
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/proto/experiment_service.proto +27 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/proto/experiment_service_pb2.py +55 -51
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/proto/experiment_service_pb2_grpc.py +45 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/security/cert_auth_manager.py +64 -12
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/src.py +72 -9
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/backend/test_compare_dataloaders.py +18 -2
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/backend/test_data_loader_interface.py +37 -46
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/backend/test_logger_core.py +5 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/backend/test_model_interface_unit.py +4 -0
- weightslab-1.2.2/weightslab/tests/backend/test_ui_docker_bridge.py +718 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/backend/test_write_dataframe.py +3 -2
- weightslab-1.2.2/weightslab/tests/data/test_point_cloud_utils.py +330 -0
- weightslab-1.2.2/weightslab/tests/gRPC/test_get_point_cloud.py +99 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/gRPC/test_grpc_user_actions.py +5 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/trainer/services/test_trainer_services_unit.py +6 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/services/agent/agent.py +32 -1
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/services/data_service.py +247 -53
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/trainer_services.py +5 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/docker/DEPLOYMENT.md +14 -4
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/docker/nginx-entrypoint.sh +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/docker/test-deployment.sh +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/docker/utils/build-and-deploy.sh +83 -62
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/docker/utils/generate-certs-auth-token.ps1 +8 -2
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/docker/utils/generate-certs-auth-token.sh +10 -1
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/docker/utils/test-deployment.sh +0 -0
- weightslab-1.2.2/weightslab/ui_docker_bridge.py +1123 -0
- {weightslab-1.2.1 → weightslab-1.2.2/weightslab.egg-info}/PKG-INFO +120 -219
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab.egg-info/SOURCES.txt +45 -21
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab.egg-info/requires.txt +1 -0
- weightslab-1.2.1/CHANGELOG.md +0 -1
- weightslab-1.2.1/_ck.txt +0 -1938
- weightslab-1.2.1/weightslab/examples/PyTorch/ws-detection/src/main.py +0 -135
- weightslab-1.2.1/weightslab/examples/PyTorch/ws-detection/src/utils/criterions.py +0 -390
- weightslab-1.2.1/weightslab/examples/PyTorch/ws-detection/src/utils/data.py +0 -116
- weightslab-1.2.1/weightslab/examples/PyTorch/ws-detection/src/utils/trainer.py +0 -195
- weightslab-1.2.1/weightslab/examples/PyTorch/ws-detection/src/yolo_pipeline.py +0 -171
- weightslab-1.2.1/weightslab/tests/backend/test_ui_docker_bridge.py +0 -567
- weightslab-1.2.1/weightslab/tests/test_ddp_down_only_change.py +0 -62
- weightslab-1.2.1/weightslab/ui_docker_bridge.py +0 -589
- {weightslab-1.2.1 → weightslab-1.2.2}/.gitattributes +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/.github/workflows/docs-pages.yml +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/.github/workflows/release.yml +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/LICENSE +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/agent_config.yaml +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/docs/_static/.gitkeep +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/docs/_static/custom.css +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/docs/_static/favicon.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/docs/_static/logo-dark.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/docs/_static/logo-light.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/docs/_static/version-switcher.js +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/docs/_static/weights_studio_architecture.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/docs/_templates/.gitkeep +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/docs/conf.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/docs/configuration.rst +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/docs/data_exploration.rst +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/docs/four_way_approach.rst +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/docs/grpc/audit_logger.rst +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/docs/grpc/grpc_functions.rst +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/docs/grpc/index.rst +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/docs/hyperparameters.rst +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/docs/index.rst +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/docs/logger.rst +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/docs/model_interaction.rst +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/docs/pytorch_lightning.rst +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/docs/requirements.txt +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/docs/segmentation_usecase.rst +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/docs/usecases.rst +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/docs/user_functions.rst +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/docs/weights_studio.rst +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/setup.cfg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/art.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/backend/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/backend/audit_logger.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/backend/cli.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/backend/dataloader_interface.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/backend/ledgers.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/backend/logger.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/backend/model_interface.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/backend/optimizer_interface.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/baseline_models/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/baseline_models/pytorch/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/baseline_models/pytorch/models.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/components/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/components/checkpoint_manager.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/components/evaluation_controller.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/components/experiment_hash.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/components/global_monitoring.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/components/parallel_primitives.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/components/tracking.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/data/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/data/array_proxy.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/data/data_samples_with_ops.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/data/h5_array_store.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/data/sample_stats.py +0 -0
- {weightslab-1.2.1/weightslab/examples/PyTorch_Lightning → weightslab-1.2.2/weightslab/examples/Lightning}/ws-classification/config.yaml +0 -0
- {weightslab-1.2.1/weightslab/examples/PyTorch_Lightning → weightslab-1.2.2/weightslab/examples/Lightning}/ws-classification/main.py +0 -0
- {weightslab-1.2.1/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.2/weightslab/examples/PyTorch/ws-clustering}/face/__init__.py +0 -0
- {weightslab-1.2.1/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.2/weightslab/examples/PyTorch/ws-clustering}/face/data.py +0 -0
- {weightslab-1.2.1/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.2/weightslab/examples/PyTorch/ws-clustering}/face/model.py +0 -0
- {weightslab-1.2.1/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.2/weightslab/examples/PyTorch/ws-clustering}/face/signals.py +0 -0
- {weightslab-1.2.1/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.2/weightslab/examples/PyTorch/ws-clustering}/face/utils.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/0000f77c-6257be58.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/000f8d37-d4c09a0f.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00a0f008-a315437f.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00c12bd0-bb46e479.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00c29c52-f9524f1e.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00ce6f6d-50bbee62.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00d1bafa-1b47b41c.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00d7268f-fd4487be.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00f0dd0f-5e9c9557.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/0a0d7f4c-ac5c3c8f.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/0a1f4fce-f9cac880.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/0a3bb2d8-c195d91e.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1cac6a7-04e33135.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1ceb32e-3f481b43.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1d10d08-5b108225.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1d22449-15fb948f.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1d7b3ac-5af8623b.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1dce572-c6a8cb5e.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1e1a7b8-0aec80e8.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1e8ad72-c3c79240.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1ee702d-0ae1fc10.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1f0efd9-37a14dda.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b2a0648b-d8e126bc.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b2b70230-bad4ff6e.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/0000f77c-6257be58.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/000f8d37-d4c09a0f.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00a0f008-a315437f.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00c12bd0-bb46e479.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00c29c52-f9524f1e.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00ce6f6d-50bbee62.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00d1bafa-1b47b41c.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00d7268f-fd4487be.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00f0dd0f-5e9c9557.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/0a0d7f4c-ac5c3c8f.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/0a1f4fce-f9cac880.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/0a3bb2d8-c195d91e.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1cac6a7-04e33135.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1ceb32e-3f481b43.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1d10d08-5b108225.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1d22449-15fb948f.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1d7b3ac-5af8623b.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1dce572-c6a8cb5e.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1e1a7b8-0aec80e8.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1e8ad72-c3c79240.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1ee702d-0ae1fc10.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1f0efd9-37a14dda.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b2a0648b-d8e126bc.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b2b70230-bad4ff6e.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/utils/criterions.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/utils/data.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/utils/model.py +0 -0
- /weightslab-1.2.1/weightslab/examples/PyTorch/ws-detection/src/main_ul_native.py → /weightslab-1.2.2/weightslab/examples/Ultralytics/ws-detection/main.py +0 -0
- {weightslab-1.2.1/weightslab/examples/PyTorch/ws-detection/src → weightslab-1.2.2/weightslab/examples/Ultralytics/ws-detection}/requirements.txt +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/integrations/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/integrations/ultralytics/README.md +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/integrations/ultralytics/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/integrations/ultralytics/_utils.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/integrations/ultralytics/collate.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/integrations/ultralytics/dataset.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/integrations/ultralytics/signals.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/models/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/models/model_with_ops.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/models/monkey_patcher.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/modules/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/modules/modules_with_ops.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/modules/neuron_ops.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/proto/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/security/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/backend/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/backend/test_audit_logger.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/backend/test_cli_additional_unit.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/backend/test_instance_signal_logger.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/backend/test_ledgers.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/backend/test_optimizer_interface.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/backend/test_optimizer_interface_additional_unit.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/backend/test_write_history.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/chaos_monkeys_utests/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/chaos_monkeys_utests/test_grpc_chaos_monkey_robustness.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/components/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/components/test_checkpoint_workflow.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/components/test_experiment_hash_and_art.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/components/test_global_monitoring_unit.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/data/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/data/test_data_samples_with_ops.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/data/test_data_service_metadata_copy.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/data/test_data_utils_unit.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/data/test_dataframe_manager_unit.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/data/test_flush_pipeline.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/data/test_h5_array_store.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/data/test_h5_dataframe_store.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/gRPC/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/gRPC/test_grpc_tag_operations.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/general/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/general/test_auditor_mode.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/general/test_cli.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/general/test_hyperparams.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/general/test_logger_snapshot_rotation.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/general/test_signals.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/general/test_signals_wrapping.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/integrations/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/integrations/test_pytorch_lightning_integration.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/integrations/ultralytics/ddp/ddp_ablation.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/integrations/ultralytics/ddp/ddp_test_suite.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/model/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/model/test_constraint_generation.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/model/test_dependency_patterns.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/model/test_logger.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/model/test_model_with_ops.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/model/test_model_with_ops_unit.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/model/test_tracking.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/modules/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/modules/test_modules_with_ops.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/test_secure_docker.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/test_src_functions.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/trainer/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/trainer/services/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/trainer/services/test_agent_prompt_unit.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/trainer/services/test_agent_service_unit.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/trainer/services/test_trainer_services_server.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/trainer/test_trainer_tools.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/utils/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/utils/test_computational_graph_utils_unit.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/utils/test_logs_unit.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/utils/test_modules_dependencies_unit.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/utils/test_plot_graph_render_unit.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/utils/test_plot_graph_unit.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/utils/test_shape_prop_unit.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/utils/test_utils_tools_unit.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/watchdog/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/watchdog/test_lock_monitor.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/watchdog/test_watchdog.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/experiment_context.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/services/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/services/agent/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/services/agent/agent_overview/agent.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/services/agent/agent_overview/query_example.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/services/agent/agent_overview/schema.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/services/agent/intent_prompt.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/services/agent_service.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/services/data_image_utils.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/services/experiment_service.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/services/instance_merger.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/services/model_service.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/services/utils/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/services/utils/tools.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/trainer_tools.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/Dockerfile +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/docker/.dockerignore +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/docker/.env.example +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/docker/docker-compose.yml +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/docker/nginx.base-path.conf copy.template +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/docker/nginx.base-path.conf.template +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/docker/nginx.conf +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/envoy/envoy.downstream_plaintext.yaml +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/envoy/envoy.downstream_upstream_plaintext.yaml +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/envoy/envoy.upstream_plaintext.yaml +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/envoy/envoy.yaml +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/nginx.conf +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/utils/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/utils/computational_graph.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/utils/logs.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/utils/modules_dependencies.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/utils/plot_graph.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/utils/shape_prop.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/utils/tools.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/watchdog/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/watchdog/grpc_watchdog.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/watchdog/lock_monitor.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/watchdog/log_level.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/watchdog/watchdog.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab.egg-info/dependency_links.txt +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab.egg-info/entry_points.txt +0 -0
- {weightslab-1.2.1 → weightslab-1.2.2}/weightslab.egg-info/top_level.txt +0 -0
|
@@ -133,13 +133,17 @@ jobs:
|
|
|
133
133
|
- name: Install project dependencies
|
|
134
134
|
run: |
|
|
135
135
|
python -m pip install --upgrade pip
|
|
136
|
-
|
|
136
|
+
# Install the test extra so pytest, graphviz, torchmetrics,
|
|
137
|
+
# pytorch-lightning and tensorboard are available (several test modules
|
|
138
|
+
# import pytest / use pytest fixtures and cannot run under bare unittest).
|
|
139
|
+
python -m pip install '.[utest]' --extra-index-url https://download.pytorch.org/whl/cpu
|
|
140
|
+
python -m pip install pytest-timeout
|
|
137
141
|
|
|
138
142
|
- name: Run unit tests - General
|
|
139
143
|
run: |
|
|
140
144
|
export WEIGHTSLAB_LOG_LEVEL="DEBUG"
|
|
141
|
-
|
|
142
|
-
python -m
|
|
145
|
+
# A per-test timeout guards against any regression that hangs a test.
|
|
146
|
+
python -m pytest ./weightslab/tests -v --timeout=300
|
|
143
147
|
|
|
144
148
|
# TODO (GP): WL CI do not find WS CI for now; token or visibility problem ??
|
|
145
149
|
# - name: Trigger WeightsStudio CI
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
# AGENTS.md — coding-agent & contributor onboarding
|
|
2
|
+
|
|
3
|
+
This file is the shared context for **AI coding agents** (Claude Code, etc.) and
|
|
4
|
+
**human contributors** working on WeightsLab. It captures the cross-repo
|
|
5
|
+
architecture and the conventions that aren't obvious from any single file, so a
|
|
6
|
+
newcomer (or an agent with no prior memory of the project) can orient quickly
|
|
7
|
+
and debug confidently.
|
|
8
|
+
|
|
9
|
+
> File/line references drift as the code evolves — treat them as starting
|
|
10
|
+
> points and verify against the current source before relying on them.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 1. Working with AI coding agents here
|
|
15
|
+
|
|
16
|
+
WeightsLab is developed with coding agents in the loop. A few things make that
|
|
17
|
+
productive and safe:
|
|
18
|
+
|
|
19
|
+
- **This repo is one of three that ship together** (see §2). Many changes are
|
|
20
|
+
*cross-repo* — a proto edit touches the Python backend *and* the TypeScript
|
|
21
|
+
frontend. An agent that edits only one side leaves the build broken. Always
|
|
22
|
+
ask "does this change cross the proto boundary?"
|
|
23
|
+
- **Keep changes additive and verify.** The default expectation is that
|
|
24
|
+
existing usecases keep working. Run the relevant test suites (§7) before
|
|
25
|
+
declaring done; prefer adding a new branch/flag over changing a shared path.
|
|
26
|
+
- **Agent memory ≠ this file.** Agents may keep private, point-in-time "memory"
|
|
27
|
+
notes outside the repo. This file is the *committed, reviewed* distillation of
|
|
28
|
+
that knowledge — the part we want every contributor and every future agent to
|
|
29
|
+
start from. When you learn something load-bearing and non-obvious, add it
|
|
30
|
+
here (in a PR) rather than leaving it only in private memory.
|
|
31
|
+
- **Onboarding flow:** read §2–§6 top to bottom, then skim §7–§8 before your
|
|
32
|
+
first change. For a feature, find the closest existing example in
|
|
33
|
+
`weightslab/weightslab/examples/` and mirror its structure.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 2. The workspace: three repos, side by side
|
|
38
|
+
|
|
39
|
+
These must be checked out as **sibling directories** — codegen and proxy
|
|
40
|
+
configs reach across by relative path.
|
|
41
|
+
|
|
42
|
+
| Repo | Role | Stack |
|
|
43
|
+
|---|---|---|
|
|
44
|
+
| **weightslab** (this repo) | Backend / core: training instrumentation, data ledger, gRPC service, the shared proto | Python |
|
|
45
|
+
| **weights_studio** | Frontend: the studio UI that inspects/edits a running experiment | TypeScript + Vite |
|
|
46
|
+
| **weightslab_kitchen** | Private examples / reference material | mixed |
|
|
47
|
+
|
|
48
|
+
Layout assumption: `…/Codes/weightslab`, `…/Codes/weights_studio`,
|
|
49
|
+
`…/Codes/weightslab_kitchen`.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 3. Runtime integration (how backend ↔ frontend connect)
|
|
54
|
+
|
|
55
|
+
One proto is the single source of truth:
|
|
56
|
+
`weightslab/weightslab/proto/experiment_service.proto` (`service
|
|
57
|
+
ExperimentService`, ~20 RPCs).
|
|
58
|
+
|
|
59
|
+
- **Backend** implements it in `weightslab/trainer/services/experiment_service.py`
|
|
60
|
+
(servicer), delegating to `data_service.py`, `model_service.py`,
|
|
61
|
+
`agent_service.py`. The servicer and the in-process training loop run in the
|
|
62
|
+
**same process, different threads**, coordinated by the locks in
|
|
63
|
+
`weightslab/components/global_monitoring.py`.
|
|
64
|
+
- **Frontend** consumes a generated TS client
|
|
65
|
+
(`weights_studio/src/experiment_service.client.ts`) produced by
|
|
66
|
+
`npm run generate-proto:data`, which runs `protoc` against the sibling
|
|
67
|
+
weightslab proto.
|
|
68
|
+
- **Wire path:** browser → `:8080` Envoy (grpc-web ↔ grpc transcoding) → Python
|
|
69
|
+
gRPC servicer → training loop. The browser can't speak raw gRPC, so Envoy
|
|
70
|
+
translates.
|
|
71
|
+
|
|
72
|
+
**Editing the proto is a three-step, cross-repo operation — do all three or the
|
|
73
|
+
build breaks:**
|
|
74
|
+
1. Edit `experiment_service.proto`.
|
|
75
|
+
2. Regenerate Python stubs **from the repo root** (import style matters):
|
|
76
|
+
`python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. weightslab/proto/experiment_service.proto`
|
|
77
|
+
3. Regenerate the TS client in weights_studio: `npm run generate-proto:data`.
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## 4. Backend module map (`weightslab/weightslab/`)
|
|
82
|
+
|
|
83
|
+
Public API is re-exported from `__init__.py` (← `src.py`); users do
|
|
84
|
+
`import weightslab as wl`.
|
|
85
|
+
|
|
86
|
+
- **`src.py`** — the public verbs: `watch_or_edit`, `serve`, `keep_serving`,
|
|
87
|
+
`save_signals`, `tag_samples`, `query_*`, decorators (`eval_fn`,
|
|
88
|
+
`pointcloud_thumbnail`, `pointcloud_boxes`), etc.
|
|
89
|
+
- **`trainer/`** — orchestration. `services/experiment_service.py` is the gRPC
|
|
90
|
+
servicer; `services/{model,data,agent}_service.py` are per-domain delegates;
|
|
91
|
+
`services/data_image_utils.py` handles preview/mask encoding.
|
|
92
|
+
- **`components/`** — cross-cutting runtime: `global_monitoring.py`
|
|
93
|
+
(`guard_training_context` / `guard_testing_context`, pause controller, global
|
|
94
|
+
rlock), `checkpoint_manager.py`, `evaluation_controller.py`, `tracking.py`.
|
|
95
|
+
- **`models/`** — `model_with_ops.py` (the watched/op-able model wrapper).
|
|
96
|
+
- **`data/`** — the dataframe + storage backbone: `dataframe_manager.py`,
|
|
97
|
+
`data_samples_with_ops.py`, `sample_stats.py` (`SampleStatsEx`), `data_utils.py`,
|
|
98
|
+
`point_cloud_utils.py`; storage in `h5_dataframe_store.py`, `h5_array_store.py`,
|
|
99
|
+
`array_proxy.py`.
|
|
100
|
+
- **`backend/`** — primitives: `ledgers.py` (`GLOBAL_LEDGER`, the watch/edit
|
|
101
|
+
substrate + hyperparameter registry), the watched-object interfaces, `logger.py`,
|
|
102
|
+
`audit_logger.py`, `cli.py`.
|
|
103
|
+
- **`proto/`**, **`security/`** (`CertAuthManager`), **`ui/`** (bundled
|
|
104
|
+
Docker/Envoy assets), **`examples/`**.
|
|
105
|
+
|
|
106
|
+
**Fan-in:** `ledgers.GLOBAL_LEDGER` is the hub — `watch_or_edit` registers
|
|
107
|
+
objects there; the servicer reads/mutates through it.
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## 5. Frontend module map (`weights_studio/src/`)
|
|
112
|
+
|
|
113
|
+
Vite + TypeScript; entry `index.html` → `src/main.ts`.
|
|
114
|
+
|
|
115
|
+
- **`main.ts`** — bootstrap: infers host/port (default `:8080`), builds the
|
|
116
|
+
grpc-web transport, wires panels and the sample modal.
|
|
117
|
+
- **`experiment_service.client.ts` / `experiment_service.ts`** — generated
|
|
118
|
+
client/types (do **not** hand-edit; regenerate via `npm run generate-proto:data`).
|
|
119
|
+
- **`grid_data/`** — sample grid + modal rendering (`GridCell.ts`,
|
|
120
|
+
`DataImageService.ts`, `BboxRenderer.ts`, `SegmentationRenderer.ts`,
|
|
121
|
+
`PointCloudViewer.ts` / `PointCloudService.ts`).
|
|
122
|
+
- **`left_panel/`, `plots/`, `agent/`, `helpers.ts`, `ui/`, `utils/`** — controls,
|
|
123
|
+
Chart.js plots, the LLM agent panel, shared helpers/reconnection.
|
|
124
|
+
- Tests in `tests/` (vitest unit + Playwright E2E).
|
|
125
|
+
|
|
126
|
+
Build/proto scripts read the **sibling weightslab repo** at codegen time.
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## 6. User-integration API (`import weightslab as wl`)
|
|
131
|
+
|
|
132
|
+
How a user's own PyTorch script plugs in so the studio can inspect/edit it live.
|
|
133
|
+
Examples: `weightslab/weightslab/examples/{PyTorch,Lightning,Usecases}/<usecase>/`
|
|
134
|
+
(each a `main.py` + `config.yaml`).
|
|
135
|
+
|
|
136
|
+
Wrap each training object with `wl.watch_or_edit(obj, flag=...)`; the returned
|
|
137
|
+
tracked proxy is registered in the global ledger:
|
|
138
|
+
- `flag="hyperparameters"` (dict), `flag="model"` (nn.Module, `device=…`),
|
|
139
|
+
`flag="optimizer"`, `flag="data"` (Dataset → tracked DataLoader: `loader_name`,
|
|
140
|
+
`batch_size`, `is_training`, `collate_fn`, …), `flag="loss"` (a
|
|
141
|
+
`reduction="none"` criterion; called with `(preds_raw, targets, batch_ids=ids,
|
|
142
|
+
preds=preds)`), `flag="metric"`.
|
|
143
|
+
|
|
144
|
+
Conventions:
|
|
145
|
+
- Wrap the train step in `with guard_training_context:` and eval in
|
|
146
|
+
`with guard_testing_context:` (from `weightslab.components.global_monitoring`)
|
|
147
|
+
— this is how pause/resume and train/test separation work.
|
|
148
|
+
- Use `model.get_age()` (steps actually trained; survives checkpoint reloads),
|
|
149
|
+
not the raw loop counter.
|
|
150
|
+
- `wl.serve(serving_grpc=…, serving_cli=…)` starts background serving threads in
|
|
151
|
+
the same process; end the script with `wl.keep_serving()`.
|
|
152
|
+
- `task_type` on the dataset/model selects rendering: `classification`,
|
|
153
|
+
`segmentation`, `detection`, `detection_pointcloud`.
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## 7. Tests & verification
|
|
158
|
+
|
|
159
|
+
- **Backend (Python):** `python -m pytest weightslab/tests/...` — domains under
|
|
160
|
+
`tests/{data,trainer,gRPC,...}`.
|
|
161
|
+
- **Frontend unit (vitest):** `npm run test` in weights_studio
|
|
162
|
+
(`tests/utests/**`).
|
|
163
|
+
- **E2E / user-simulation (Playwright): lives in weights_studio, not here** —
|
|
164
|
+
the tests drive the real UI against a backend the harness spins up
|
|
165
|
+
(`test:realtime:*`, `test:e2e:*`).
|
|
166
|
+
|
|
167
|
+
Before declaring a cross-repo change done: regenerate protos (both sides),
|
|
168
|
+
build the frontend (`npm run build`), and run the affected unit suites.
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## 8. Point-cloud detection pipeline (`detection_pointcloud`)
|
|
173
|
+
|
|
174
|
+
A worked example of a non-trivial cross-repo feature; see
|
|
175
|
+
`weightslab/weightslab/examples/Usecases/ws-3d-lidar-detection/` and
|
|
176
|
+
`weightslab/weightslab/data/point_cloud_utils.py`.
|
|
177
|
+
|
|
178
|
+
- **Task type** `detection_pointcloud` (covers 2D and 3D; box-row column count
|
|
179
|
+
decides dimensionality; legacy alias `detection_3d`).
|
|
180
|
+
- **Dataset yields** `(cloud [M,F], uid, boxes, metadata)`. Cloud columns:
|
|
181
|
+
`x,y,z,intensity` (model reads the first 4) + optional viz-only channels
|
|
182
|
+
(`nx,ny,nz` normals, `r,g,b` colour) named via `point_feature_names`. Boxes:
|
|
183
|
+
3D `[cx,cy,cz,dx,dy,dz,yaw,cls?,conf?]` or 2D `[cx,cy,dx,dy,cls?,conf?]`;
|
|
184
|
+
predictions use the **same** schema.
|
|
185
|
+
- **Previews** (thumbnail/grid/modal image) are **server-rendered 2D** (BEV or
|
|
186
|
+
range projection) with boxes projected on; the raw cloud streams to the
|
|
187
|
+
browser only for the interactive **three.js 3D viewer** (modal "3D" toggle),
|
|
188
|
+
via the `GetPointCloud` streaming RPC. Colour modes are data-driven (height /
|
|
189
|
+
distance / intensity / camera-RGB / normal shading).
|
|
190
|
+
- **Override hooks:** dataset methods `render_thumbnail_2d` / `project_boxes_2d`,
|
|
191
|
+
or global decorators `@wl.pointcloud_thumbnail` / `@wl.pointcloud_boxes`.
|
|
192
|
+
- **Real data:** `source: kitti_raw` downloads a KITTI raw drive (sync +
|
|
193
|
+
tracklets for GT boxes + calibration for RGB) to a temp dir; falls back to
|
|
194
|
+
synthetic scenes offline.
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## 9. Contributor checklist & gotchas
|
|
199
|
+
|
|
200
|
+
- Proto change → regen Python (from repo root) **and** TS, or runtime breaks.
|
|
201
|
+
- The three repos must sit side by side; codegen uses relative paths.
|
|
202
|
+
- Training + serving share a process — respect the `global_monitoring` locks and
|
|
203
|
+
the `guard_*` context managers.
|
|
204
|
+
- TLS/auth in the bundled UI is decided by the presence of certs under
|
|
205
|
+
`WEIGHTSLAB_CERTS_DIR` (single source of truth) — don't hardcode secure/insecure.
|
|
206
|
+
- Per-instance data (detection/segmentation) uses a MultiIndex
|
|
207
|
+
`(sample_id, annotation_id)` through the dataframe and H5 store.
|
|
208
|
+
- Playwright/E2E tests belong in weights_studio, not here.
|
|
209
|
+
- Don't commit large datasets; real-data downloads go to a temp dir.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Changelog - 2026-06-12 v1.2.2 (1)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: weightslab
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.2
|
|
4
4
|
Summary: Paving the way between black-box and white-box modeling.
|
|
5
5
|
Author-email: Alexandru-Andrei Rotaru <alexandru@graybx.com>, Guillaue Pelluet <guillaue@graybx.com>
|
|
6
6
|
License: BSD 2-clause
|
|
@@ -26,6 +26,7 @@ Requires-Dist: torch<2.9,>=2.1; python_version < "3.13"
|
|
|
26
26
|
Requires-Dist: torch==2.9; python_version >= "3.13"
|
|
27
27
|
Requires-Dist: torchvision<0.24,>=0.16; python_version < "3.13"
|
|
28
28
|
Requires-Dist: torchvision<1,>=0.24; python_version >= "3.13"
|
|
29
|
+
Requires-Dist: torchmetrics>=1.9
|
|
29
30
|
Requires-Dist: grpcio<2,>=1.80
|
|
30
31
|
Requires-Dist: protobuf<7,>=4.25
|
|
31
32
|
Requires-Dist: pydantic<3,>=2.7
|
|
@@ -112,40 +113,117 @@ The granular statistics and interactive paradigm enable powerful workflows:
|
|
|
112
113
|
* Iterative pruning or growing of the architectures (INCOMING feature)
|
|
113
114
|
|
|
114
115
|
|
|
115
|
-
##
|
|
116
|
-
The password is **graybx**. More demo to come in the future!
|
|
116
|
+
## Quick Start
|
|
117
117
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
118
|
+
### Requirements
|
|
119
|
+
|
|
120
|
+
- **Docker Desktop v4.77 or newer** — required to deploy the Weights Studio UI (`weightslab ui launch`).
|
|
121
|
+
- **Docker Compose v2** (the `docker compose` CLI plugin, bundled with Docker Desktop) — *recommended*. The legacy v1 standalone binary (`docker-compose`, **≥ 1.27**) also works: `weightslab ui launch` auto-detects whichever is installed and uses it. Compose v1 below 1.27 is **not** supported.
|
|
122
|
+
- **Python >=3.10, <3.15** — to install and run the `weightslab` framework.
|
|
123
|
+
> [!OPTIONAL]
|
|
124
|
+
> We are fully compatible with Conda.
|
|
125
|
+
|
|
126
|
+
> [!TIP]
|
|
127
|
+
> Check your Compose version with `docker compose version` (v2) or `docker-compose --version` (v1). If `docker compose version` prints a version string, you have v2.
|
|
121
128
|
|
|
122
129
|
|
|
123
|
-
## Getting Started
|
|
124
130
|
### Installation
|
|
125
131
|
|
|
126
|
-
|
|
132
|
+
> [!OPTIONAL]
|
|
133
|
+
> Seting a clean environment:
|
|
134
|
+
> Define a Python environment:
|
|
127
135
|
```bash
|
|
128
136
|
python -m venv weightslab_venv
|
|
129
137
|
./weightslab_venv/Scripts/activate
|
|
130
138
|
```
|
|
131
|
-
Or install directly on your machine.
|
|
139
|
+
> Or install directly on your machine.
|
|
132
140
|
|
|
133
141
|
Install our framework:
|
|
134
142
|
```bash
|
|
135
143
|
pip install weightslab
|
|
136
144
|
```
|
|
137
145
|
|
|
138
|
-
Deploy our interface
|
|
146
|
+
Deploy our interface:
|
|
139
147
|
```bash
|
|
140
148
|
weightslab ui launch
|
|
141
149
|
```
|
|
142
150
|
|
|
151
|
+
`weightslab ui launch` removes any stale weightslab/weights_studio Docker resources that could break the launch, then starts the UI stack. **By default it runs unsecured (HTTP, no gRPC auth) — no certificates are generated.**
|
|
152
|
+
|
|
153
|
+
To run secured (HTTPS + gRPC auth), pass `--certs`:
|
|
154
|
+
```bash
|
|
155
|
+
weightslab ui launch --certs # generates TLS certs + a gRPC auth token if missing, then launches secured
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
> [!IMPORTANT]
|
|
159
|
+
> When using certs, set `WEIGHTSLAB_CERTS_DIR` so the training backend and any new terminal use the **same** certificates (it is the single source of truth). `weightslab se` and `weightslab ui launch --certs` print the exact export/`setx` command for your shell. You can also generate certs up front with `weightslab se`.
|
|
160
|
+
<!--
|
|
161
|
+
Want to see it working end to end without writing any code? Start a bundled demo (it installs the example's requirements first — no prompts — then trains and serves until you stop it with `Ctrl+C`). It defaults to classification; pick another with a flag:
|
|
162
|
+
```bash
|
|
163
|
+
weightslab start example # classification (default)
|
|
164
|
+
weightslab start example --cls # classification
|
|
165
|
+
weightslab start example --seg # segmentation
|
|
166
|
+
weightslab start example --det # detection
|
|
167
|
+
weightslab start example --clus # clustering
|
|
168
|
+
weightslab start example --gen # generation
|
|
169
|
+
``` -->
|
|
170
|
+
<!-- Then run `weightslab ui launch` in another terminal and open `https://localhost:5173`. -->
|
|
171
|
+
|
|
172
|
+
<!-- Run `weightslab`, `weightslab help`, or `weightslab -h` at any time to see the banner and the full command reference. -->
|
|
173
|
+
|
|
143
174
|
> [!IMPORTANT]
|
|
144
175
|
> For a detailed installation guide and more advanced features, please see the [Installation Documentation](https://grayboxtech.github.io/weightslab/latest/quickstart.html).
|
|
145
176
|
|
|
146
177
|
|
|
147
178
|
## Quick Training Example
|
|
148
179
|
|
|
180
|
+
### Step-by-Step Integration
|
|
181
|
+
|
|
182
|
+
1. **Add the import** at the top of your script:
|
|
183
|
+
```python
|
|
184
|
+
import weightslab as wl # ← Include our SDK into your experiment
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
2. **Wrap your parameters** with WeightsLab tracking:
|
|
188
|
+
```python
|
|
189
|
+
model = wl.watch_or_edit(parameters, ...) # ← Now WeightsLab monitors your parameters and allow you to update them from your UI
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
3. **Wrap your model** with WeightsLab tracking:
|
|
193
|
+
```python
|
|
194
|
+
model = wl.watch_or_edit(SimpleModel(...), ...) # ← Now WeightsLab monitors your model state
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
4. **Wrap your optimizer** with WeightsLab tracking:
|
|
198
|
+
```python
|
|
199
|
+
optimizer = wl.watch_or_edit(optim.Adam(...), ...) # ← Tracks optimizer state and update optimizer learning rate from your UI
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
5. **Wrap your signal** with WeightsLab tracking:
|
|
203
|
+
```python
|
|
204
|
+
criterion = wl.watch_or_edit(nn.CrossEntropyLoss(reduction="none"), ...) # ← Tracks this signal and others (metrics, ..etc) from your UI
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
6. **Wrap your dataset** with WeightsLab tracking:
|
|
208
|
+
```python
|
|
209
|
+
train_loader = wl.watch_or_edit(dataset, ...) # ← Tracks this dataset and others (validation, test) from your UI
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
7. **Run your training script** as usual:
|
|
213
|
+
```bash
|
|
214
|
+
python train.py
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
8. **Launch the UI** in another terminal:
|
|
218
|
+
```bash
|
|
219
|
+
weightslab ui launch
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
9. **Open your browser** to `https://localhost:5173` to track experiment evoluation and results!
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
### Details
|
|
226
|
+
|
|
149
227
|
<details>
|
|
150
228
|
<summary><b>Here's a complete example showing how to integrate WeightsLab into a basic PyTorch training script:</b></summary>
|
|
151
229
|
|
|
@@ -158,7 +236,7 @@ import torch
|
|
|
158
236
|
import torch.nn as nn
|
|
159
237
|
import torch.optim as optim
|
|
160
238
|
from torch.utils.data import DataLoader, TensorDataset
|
|
161
|
-
import weightslab as wl # ← Import WeightsLab (
|
|
239
|
+
import weightslab as wl # ← Import WeightsLab (uses TLS certs from WEIGHTSLAB_CERTS_DIR if present)
|
|
162
240
|
|
|
163
241
|
|
|
164
242
|
# Define a simple model
|
|
@@ -234,7 +312,7 @@ def main():
|
|
|
234
312
|
|
|
235
313
|
# Training loop
|
|
236
314
|
print("🏃 Starting training...")
|
|
237
|
-
print("💡 Launch the UI with: weightslab ui
|
|
315
|
+
print("💡 Launch the UI with: weightslab ui launch")
|
|
238
316
|
print("🌐 Open browser to: https://localhost:5173")
|
|
239
317
|
n_epochs = parameters.get('n_epochs')
|
|
240
318
|
pbar = tqdm.tqdm(range(n_epochs), desc='Training..') if parameters.get('tqdm_display', False) else range(n_epochs)
|
|
@@ -360,207 +438,34 @@ if __name__ == "__main__":
|
|
|
360
438
|
</details>
|
|
361
439
|
|
|
362
440
|
|
|
363
|
-
### Step-by-Step Integration
|
|
364
|
-
|
|
365
|
-
1. **Add the import** at the top of your script:
|
|
366
|
-
```python
|
|
367
|
-
import weightslab as wl # ← Include our SDK into your experiment
|
|
368
|
-
```
|
|
369
|
-
|
|
370
|
-
2. **Wrap your parameters** with WeightsLab tracking:
|
|
371
|
-
```python
|
|
372
|
-
model = wl.watch_or_edit(parameters, ...) # ← Now WeightsLab monitors your parameters and allow you to update them from your UI
|
|
373
|
-
```
|
|
374
|
-
|
|
375
|
-
3. **Wrap your model** with WeightsLab tracking:
|
|
376
|
-
```python
|
|
377
|
-
model = wl.watch_or_edit(SimpleModel(...), ...) # ← Now WeightsLab monitors your model state
|
|
378
|
-
```
|
|
379
|
-
|
|
380
|
-
4. **Wrap your optimizer** with WeightsLab tracking:
|
|
381
|
-
```python
|
|
382
|
-
optimizer = wl.watch_or_edit(optim.Adam(...), ...) # ← Tracks optimizer state and update optimizer learning rate from your UI
|
|
383
|
-
```
|
|
384
|
-
|
|
385
|
-
5. **Wrap your signal** with WeightsLab tracking:
|
|
386
|
-
```python
|
|
387
|
-
criterion = wl.watch_or_edit(nn.CrossEntropyLoss(reduction="none"), ...) # ← Tracks this signal and others (metrics, ..etc) from your UI
|
|
388
|
-
```
|
|
389
|
-
|
|
390
|
-
6. **Wrap your dataset** with WeightsLab tracking:
|
|
391
|
-
```python
|
|
392
|
-
train_loader = wl.watch_or_edit(dataset, ...) # ← Tracks this dataset and others (validation, test) from your UI
|
|
393
|
-
```
|
|
394
|
-
|
|
395
|
-
7. **Run your training script** as usual:
|
|
396
|
-
```bash
|
|
397
|
-
python train.py
|
|
398
|
-
```
|
|
399
|
-
|
|
400
|
-
8. **Launch the UI** in another terminal:
|
|
401
|
-
```bash
|
|
402
|
-
weightslab ui docker launch
|
|
403
|
-
```
|
|
404
|
-
|
|
405
|
-
9. **Open your browser** to `https://localhost:5173` to track experiment evoluation and results!
|
|
406
|
-
|
|
407
441
|
|
|
408
442
|
### What WeightsLab Does Automatically
|
|
409
443
|
|
|
410
|
-
-
|
|
411
|
-
-
|
|
412
|
-
- 📊 **
|
|
444
|
+
<!-- - 📊 **Tracks model parameters** and optimizer state in real-time -->
|
|
445
|
+
<!-- - 🔄 **Enables model editing (incoming feature)** and hyperparameter tuning through the UI -->
|
|
446
|
+
- 📊 **Experiment tracking for reproducibility**
|
|
413
447
|
- 📈 **Provides live metrics** and visualization in the web UI
|
|
414
|
-
- 🔄 **Enables
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
## Security
|
|
418
|
-
|
|
419
|
-
By default, WeightsLab runs in **unsecured mode** (NO TLS, HTTP, no gRPC authentification). To enable TLS encryption and gRPC authentication:
|
|
420
|
-
|
|
421
|
-
### Quick Setup + Launch
|
|
422
|
-
Setup secure environment AND launch Docker in one command:
|
|
423
|
-
```bash
|
|
424
|
-
weightslab ui docker se
|
|
425
|
-
export WEIGHTSLAB_CERTS_DIR='~/.weightslab-certs/' # Windows commands is
|
|
426
|
-
```
|
|
427
|
-
|
|
428
|
-
This will:
|
|
429
|
-
1. Generate TLS certificates and gRPC auth token in `~/.weightslab-certs/`
|
|
430
|
-
2. Launch the Docker stack with security enabled
|
|
431
|
-
3. If setup fails, Docker still launches (unsecured fallback)
|
|
432
|
-
|
|
433
|
-
### Separate Steps (If Needed)
|
|
434
|
-
Setup secure environment only:
|
|
435
|
-
```bash
|
|
436
|
-
weightslab se
|
|
437
|
-
|
|
438
|
-
# Ubuntu command
|
|
439
|
-
echo 'export WEIGHTSLAB_CERTS_DIR="~/.weightslab-certs/"' >> ~/.bashrc
|
|
440
|
-
source ~/.bashrc
|
|
441
|
-
|
|
442
|
-
# Windows command
|
|
443
|
-
# setx WEIGHTSLAB_CERTS_DIR '~/.weightslab-certs/' /M
|
|
444
|
-
```
|
|
445
|
-
|
|
446
|
-
Then launch Docker later:
|
|
447
|
-
```bash
|
|
448
|
-
weightslab ui docker launch
|
|
449
|
-
```
|
|
450
|
-
|
|
451
|
-
### Custom Certificates Directory
|
|
452
|
-
Store certificates in a custom location using the `WEIGHTSLAB_CERTS_DIR` environment variable:
|
|
453
|
-
```bash
|
|
454
|
-
# Generate the certs
|
|
455
|
-
weightslab se "/path/to/my/certs"
|
|
456
|
-
|
|
457
|
-
# Export path to env.
|
|
458
|
-
# Ubuntu command
|
|
459
|
-
echo 'export WEIGHTSLAB_CERTS_DIR=/path/to/my/certs' >> ~/.bashrc
|
|
460
|
-
source ~/.bashrc
|
|
461
|
-
|
|
462
|
-
# Windows command
|
|
463
|
-
# setx WEIGHTSLAB_CERTS_DIR /path/to/my/certs /M
|
|
448
|
+
- 🔄 **Enables data supervision during training** and experiment hyperparameter tuning through the UI
|
|
464
449
|
|
|
465
|
-
# Start UI
|
|
466
|
-
weightslab ui docker launch
|
|
467
|
-
```
|
|
468
|
-
|
|
469
|
-
### Options for Secure Environment Setup
|
|
470
|
-
|
|
471
|
-
**For `weightslab se` or `weightslab ui docker se`:**
|
|
472
|
-
|
|
473
|
-
| Flag | Effect |
|
|
474
|
-
|---|---|
|
|
475
|
-
| `--force-certs` | Regenerate certificates even if they already exist |
|
|
476
|
-
| `--no-auth` | Skip gRPC auth token generation (TLS only) |
|
|
477
|
-
|
|
478
|
-
**Examples:**
|
|
479
|
-
```bash
|
|
480
|
-
weightslab se --force-certs # Regenerate certs only
|
|
481
|
-
weightslab se --no-auth # TLS only, no gRPC token
|
|
482
|
-
weightslab ui docker se # Setup + launch in one
|
|
483
|
-
weightslab ui docker se --force-certs # Setup (regenerate) + launch
|
|
484
|
-
```
|
|
485
|
-
|
|
486
|
-
### What Gets Created?
|
|
487
|
-
After running `weightslab se` or `weightslab ui docker se`, your `~/.weightslab-certs/` directory contains:
|
|
488
|
-
- `backend-server.crt` — Backend TLS certificate
|
|
489
|
-
- `backend-server.key` — Backend TLS private key
|
|
490
|
-
- `ca.crt` — CA certificate
|
|
491
|
-
- `.grpc_auth_token` — gRPC authentication token (if not using `--no-auth`)
|
|
492
|
-
|
|
493
|
-
### Running Without Security
|
|
494
|
-
To explicitly run in unsecured mode, delete the certificates directory:
|
|
495
|
-
```bash
|
|
496
|
-
rm -r ~/.weightslab-certs
|
|
497
|
-
weightslab ui docker launch # Falls back to unsecured HTTP
|
|
498
|
-
```
|
|
499
450
|
|
|
500
|
-
|
|
501
|
-
**Secured environment:**
|
|
502
|
-
```bash
|
|
503
|
-
weightslab se # Setup certs and token
|
|
504
|
-
weightslab ui docker launch # Launch Docker
|
|
505
|
-
python main.py # Backend finds certs, runs secured
|
|
506
|
-
```
|
|
451
|
+
## Examples
|
|
507
452
|
|
|
508
|
-
|
|
453
|
+
### Local examples
|
|
454
|
+
After starting the UI, launch a local experiment with the command:
|
|
509
455
|
```bash
|
|
510
|
-
weightslab
|
|
511
|
-
|
|
456
|
+
weightslab start example # classification (default)
|
|
457
|
+
# weightslab start example --cls # classification
|
|
458
|
+
# weightslab start example --seg # segmentation
|
|
459
|
+
# weightslab start example --det # detection
|
|
460
|
+
# weightslab start example --clus # clustering
|
|
461
|
+
# weightslab start example --gen # generation
|
|
512
462
|
```
|
|
513
463
|
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
Quickstart examples:
|
|
520
|
-
- [WeightsLab - Classification toy (PyTorch)](https://github.com/GrayboxTech/weightslab/tree/main/weightslab/examples/PyTorch/ws-classification)
|
|
521
|
-
- [WeightsLab - Segmentation toy (PyTorch)](https://github.com/GrayboxTech/weightslab/tree/main/weightslab/examples/PyTorch/ws-segmentation)
|
|
522
|
-
- [WeightsLab - Detection toy (PyTorch)](https://github.com/GrayboxTech/weightslab/tree/main/weightslab/examples/PyTorch/ws-detection)
|
|
523
|
-
- [WeightsLab - Classification toy (PyTorch Lightning)](https://github.com/GrayboxTech/weightslab/tree/main/weightslab/examples/PyTorch_Lightning/ws-classification)
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
## Configuration
|
|
527
|
-
|
|
528
|
-
WeightsLab and Weightslab UI are configured through environment variables.
|
|
529
|
-
A fully commented .env template is included at the repository root — copy it and adjust for your setup:
|
|
530
|
-
|
|
531
|
-
```bash
|
|
532
|
-
cp .env .env.local # or edit .env directly
|
|
533
|
-
```
|
|
534
|
-
|
|
535
|
-
| Category | Key variables |
|
|
536
|
-
|---|---|
|
|
537
|
-
| **Logging** | `WEIGHTSLAB_LOG_LEVEL`, `WEIGHTSLAB_LOG_TO_FILE`, `WEIGHTSLAB_ROOT_LOG_DIR` |
|
|
538
|
-
| **gRPC server** | `GRPC_BACKEND_HOST`, `GRPC_BACKEND_PORT`, `GRPC_MAX_MESSAGE_BYTES`, `GRPC_TLS_ENABLED`, `GRPC_TLS_CERT_DIR`, `GRPC_TLS_CERT_FILE`, `GRPC_TLS_KEY_FILE`, `GRPC_TLS_CA_FILE`, `GRPC_TLS_REQUIRE_CLIENT_AUTH`, `GRPC_AUTH_TOKEN`, `GRPC_AUTH_TOKENS` |
|
|
539
|
-
| **Watchdog** | `GRPC_WATCHDOG_STUCK_SECONDS`, `GRPC_WATCHDOG_INTERVAL_SECONDS`, `GRPC_WATCHDOG_RESTART_THRESHOLD`, `GRPC_WATCHDOG_EXIT_ON_STUCK` |
|
|
540
|
-
| **Data / cache** | `WL_MAX_PREVIEW_CACHE_SIZE`, `WL_PREVIEW_CACHE_WARMUP_WAIT_MS`, `WL_DEFAULT_THUMBNAIL_SIZE`, `WL_INSTANCE_AGGREGATION`, `WEIGHTSLAB_SAVE_PREDICTIONS_IN_H5` |
|
|
541
|
-
| **AI keys** | `OPENROUTER_API_KEY` |
|
|
542
|
-
| **Agent config** | `AGENT_CONFIG_PATH` |
|
|
543
|
-
| **Weightslab UI** | `VITE_SERVER_HOST`, `VITE_SERVER_PORT`, `VITE_HISTOGRAM_MAX_BINS`, `ENVOY_HOST`, `ENVOY_PORT` |
|
|
544
|
-
|
|
545
|
-
`AGENT_CONFIG_PATH` lets you point the data agent to a custom directory that contains `agent_config.yaml`.
|
|
546
|
-
If set, WeightsLab looks for `<AGENT_CONFIG_PATH>/agent_config.yaml` before fallback locations.
|
|
547
|
-
|
|
548
|
-
WeightsLab also reads TLS settings from registered runtime config (hyperparameters),
|
|
549
|
-
using config-first precedence over environment variables.
|
|
550
|
-
|
|
551
|
-
If TLS is enabled (`grpc_tls_enabled` in config or `GRPC_TLS_ENABLED` in env),
|
|
552
|
-
certificate path resolution is:
|
|
553
|
-
1. config file paths (`grpc_tls_cert_file`, `grpc_tls_key_file`, `grpc_tls_ca_file`)
|
|
554
|
-
2. env file paths (`GRPC_TLS_CERT_FILE`, `GRPC_TLS_KEY_FILE`, `GRPC_TLS_CA_FILE`)
|
|
555
|
-
3. config directory (`grpc_tls_cert_dir`)
|
|
556
|
-
4. env directory (`GRPC_TLS_CERT_DIR`)
|
|
557
|
-
5. default `~/certs` (`backend-server.crt`, `backend-server.key`, `ca.crt`)
|
|
558
|
-
|
|
559
|
-
TLS flags also follow config-first precedence:
|
|
560
|
-
`grpc_tls_enabled` then `GRPC_TLS_ENABLED`, and
|
|
561
|
-
`grpc_tls_require_client_auth` then `GRPC_TLS_REQUIRE_CLIENT_AUTH`.
|
|
562
|
-
|
|
563
|
-
> Full documentation with all variables and their descriptions: [docs/configuration.rst](docs/configuration.rst)
|
|
464
|
+
### Cloud examples
|
|
465
|
+
Find our demos online. The password is **graybx**.
|
|
466
|
+
<a href="https://preview.graybx.com/">
|
|
467
|
+
<p style="text-indent:20px;">DEMOS</p>
|
|
468
|
+
</a>
|
|
564
469
|
|
|
565
470
|
|
|
566
471
|
## AI Agent
|
|
@@ -575,9 +480,10 @@ Use OpenRouter when you want larger hosted models and model selection directly f
|
|
|
575
480
|
|
|
576
481
|
|
|
577
482
|
### Cloud OpenRouter
|
|
578
|
-
#### SDK Configuration
|
|
579
483
|
You can either preconfigure OpenRouter in `agent_config.yaml` / `.env`, or initialize it interactively from Weightslab UI.
|
|
580
484
|
|
|
485
|
+
#### SDK Configuration
|
|
486
|
+
|
|
581
487
|
Example static configuration:
|
|
582
488
|
|
|
583
489
|
```yaml
|
|
@@ -606,16 +512,6 @@ OpenRouter models can be initialized and set directly from the UI:
|
|
|
606
512
|
|
|
607
513
|
The default OpenRouter model, as recommended by Graybx, is `meta-llama/llama-3.3-70b-instruct`.
|
|
608
514
|
|
|
609
|
-
### Agent Commands in Weightslab UI
|
|
610
|
-
|
|
611
|
-
The agent input supports these commands:
|
|
612
|
-
|
|
613
|
-
- `/init` initializes the cloud provider flow for OpenRouter
|
|
614
|
-
- `/model` opens the model chooser and switches the active OpenRouter model
|
|
615
|
-
- `/reset` clears the current runtime agent connection and status
|
|
616
|
-
|
|
617
|
-
The agent history also records setup and model-change events as log-style entries, separate from normal agent responses.
|
|
618
|
-
|
|
619
515
|
### Typical Usage Flow
|
|
620
516
|
|
|
621
517
|
1. Start your WeightsLab backend (e.g., "main.py").
|
|
@@ -629,11 +525,16 @@ The agent history also records setup and model-change events as log-style entrie
|
|
|
629
525
|
|
|
630
526
|
## Documentation (API + SDK)
|
|
631
527
|
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
528
|
+
Find our documentation [online](https://grayboxtech.github.io/weightslab/latest/index.html).
|
|
529
|
+
|
|
530
|
+
|
|
531
|
+
## Contributing & onboarding
|
|
532
|
+
|
|
533
|
+
New here (human or AI coding agent)? Start with [AGENTS.md](AGENTS.md) — it
|
|
534
|
+
captures the cross-repo architecture (weightslab backend ↔ weights_studio
|
|
535
|
+
frontend via the shared proto), the module maps, the `wl.watch_or_edit`
|
|
536
|
+
integration pattern, where tests live, and the gotchas that aren't obvious from
|
|
537
|
+
any single file. It's the fastest way to orient before a first change.
|
|
637
538
|
|
|
638
539
|
|
|
639
540
|
## Community
|