weightslab 1.2.0__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.0 → weightslab-1.2.2}/.github/workflows/ci.yml +7 -3
- {weightslab-1.2.0 → weightslab-1.2.2}/.github/workflows/release.yml +20 -10
- {weightslab-1.2.0 → 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.0/weightslab.egg-info → weightslab-1.2.2}/PKG-INFO +122 -219
- {weightslab-1.2.0 → weightslab-1.2.2}/README.md +118 -218
- {weightslab-1.2.0 → weightslab-1.2.2}/docs/quickstart.rst +55 -4
- {weightslab-1.2.0 → weightslab-1.2.2}/pyproject.toml +6 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/__init__.py +25 -37
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/_version.py +3 -3
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/data/data_utils.py +34 -1
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/data/dataframe_manager.py +1 -1
- {weightslab-1.2.0 → 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.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-classification/config.yaml +7 -8
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-classification/main.py +11 -3
- {weightslab-1.2.0/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.2/weightslab/examples/PyTorch/ws-clustering}/config.yaml +1 -1
- {weightslab-1.2.0/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.0/weightslab/examples/PyTorch/ws-vad → weightslab-1.2.2/weightslab/examples/PyTorch/ws-generation}/config.yaml +4 -4
- {weightslab-1.2.0/weightslab/examples/PyTorch/ws-vad → weightslab-1.2.2/weightslab/examples/PyTorch/ws-generation}/main.py +2 -2
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/config.yaml +3 -3
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/main.py +4 -8
- {weightslab-1.2.0/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/Ultralytics/ws-detection/requirements.txt +1 -0
- 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.0 → weightslab-1.2.2}/weightslab/integrations/ultralytics/trainer.py +6 -5
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/proto/experiment_service.proto +27 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/proto/experiment_service_pb2.py +55 -51
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/proto/experiment_service_pb2_grpc.py +45 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/security/cert_auth_manager.py +73 -13
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/src.py +72 -9
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/backend/test_compare_dataloaders.py +78 -62
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/backend/test_data_loader_interface.py +37 -46
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/backend/test_logger_core.py +5 -0
- {weightslab-1.2.0 → 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.0 → 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.0 → weightslab-1.2.2}/weightslab/tests/gRPC/test_grpc_user_actions.py +5 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/trainer/services/test_trainer_services_unit.py +6 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/services/agent/agent.py +32 -1
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/services/data_service.py +247 -53
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/trainer_services.py +5 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/docker/DEPLOYMENT.md +14 -4
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/docker/nginx-entrypoint.sh +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/docker/test-deployment.sh +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/docker/utils/build-and-deploy.sh +106 -67
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/docker/utils/generate-certs-auth-token.ps1 +8 -2
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/docker/utils/generate-certs-auth-token.sh +10 -1
- {weightslab-1.2.0 → 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.0 → weightslab-1.2.2/weightslab.egg-info}/PKG-INFO +122 -219
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab.egg-info/SOURCES.txt +45 -20
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab.egg-info/requires.txt +4 -0
- weightslab-1.2.0/CHANGELOG.md +0 -1
- weightslab-1.2.0/_ck.txt +0 -1938
- weightslab-1.2.0/weightslab/examples/PyTorch/ws-detection/src/main.py +0 -135
- weightslab-1.2.0/weightslab/examples/PyTorch/ws-detection/src/utils/criterions.py +0 -390
- weightslab-1.2.0/weightslab/examples/PyTorch/ws-detection/src/utils/data.py +0 -116
- weightslab-1.2.0/weightslab/examples/PyTorch/ws-detection/src/utils/trainer.py +0 -195
- weightslab-1.2.0/weightslab/examples/PyTorch/ws-detection/src/yolo_pipeline.py +0 -171
- weightslab-1.2.0/weightslab/tests/backend/test_ui_docker_bridge.py +0 -567
- weightslab-1.2.0/weightslab/tests/test_ddp_down_only_change.py +0 -62
- weightslab-1.2.0/weightslab/ui_docker_bridge.py +0 -548
- {weightslab-1.2.0 → weightslab-1.2.2}/.gitattributes +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/.github/workflows/docs-pages.yml +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/LICENSE +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/agent_config.yaml +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/docs/_static/.gitkeep +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/docs/_static/custom.css +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/docs/_static/favicon.png +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/docs/_static/logo-dark.png +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/docs/_static/logo-light.png +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/docs/_static/version-switcher.js +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/docs/_static/weights_studio_architecture.png +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/docs/_templates/.gitkeep +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/docs/conf.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/docs/configuration.rst +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/docs/data_exploration.rst +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/docs/four_way_approach.rst +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/docs/grpc/audit_logger.rst +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/docs/grpc/grpc_functions.rst +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/docs/grpc/index.rst +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/docs/hyperparameters.rst +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/docs/index.rst +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/docs/logger.rst +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/docs/model_interaction.rst +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/docs/pytorch_lightning.rst +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/docs/requirements.txt +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/docs/segmentation_usecase.rst +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/docs/usecases.rst +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/docs/user_functions.rst +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/docs/weights_studio.rst +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/setup.cfg +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/art.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/backend/__init__.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/backend/audit_logger.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/backend/cli.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/backend/dataloader_interface.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/backend/ledgers.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/backend/logger.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/backend/model_interface.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/backend/optimizer_interface.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/baseline_models/__init__.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/baseline_models/pytorch/__init__.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/baseline_models/pytorch/models.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/components/__init__.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/components/checkpoint_manager.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/components/evaluation_controller.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/components/experiment_hash.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/components/global_monitoring.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/components/parallel_primitives.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/components/tracking.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/data/__init__.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/data/array_proxy.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/data/data_samples_with_ops.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/data/h5_array_store.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/data/sample_stats.py +0 -0
- {weightslab-1.2.0/weightslab/examples/PyTorch_Lightning → weightslab-1.2.2/weightslab/examples/Lightning}/ws-classification/config.yaml +0 -0
- {weightslab-1.2.0/weightslab/examples/PyTorch_Lightning → weightslab-1.2.2/weightslab/examples/Lightning}/ws-classification/main.py +0 -0
- {weightslab-1.2.0/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.0/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.0/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.0/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.0/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.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/0000f77c-6257be58.jpg +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/000f8d37-d4c09a0f.jpg +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00a0f008-a315437f.jpg +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00c12bd0-bb46e479.jpg +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00c29c52-f9524f1e.jpg +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00ce6f6d-50bbee62.jpg +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00d1bafa-1b47b41c.jpg +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00d7268f-fd4487be.jpg +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00f0dd0f-5e9c9557.jpg +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/0a0d7f4c-ac5c3c8f.jpg +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/0a1f4fce-f9cac880.jpg +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/0a3bb2d8-c195d91e.jpg +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1cac6a7-04e33135.jpg +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1ceb32e-3f481b43.jpg +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1d10d08-5b108225.jpg +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1d22449-15fb948f.jpg +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1d7b3ac-5af8623b.jpg +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1dce572-c6a8cb5e.jpg +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1e1a7b8-0aec80e8.jpg +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1e8ad72-c3c79240.jpg +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1ee702d-0ae1fc10.jpg +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1f0efd9-37a14dda.jpg +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b2a0648b-d8e126bc.jpg +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b2b70230-bad4ff6e.jpg +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/0000f77c-6257be58.png +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/000f8d37-d4c09a0f.png +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00a0f008-a315437f.png +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00c12bd0-bb46e479.png +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00c29c52-f9524f1e.png +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00ce6f6d-50bbee62.png +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00d1bafa-1b47b41c.png +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00d7268f-fd4487be.png +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00f0dd0f-5e9c9557.png +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/0a0d7f4c-ac5c3c8f.png +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/0a1f4fce-f9cac880.png +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/0a3bb2d8-c195d91e.png +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1cac6a7-04e33135.png +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1ceb32e-3f481b43.png +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1d10d08-5b108225.png +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1d22449-15fb948f.png +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1d7b3ac-5af8623b.png +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1dce572-c6a8cb5e.png +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1e1a7b8-0aec80e8.png +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1e8ad72-c3c79240.png +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1ee702d-0ae1fc10.png +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1f0efd9-37a14dda.png +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b2a0648b-d8e126bc.png +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b2b70230-bad4ff6e.png +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/utils/criterions.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/utils/data.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/utils/model.py +0 -0
- /weightslab-1.2.0/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.0 → weightslab-1.2.2}/weightslab/integrations/__init__.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/integrations/ultralytics/README.md +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/integrations/ultralytics/__init__.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/integrations/ultralytics/_utils.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/integrations/ultralytics/collate.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/integrations/ultralytics/dataset.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/integrations/ultralytics/signals.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/models/__init__.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/models/model_with_ops.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/models/monkey_patcher.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/modules/__init__.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/modules/modules_with_ops.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/modules/neuron_ops.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/proto/__init__.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/security/__init__.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/__init__.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/backend/__init__.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/backend/test_audit_logger.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/backend/test_cli_additional_unit.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/backend/test_instance_signal_logger.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/backend/test_ledgers.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/backend/test_optimizer_interface.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/backend/test_optimizer_interface_additional_unit.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/backend/test_write_history.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/chaos_monkeys_utests/__init__.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/chaos_monkeys_utests/test_grpc_chaos_monkey_robustness.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/components/__init__.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/components/test_checkpoint_workflow.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/components/test_experiment_hash_and_art.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/components/test_global_monitoring_unit.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/data/__init__.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/data/test_data_samples_with_ops.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/data/test_data_service_metadata_copy.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/data/test_data_utils_unit.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/data/test_dataframe_manager_unit.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/data/test_flush_pipeline.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/data/test_h5_array_store.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/data/test_h5_dataframe_store.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/gRPC/__init__.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/gRPC/test_grpc_tag_operations.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/general/__init__.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/general/test_auditor_mode.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/general/test_cli.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/general/test_hyperparams.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/general/test_logger_snapshot_rotation.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/general/test_signals.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/general/test_signals_wrapping.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/integrations/__init__.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/integrations/test_pytorch_lightning_integration.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/integrations/ultralytics/ddp/ddp_ablation.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/integrations/ultralytics/ddp/ddp_test_suite.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/model/__init__.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/model/test_constraint_generation.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/model/test_dependency_patterns.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/model/test_logger.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/model/test_model_with_ops.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/model/test_model_with_ops_unit.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/model/test_tracking.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/modules/__init__.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/modules/test_modules_with_ops.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/test_secure_docker.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/test_src_functions.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/trainer/__init__.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/trainer/services/__init__.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/trainer/services/test_agent_prompt_unit.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/trainer/services/test_agent_service_unit.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/trainer/services/test_trainer_services_server.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/trainer/test_trainer_tools.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/utils/__init__.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/utils/test_computational_graph_utils_unit.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/utils/test_logs_unit.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/utils/test_modules_dependencies_unit.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/utils/test_plot_graph_render_unit.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/utils/test_plot_graph_unit.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/utils/test_shape_prop_unit.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/utils/test_utils_tools_unit.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/watchdog/__init__.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/watchdog/test_lock_monitor.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/watchdog/test_watchdog.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/__init__.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/experiment_context.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/services/__init__.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/services/agent/__init__.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/services/agent/agent_overview/agent.png +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/services/agent/agent_overview/query_example.png +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/services/agent/agent_overview/schema.png +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/services/agent/intent_prompt.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/services/agent_service.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/services/data_image_utils.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/services/experiment_service.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/services/instance_merger.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/services/model_service.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/services/utils/__init__.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/services/utils/tools.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/trainer_tools.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/Dockerfile +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/docker/.dockerignore +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/docker/.env.example +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/docker/docker-compose.yml +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/docker/nginx.base-path.conf copy.template +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/docker/nginx.base-path.conf.template +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/docker/nginx.conf +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/envoy/envoy.downstream_plaintext.yaml +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/envoy/envoy.downstream_upstream_plaintext.yaml +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/envoy/envoy.upstream_plaintext.yaml +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/envoy/envoy.yaml +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/nginx.conf +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/utils/__init__.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/utils/computational_graph.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/utils/logs.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/utils/modules_dependencies.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/utils/plot_graph.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/utils/shape_prop.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/utils/tools.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/watchdog/__init__.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/watchdog/grpc_watchdog.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/watchdog/lock_monitor.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/watchdog/log_level.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/watchdog/watchdog.py +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab.egg-info/dependency_links.txt +0 -0
- {weightslab-1.2.0 → weightslab-1.2.2}/weightslab.egg-info/entry_points.txt +0 -0
- {weightslab-1.2.0 → 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
|
|
@@ -213,7 +213,7 @@ jobs:
|
|
|
213
213
|
|
|
214
214
|
export PRS_JSON
|
|
215
215
|
PRS_JSON=$(gh pr list --state merged --base "dev" --limit 100 \
|
|
216
|
-
--json number,title,mergedAt,url,author \
|
|
216
|
+
--json number,title,mergedAt,url,author,body \
|
|
217
217
|
2>/dev/null || echo "[]")
|
|
218
218
|
|
|
219
219
|
python3 << 'PYEOF'
|
|
@@ -227,12 +227,17 @@ jobs:
|
|
|
227
227
|
prs_data = json.loads(os.environ.get("PRS_JSON", "[]"))
|
|
228
228
|
except Exception:
|
|
229
229
|
prs_data = []
|
|
230
|
+
def _pr_entry(pr):
|
|
231
|
+
line = f"- [#{pr['number']}]({pr['url']}) {pr['title']} — {pr['mergedAt'][:10]}"
|
|
232
|
+
desc = " ".join((pr.get("body") or "").split()) # collapse newlines/whitespace
|
|
233
|
+
if desc:
|
|
234
|
+
if len(desc) > 512:
|
|
235
|
+
desc = desc[:509].rstrip() + "..."
|
|
236
|
+
line += f"\n\n > {desc}"
|
|
237
|
+
return line
|
|
230
238
|
filtered = [pr for pr in prs_data if pr.get("mergedAt", "") > prev_date]
|
|
231
239
|
if filtered:
|
|
232
|
-
prs_lines = "\n".join(
|
|
233
|
-
f"- [#{pr['number']}]({pr['url']}) {pr['title']} — {pr['mergedAt'][:10]}"
|
|
234
|
-
for pr in filtered
|
|
235
|
-
)
|
|
240
|
+
prs_lines = "\n".join(_pr_entry(pr) for pr in filtered)
|
|
236
241
|
seen, clabels = set(), []
|
|
237
242
|
for pr in filtered:
|
|
238
243
|
login = pr.get("author", {}).get("login", "")
|
|
@@ -436,7 +441,7 @@ jobs:
|
|
|
436
441
|
|
|
437
442
|
export PRS_JSON
|
|
438
443
|
PRS_JSON=$(gh pr list --state merged --base "main" --limit 100 \
|
|
439
|
-
--json number,title,mergedAt,url,author \
|
|
444
|
+
--json number,title,mergedAt,url,author,body \
|
|
440
445
|
2>/dev/null || echo "[]")
|
|
441
446
|
|
|
442
447
|
python3 << 'PYEOF'
|
|
@@ -450,12 +455,17 @@ jobs:
|
|
|
450
455
|
prs_data = json.loads(os.environ.get("PRS_JSON", "[]"))
|
|
451
456
|
except Exception:
|
|
452
457
|
prs_data = []
|
|
458
|
+
def _pr_entry(pr):
|
|
459
|
+
line = f"- [#{pr['number']}]({pr['url']}) {pr['title']} — {pr['mergedAt'][:10]}"
|
|
460
|
+
desc = " ".join((pr.get("body") or "").split()) # collapse newlines/whitespace
|
|
461
|
+
if desc:
|
|
462
|
+
if len(desc) > 512:
|
|
463
|
+
desc = desc[:509].rstrip() + "..."
|
|
464
|
+
line += f"\n\n > {desc}"
|
|
465
|
+
return line
|
|
453
466
|
filtered = [pr for pr in prs_data if pr.get("mergedAt", "") > prev_date]
|
|
454
467
|
if filtered:
|
|
455
|
-
prs_lines = "\n".join(
|
|
456
|
-
f"- [#{pr['number']}]({pr['url']}) {pr['title']} — {pr['mergedAt'][:10]}"
|
|
457
|
-
for pr in filtered
|
|
458
|
-
)
|
|
468
|
+
prs_lines = "\n".join(_pr_entry(pr) for pr in filtered)
|
|
459
469
|
seen, clabels = set(), []
|
|
460
470
|
for pr in filtered:
|
|
461
471
|
login = pr.get("author", {}).get("login", "")
|
|
@@ -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)
|