weightslab 1.2.5__tar.gz → 1.2.6__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.5 → weightslab-1.2.6}/.github/workflows/ci.yml +45 -10
- weightslab-1.2.6/AGENTS.md +268 -0
- weightslab-1.2.6/CHANGELOG.md +1 -0
- {weightslab-1.2.5/weightslab.egg-info → weightslab-1.2.6}/PKG-INFO +27 -89
- {weightslab-1.2.5 → weightslab-1.2.6}/README.md +26 -88
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/_version.py +3 -3
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/backend/ledgers.py +89 -10
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/components/experiment_hash.py +2 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/data/dataframe_manager.py +33 -7
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/data/h5_dataframe_store.py +24 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-classification/main.py +8 -9
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-detection/main.py +11 -11
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/main.py +8 -9
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/Usecases/ws-3d-lidar-detection/main.py +9 -9
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/src.py +3 -2
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/backend/test_ledgers.py +87 -25
- {weightslab-1.2.5 → weightslab-1.2.6/weightslab.egg-info}/PKG-INFO +27 -89
- weightslab-1.2.5/AGENTS.md +0 -209
- weightslab-1.2.5/CHANGELOG.md +0 -1
- {weightslab-1.2.5 → weightslab-1.2.6}/.gitattributes +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/.github/workflows/docs-pages.yml +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/.github/workflows/release.yml +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/.gitignore +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/LICENSE +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/agent_config.yaml +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/docs/_static/.gitkeep +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/docs/_static/custom.css +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/docs/_static/favicon.png +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/docs/_static/logo-dark.png +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/docs/_static/logo-light.png +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/docs/_static/version-switcher.js +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/docs/_static/weights_studio_architecture.png +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/docs/_templates/.gitkeep +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/docs/conf.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/docs/configuration.rst +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/docs/data_exploration.rst +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/docs/four_way_approach.rst +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/docs/grpc/audit_logger.rst +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/docs/grpc/grpc_functions.rst +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/docs/grpc/index.rst +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/docs/hyperparameters.rst +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/docs/index.rst +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/docs/logger.rst +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/docs/model_interaction.rst +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/docs/pytorch_lightning.rst +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/docs/quickstart.rst +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/docs/requirements.txt +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/docs/segmentation_usecase.rst +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/docs/usecases.rst +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/docs/user_functions.rst +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/docs/weights_studio.rst +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/pyproject.toml +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/setup.cfg +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/art.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/backend/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/backend/audit_logger.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/backend/cli.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/backend/dataloader_interface.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/backend/logger.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/backend/model_interface.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/backend/optimizer_interface.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/baseline_models/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/baseline_models/pytorch/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/baseline_models/pytorch/models.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/components/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/components/checkpoint_manager.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/components/evaluation_controller.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/components/global_monitoring.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/components/parallel_primitives.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/components/tracking.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/data/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/data/array_proxy.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/data/data_samples_with_ops.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/data/data_utils.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/data/h5_array_store.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/data/point_cloud_utils.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/data/sample_stats.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/Docker_training/README.md +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/Docker_training/docker_in_docker/Dockerfile +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/Docker_training/docker_in_docker/README.md +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/Docker_training/docker_in_docker/docker-compose.yml +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/Docker_training/docker_in_docker/entrypoint.sh +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/Docker_training/siblings_self_contained/Dockerfile +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/Docker_training/siblings_self_contained/README.md +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/Docker_training/siblings_self_contained/docker-compose.yml +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/Docker_training/siblings_self_contained/entrypoint.sh +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/Docker_training/siblings_self_contained/ui-compose.yml +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/Lightning/ws-classification/config.yaml +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/Lightning/ws-classification/main.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-classification/config.yaml +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-clustering/config.yaml +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-clustering/face/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-clustering/face/data.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-clustering/face/model.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-clustering/face/signals.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-clustering/face/utils.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-clustering/main.py +8 -8
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-detection/README.md +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-detection/config.yaml +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-detection/utils/criterions.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-detection/utils/data.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-detection/utils/model.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-generation/config.yaml +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-generation/main.py +3 -3
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/0000f77c-6257be58.jpg +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/000f8d37-d4c09a0f.jpg +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00a0f008-a315437f.jpg +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00c12bd0-bb46e479.jpg +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00c29c52-f9524f1e.jpg +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00ce6f6d-50bbee62.jpg +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00d1bafa-1b47b41c.jpg +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00d7268f-fd4487be.jpg +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00f0dd0f-5e9c9557.jpg +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/0a0d7f4c-ac5c3c8f.jpg +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/0a1f4fce-f9cac880.jpg +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/0a3bb2d8-c195d91e.jpg +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1cac6a7-04e33135.jpg +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1ceb32e-3f481b43.jpg +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1d10d08-5b108225.jpg +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1d22449-15fb948f.jpg +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1d7b3ac-5af8623b.jpg +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1dce572-c6a8cb5e.jpg +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1e1a7b8-0aec80e8.jpg +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1e8ad72-c3c79240.jpg +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1ee702d-0ae1fc10.jpg +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1f0efd9-37a14dda.jpg +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b2a0648b-d8e126bc.jpg +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b2b70230-bad4ff6e.jpg +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/0000f77c-6257be58.png +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/000f8d37-d4c09a0f.png +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00a0f008-a315437f.png +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00c12bd0-bb46e479.png +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00c29c52-f9524f1e.png +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00ce6f6d-50bbee62.png +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00d1bafa-1b47b41c.png +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00d7268f-fd4487be.png +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00f0dd0f-5e9c9557.png +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/0a0d7f4c-ac5c3c8f.png +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/0a1f4fce-f9cac880.png +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/0a3bb2d8-c195d91e.png +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1cac6a7-04e33135.png +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1ceb32e-3f481b43.png +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1d10d08-5b108225.png +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1d22449-15fb948f.png +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1d7b3ac-5af8623b.png +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1dce572-c6a8cb5e.png +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1e1a7b8-0aec80e8.png +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1e8ad72-c3c79240.png +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1ee702d-0ae1fc10.png +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1f0efd9-37a14dda.png +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b2a0648b-d8e126bc.png +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b2b70230-bad4ff6e.png +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/config.yaml +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/utils/criterions.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/utils/data.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/utils/model.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/Ultralytics/ws-detection/config.yaml +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/Ultralytics/ws-detection/main.py +1 -1
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/Ultralytics/ws-detection/requirements.txt +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/Usecases/ws-2d-lidar-detection/README.md +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/Usecases/ws-2d-lidar-detection/config.yaml +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/Usecases/ws-2d-lidar-detection/main.py +3 -3
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/Usecases/ws-2d-lidar-detection/utils/criterions.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/Usecases/ws-2d-lidar-detection/utils/data.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/Usecases/ws-2d-lidar-detection/utils/model.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/Usecases/ws-3d-lidar-detection/README.md +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/Usecases/ws-3d-lidar-detection/config.yaml +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/Usecases/ws-3d-lidar-detection/utils/criterions.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/Usecases/ws-3d-lidar-detection/utils/data.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/Usecases/ws-3d-lidar-detection/utils/kitti_download.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/examples/Usecases/ws-3d-lidar-detection/utils/model.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/integrations/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/integrations/ultralytics/README.md +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/integrations/ultralytics/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/integrations/ultralytics/_utils.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/integrations/ultralytics/collate.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/integrations/ultralytics/dataset.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/integrations/ultralytics/signals.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/integrations/ultralytics/trainer.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/models/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/models/model_with_ops.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/models/monkey_patcher.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/modules/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/modules/modules_with_ops.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/modules/neuron_ops.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/proto/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/proto/experiment_service.proto +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/proto/experiment_service_pb2.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/proto/experiment_service_pb2_grpc.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/security/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/security/cert_auth_manager.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/backend/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/backend/test_audit_logger.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/backend/test_cli_additional_unit.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/backend/test_compare_dataloaders.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/backend/test_data_loader_interface.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/backend/test_instance_signal_logger.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/backend/test_logger_core.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/backend/test_model_interface_unit.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/backend/test_optimizer_interface.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/backend/test_optimizer_interface_additional_unit.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/backend/test_ui_docker_bridge.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/backend/test_write_dataframe.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/backend/test_write_history.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/chaos_monkeys_utests/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/chaos_monkeys_utests/test_grpc_chaos_monkey_robustness.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/components/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/components/test_checkpoint_workflow.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/components/test_experiment_hash_and_art.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/components/test_global_monitoring_unit.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/data/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/data/test_data_samples_with_ops.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/data/test_data_service_metadata_copy.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/data/test_data_utils_unit.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/data/test_dataframe_manager_unit.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/data/test_flush_pipeline.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/data/test_h5_array_store.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/data/test_h5_dataframe_store.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/data/test_point_cloud_utils.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/gRPC/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/gRPC/test_get_point_cloud.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/gRPC/test_grpc_tag_operations.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/gRPC/test_grpc_user_actions.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/general/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/general/test_auditor_mode.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/general/test_cli.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/general/test_hyperparams.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/general/test_logger_snapshot_rotation.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/general/test_signals.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/general/test_signals_wrapping.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/integrations/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/integrations/test_pytorch_lightning_integration.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/integrations/ultralytics/ddp/ddp_ablation.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/integrations/ultralytics/ddp/ddp_test_suite.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/model/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/model/test_constraint_generation.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/model/test_dependency_patterns.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/model/test_logger.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/model/test_model_with_ops.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/model/test_model_with_ops_unit.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/model/test_tracking.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/modules/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/modules/test_modules_with_ops.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/test_secure_docker.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/test_src_functions.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/trainer/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/trainer/services/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/trainer/services/test_agent_prompt_unit.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/trainer/services/test_agent_service_unit.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/trainer/services/test_trainer_services_server.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/trainer/services/test_trainer_services_unit.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/trainer/test_trainer_tools.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/utils/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/utils/test_computational_graph_utils_unit.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/utils/test_logs_unit.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/utils/test_modules_dependencies_unit.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/utils/test_plot_graph_render_unit.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/utils/test_plot_graph_unit.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/utils/test_shape_prop_unit.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/utils/test_utils_tools_unit.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/watchdog/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/watchdog/test_lock_monitor.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/tests/watchdog/test_watchdog.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/trainer/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/trainer/experiment_context.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/trainer/services/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/trainer/services/agent/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/trainer/services/agent/agent.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/trainer/services/agent/agent_overview/agent.png +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/trainer/services/agent/agent_overview/query_example.png +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/trainer/services/agent/agent_overview/schema.png +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/trainer/services/agent/intent_prompt.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/trainer/services/agent_service.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/trainer/services/data_image_utils.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/trainer/services/data_service.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/trainer/services/experiment_service.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/trainer/services/instance_merger.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/trainer/services/model_service.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/trainer/services/utils/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/trainer/services/utils/tools.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/trainer/trainer_services.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/trainer/trainer_tools.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/ui/Dockerfile +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/ui/docker/.dockerignore +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/ui/docker/.env.example +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/ui/docker/DEPLOYMENT.md +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/ui/docker/docker-compose.yml +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/ui/docker/nginx-entrypoint.sh +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/ui/docker/nginx.base-path.conf copy.template +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/ui/docker/nginx.base-path.conf.template +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/ui/docker/nginx.conf +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/ui/docker/test-deployment.sh +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/ui/docker/utils/build-and-deploy.sh +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/ui/docker/utils/generate-certs-auth-token.ps1 +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/ui/docker/utils/generate-certs-auth-token.sh +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/ui/docker/utils/test-deployment.sh +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/ui/envoy/envoy.downstream_plaintext.yaml +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/ui/envoy/envoy.downstream_upstream_plaintext.yaml +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/ui/envoy/envoy.upstream_plaintext.yaml +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/ui/envoy/envoy.yaml +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/ui/nginx.conf +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/ui_docker_bridge.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/utils/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/utils/computational_graph.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/utils/logs.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/utils/modules_dependencies.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/utils/plot_graph.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/utils/shape_prop.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/utils/tools.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/watchdog/__init__.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/watchdog/grpc_watchdog.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/watchdog/lock_monitor.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/watchdog/log_level.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab/watchdog/watchdog.py +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab.egg-info/SOURCES.txt +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab.egg-info/dependency_links.txt +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab.egg-info/entry_points.txt +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab.egg-info/requires.txt +0 -0
- {weightslab-1.2.5 → weightslab-1.2.6}/weightslab.egg-info/top_level.txt +0 -0
|
@@ -2,19 +2,52 @@ name: Code CI
|
|
|
2
2
|
|
|
3
3
|
on:
|
|
4
4
|
push:
|
|
5
|
-
|
|
5
|
+
# Fire on every branch so the `gate` job below can decide whether to run.
|
|
6
|
+
# GitHub cannot filter on commit message at the event level, so we trigger
|
|
7
|
+
# broadly and gate execution: main/dev always run, other branches run only
|
|
8
|
+
# when the head commit message contains "[force ci]".
|
|
9
|
+
branches: [ '**' ]
|
|
6
10
|
tags: [ 'v*' ]
|
|
7
11
|
pull_request:
|
|
8
12
|
types: [ opened, reopened, ready_for_review ]
|
|
9
13
|
workflow_dispatch:
|
|
10
14
|
|
|
11
15
|
jobs:
|
|
12
|
-
#
|
|
13
|
-
#
|
|
14
|
-
#
|
|
15
|
-
|
|
16
|
+
# Single source of truth for "should the core CI jobs run?". Reproduces the
|
|
17
|
+
# previous trigger rules (PR / manual dispatch / main / dev run; tags skip)
|
|
18
|
+
# and adds a manual escape hatch for custom branches via "[force ci]".
|
|
19
|
+
gate:
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
outputs:
|
|
22
|
+
run_ci: ${{ steps.decide.outputs.run_ci }}
|
|
23
|
+
steps:
|
|
24
|
+
- name: Decide whether to run CI
|
|
25
|
+
id: decide
|
|
26
|
+
env:
|
|
27
|
+
# Evaluated by GitHub (not the shell) so the raw commit message is
|
|
28
|
+
# never interpolated into bash — avoids quoting/injection issues.
|
|
29
|
+
FORCE_CI: ${{ contains(github.event.head_commit.message, '[force ci]') }}
|
|
30
|
+
run: |
|
|
31
|
+
if [ "${{ github.event_name }}" != "push" ]; then
|
|
32
|
+
run_ci=true # PRs and manual dispatch always run
|
|
33
|
+
elif [[ "${{ github.ref }}" == refs/tags/* ]]; then
|
|
34
|
+
run_ci=false # tag pushes are handled by the release workflow
|
|
35
|
+
elif [ "${{ github.ref }}" = "refs/heads/main" ] || [ "${{ github.ref }}" = "refs/heads/dev" ]; then
|
|
36
|
+
run_ci=true # default branches always run
|
|
37
|
+
elif [ "${FORCE_CI}" = "true" ]; then
|
|
38
|
+
run_ci=true # custom branch opted in via [force ci]
|
|
39
|
+
else
|
|
40
|
+
run_ci=false # custom branch without [force ci] → skip
|
|
41
|
+
fi
|
|
42
|
+
echo "run_ci=${run_ci}" >> "$GITHUB_OUTPUT"
|
|
43
|
+
echo "Decision: run_ci=${run_ci} (event=${{ github.event_name }}, ref=${{ github.ref }}, force_ci=${FORCE_CI})"
|
|
44
|
+
# Required gate: a lint violation here FAILS the CI run. Nothing `needs` this
|
|
45
|
+
# job, so it runs in parallel with install/test/build — its failure turns the
|
|
46
|
+
# run red but does NOT stop the other jobs from running (GitHub Actions does
|
|
47
|
+
# not cancel sibling jobs on failure).
|
|
16
48
|
code-quality:
|
|
17
|
-
|
|
49
|
+
needs: gate
|
|
50
|
+
if: ${{ needs.gate.outputs.run_ci == 'true' }}
|
|
18
51
|
runs-on: ubuntu-latest
|
|
19
52
|
steps:
|
|
20
53
|
- name: Checkout repository
|
|
@@ -99,7 +132,8 @@ jobs:
|
|
|
99
132
|
# Single-version install on 3.11 — always runs so `test` has a gate to
|
|
100
133
|
# depend on regardless of branch.
|
|
101
134
|
install:
|
|
102
|
-
|
|
135
|
+
needs: gate
|
|
136
|
+
if: ${{ needs.gate.outputs.run_ci == 'true' }}
|
|
103
137
|
runs-on: ubuntu-latest
|
|
104
138
|
name: install (Python 3.11)
|
|
105
139
|
steps:
|
|
@@ -160,10 +194,11 @@ jobs:
|
|
|
160
194
|
python -c "import weightslab; print(f'weightslab imported successfully on Python ${{ matrix.python-version }}')"
|
|
161
195
|
|
|
162
196
|
test:
|
|
163
|
-
if: ${{
|
|
197
|
+
if: ${{ needs.gate.outputs.run_ci == 'true' }}
|
|
164
198
|
runs-on: ubuntu-latest
|
|
165
|
-
# Depends on the fast 3.11 gate
|
|
166
|
-
|
|
199
|
+
# Depends on the fast 3.11 install gate; `gate` is also a direct need so this
|
|
200
|
+
# job can read run_ci (the matrix and main-only jobs run independently).
|
|
201
|
+
needs: [ gate, install ]
|
|
167
202
|
steps:
|
|
168
203
|
- name: Checkout repository
|
|
169
204
|
uses: actions/checkout@v4
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
# WeightsLab — agent context for users & debugging
|
|
2
|
+
|
|
3
|
+
This file is a **portable context for AI coding agents** (Claude Code, etc.) and
|
|
4
|
+
the humans driving them. Its job is to let you — or an agent helping you —
|
|
5
|
+
**install, configure, run, and debug WeightsLab and Weights Studio** without
|
|
6
|
+
having to reverse-engineer the system first.
|
|
7
|
+
|
|
8
|
+
It deliberately covers only the two shipped repositories:
|
|
9
|
+
|
|
10
|
+
- **weightslab** — the Python backend / core (training instrumentation, data
|
|
11
|
+
ledger, gRPC service, the shared proto).
|
|
12
|
+
- **weights_studio** — the browser frontend (the studio UI that inspects and
|
|
13
|
+
edits a *running* experiment).
|
|
14
|
+
|
|
15
|
+
> File/line references drift as the code evolves — treat them as starting points
|
|
16
|
+
> and verify against the current source before relying on them. Environment
|
|
17
|
+
> variable names and defaults are the most stable thing here; when in doubt the
|
|
18
|
+
> authoritative reference is `weightslab/docs/configuration.rst`.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 0. How to load this guide into Claude Code
|
|
23
|
+
|
|
24
|
+
So an agent actually *has* this context when you ask it for help:
|
|
25
|
+
|
|
26
|
+
- **Working inside a checkout of the repo** (`git clone`): this guide is
|
|
27
|
+
committed as `AGENTS.md`; the repo keeps a gitignored `CLAUDE.md` copy of it at
|
|
28
|
+
the root so Claude Code auto-loads it every session. Nothing to do. (Claude
|
|
29
|
+
Code also loads `~/.claude/CLAUDE.md` global memory and any parent-dir
|
|
30
|
+
`CLAUDE.md`.)
|
|
31
|
+
- **You only ran `pip install weightslab`** (no checkout — the package lives in
|
|
32
|
+
`site-packages`): absolute `@import` paths are fragile because the path
|
|
33
|
+
changes per venv/OS. The robust pattern is a small **skill** that locates the
|
|
34
|
+
installed file at runtime. Create `~/.claude/skills/weightslab/SKILL.md`:
|
|
35
|
+
|
|
36
|
+
```yaml
|
|
37
|
+
---
|
|
38
|
+
name: weightslab
|
|
39
|
+
description: Load the WeightsLab debugging & configuration guide when helping with weightslab or weights_studio problems (connection, TLS, env vars, training hangs, rendering).
|
|
40
|
+
---
|
|
41
|
+
!`python -c "import weightslab, os; print(open(os.path.join(os.path.dirname(weightslab.__file__), 'AGENTS.md')).read())"`
|
|
42
|
+
|
|
43
|
+
Use the guide above to diagnose the user's weightslab / weights_studio issue.
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Then run `/weightslab` (or let Claude auto-invoke it). This requires the guide
|
|
47
|
+
to be **shipped as package data** inside the installed package (see §7); the
|
|
48
|
+
copy at the repo root is for contributors working in a checkout.
|
|
49
|
+
- **Quick-and-dirty:** copy this file to `~/.claude/WEIGHTSLAB.md` and add
|
|
50
|
+
`@~/.claude/WEIGHTSLAB.md` to your `~/.claude/CLAUDE.md`.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## 1. What it is and how the pieces connect
|
|
55
|
+
|
|
56
|
+
A user wraps their own PyTorch training script with WeightsLab so a running
|
|
57
|
+
experiment becomes inspectable/editable; Weights Studio is the UI for that.
|
|
58
|
+
|
|
59
|
+
**Wire path (the thing that breaks most often):**
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
Browser (Vite app) → Envoy :8080 (grpc-web ↔ grpc) → Python gRPC servicer → training loop
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
- The browser cannot speak raw gRPC, so **Envoy** transcodes grpc-web ↔ gRPC.
|
|
66
|
+
If Envoy is down or misconfigured, the UI loads but no data appears.
|
|
67
|
+
- The gRPC servicer and the training loop run in the **same process, different
|
|
68
|
+
threads**, coordinated by locks in
|
|
69
|
+
`weightslab/weightslab/components/global_monitoring.py`.
|
|
70
|
+
- One proto is the single source of truth:
|
|
71
|
+
`weightslab/weightslab/proto/experiment_service.proto`.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## 2. Install & run (the happy path)
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
pip install weightslab
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
In your training script:
|
|
82
|
+
|
|
83
|
+
```python
|
|
84
|
+
import weightslab as wl
|
|
85
|
+
# wrap your objects so the studio can see/edit them (see §3), then:
|
|
86
|
+
wl.serve(serving_grpc=True, serving_cli=True) # background threads, same process
|
|
87
|
+
# ... your training loop ...
|
|
88
|
+
wl.keep_serving() # keep the process alive for the UI
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Then start the studio stack (Envoy + frontend) and open it in a browser.
|
|
92
|
+
Working starting points live in
|
|
93
|
+
`weightslab/weightslab/examples/{PyTorch,Lightning,Usecases}/<usecase>/`
|
|
94
|
+
(each is a `main.py` + `config.yaml`) — find the closest example and mirror it.
|
|
95
|
+
|
|
96
|
+
Studio deployment details (Docker compose, Envoy, ports, certs) are in
|
|
97
|
+
`weights_studio/docker/` and documented in `weightslab/docs/weights_studio.rst`.
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## 3. The integration API (`import weightslab as wl`)
|
|
102
|
+
|
|
103
|
+
How a user's script plugs in. Wrap each training object with
|
|
104
|
+
`wl.watch_or_edit(obj, flag=...)`; the returned tracked proxy is registered in
|
|
105
|
+
the global ledger (`weightslab/weightslab/backend/ledgers.py`,
|
|
106
|
+
`GLOBAL_LEDGER` — the hub everything reads/mutates through).
|
|
107
|
+
|
|
108
|
+
- `flag="hyperparameters"` (dict), `flag="model"` (nn.Module, `device=…`),
|
|
109
|
+
`flag="optimizer"`, `flag="data"` (Dataset → tracked DataLoader: `loader_name`,
|
|
110
|
+
`batch_size`, `is_training`, `collate_fn`, …), `flag="loss"` (a
|
|
111
|
+
`reduction="none"` criterion, called with `(preds_raw, targets, batch_ids=ids,
|
|
112
|
+
preds=preds)`), `flag="metric"`.
|
|
113
|
+
|
|
114
|
+
Conventions that matter for correctness:
|
|
115
|
+
|
|
116
|
+
- Wrap the train step in `with guard_training_context:` and eval in
|
|
117
|
+
`with guard_testing_context:` (from
|
|
118
|
+
`weightslab.components.global_monitoring`). This is how pause/resume and
|
|
119
|
+
train/test separation work — **skip it and pause/resume or stats will misbehave.**
|
|
120
|
+
- Use `model.get_age()` (steps actually trained; survives checkpoint reloads),
|
|
121
|
+
not the raw loop counter.
|
|
122
|
+
- `task_type` on the dataset/model selects rendering: `classification`,
|
|
123
|
+
`segmentation`, `detection`, `detection_pointcloud`.
|
|
124
|
+
- **Hyperparameter handle access:** the registered hyperparameters proxy
|
|
125
|
+
supports both `hp.get("lr")` and `hp["lr"]` (subscript == `.get`), and stays
|
|
126
|
+
live — reads reflect in-place updates and re-registration.
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## 4. Configuration (environment variables)
|
|
131
|
+
|
|
132
|
+
WeightsLab and Weights Studio are configured almost entirely through env vars.
|
|
133
|
+
**Authoritative reference: `weightslab/docs/configuration.rst`.** The high-signal
|
|
134
|
+
ones when debugging:
|
|
135
|
+
|
|
136
|
+
**Backend (Python):**
|
|
137
|
+
|
|
138
|
+
| Variable | Default | Why you touch it |
|
|
139
|
+
|---|---|---|
|
|
140
|
+
| `WEIGHTSLAB_LOG_LEVEL` | `INFO` | Set `DEBUG` to see what's happening. (`WATCHDOG` level sits between WARNING/ERROR.) |
|
|
141
|
+
| `GRPC_BACKEND_HOST` / `GRPC_BACKEND_PORT` | `0.0.0.0` / `50051` | Backend must listen where Envoy expects it. |
|
|
142
|
+
| `GRPC_TLS_ENABLED` | `1` | TLS on the gRPC socket. Set `0` **only** for isolated local debugging. |
|
|
143
|
+
| `GRPC_TLS_REQUIRE_CLIENT_AUTH` | `1` | mTLS. Must match what Envoy presents. |
|
|
144
|
+
| `GRPC_TLS_CERT_DIR` | `~/certs` | Where default cert files are looked up. |
|
|
145
|
+
| `GRPC_AUTH_TOKEN` | *(unset)* | Optional metadata-token auth on top of mTLS. |
|
|
146
|
+
| `GRPC_MAX_MESSAGE_BYTES` | `268435456` (256 MB) | Raise it if large tensors/image batches fail. |
|
|
147
|
+
| `WEIGHTSLAB_DISABLE_WATCHDOGS` | `0` | Set `1` when debugging with breakpoints (see §5). |
|
|
148
|
+
| `GRPC_WATCHDOG_STUCK_SECONDS` | `60` | Lock/RPC stuck threshold + lock-acquire timeout. |
|
|
149
|
+
|
|
150
|
+
**Frontend (Weights Studio) — runtime-injected `window.*` globals:**
|
|
151
|
+
|
|
152
|
+
| Variable | Default | Why you touch it |
|
|
153
|
+
|---|---|---|
|
|
154
|
+
| `WS_SERVER_HOST` / `WS_SERVER_PORT` / `WS_SERVER_PROTOCOL` | `localhost` / `8080` / `https` | How the browser reaches the backend (via Envoy). The #1 connection-issue knob. |
|
|
155
|
+
| `WS_HISTOGRAM_MAX_BINS` | `512` | Cap on metadata histogram bars. |
|
|
156
|
+
| `BB_THUMB_RENDER` | `10` | Max bounding boxes drawn per **thumbnail**, per overlay (GT and PRED capped independently). |
|
|
157
|
+
| `BB_MODAL_RENDER` | `100` | Max bounding boxes drawn per **modal** image, per overlay. A `?` button in the modal shows the active limit. |
|
|
158
|
+
|
|
159
|
+
> **VITE_ vs WS_/BB_:** `VITE_*` variables are baked at **build time** (changing
|
|
160
|
+
> them needs a rebuild). `WS_*` / `BB_*` are injected at **container start** into
|
|
161
|
+
> `config.js` and read as `window.*` globals — changing them needs only a
|
|
162
|
+
> container restart + browser reload (see the caching note in §5).
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## 5. Troubleshooting — symptom → cause → fix
|
|
167
|
+
|
|
168
|
+
This is the core of the guide. Each entry is a real failure mode (several are
|
|
169
|
+
distilled from issues hit in development).
|
|
170
|
+
|
|
171
|
+
**UI loads but the sample grid is empty / "failed to fetch" / gRPC errors.**
|
|
172
|
+
The wire path (§1) is broken somewhere. Check in order: (1) backend actually
|
|
173
|
+
serving on `0.0.0.0:50051`; (2) Envoy running and reachable on `:8080`;
|
|
174
|
+
(3) frontend `WS_SERVER_HOST/PORT/PROTOCOL` point at Envoy, not the raw backend;
|
|
175
|
+
(4) **TLS mismatch** — `WS_SERVER_PROTOCOL=https` vs `http`, Envoy server certs,
|
|
176
|
+
and Envoy→backend mTLS certs all consistent. For local debugging you can drop
|
|
177
|
+
TLS end-to-end (`GRPC_TLS_ENABLED=0` + `VITE_SERVER_PROTOCOL=http`).
|
|
178
|
+
|
|
179
|
+
**Changed an env var, restarted, but the UI still uses the old value.**
|
|
180
|
+
- `VITE_*` is build-time → you must **rebuild** the frontend, not just restart.
|
|
181
|
+
- `WS_*` / `BB_*` are read once per page load → you must **reload the tab**.
|
|
182
|
+
- Historically `config.js` was served `Cache-Control: immutable` so even a
|
|
183
|
+
restart needed a **hard refresh**; current builds serve `/config.js` with
|
|
184
|
+
`no-store`, so a container restart + normal reload is enough. On an older
|
|
185
|
+
deployment, hard-refresh (Ctrl+Shift+R) or clear cache.
|
|
186
|
+
|
|
187
|
+
**Sample grid flashes empty cells when auto-refresh fires.**
|
|
188
|
+
An auto-refresh (timer or manual) that lands while a `GetDataSamples` grid fetch
|
|
189
|
+
is still in flight used to clear the cache mid-render. The fix in
|
|
190
|
+
`weights_studio/src/grid_data/gridDataManager.ts` is `isFetchInProgress()`:
|
|
191
|
+
refreshes are skipped while a grid fetch is ongoing. If you see this, confirm
|
|
192
|
+
you're on a build that has that guard.
|
|
193
|
+
|
|
194
|
+
**Detection overlays are slow or unreadably cluttered.**
|
|
195
|
+
Dense detection samples can carry hundreds of boxes. Cap rendering with
|
|
196
|
+
`BB_THUMB_RENDER` (thumbnails) and `BB_MODAL_RENDER` (modal); each is applied
|
|
197
|
+
separately to GT and to predictions. Render-only — no sample data is dropped.
|
|
198
|
+
|
|
199
|
+
**Training appears hung; RPCs return `RESOURCE_EXHAUSTED`; server "restarts".**
|
|
200
|
+
A watchdog monitors the global rlock and in-flight RPCs. If a lock/RPC is held
|
|
201
|
+
longer than `GRPC_WATCHDOG_STUCK_SECONDS` (60s) it's flagged; locks get
|
|
202
|
+
interrupted, and after `GRPC_WATCHDOG_RESTART_THRESHOLD` unhealthy polls the
|
|
203
|
+
gRPC server restarts. When **debugging with breakpoints** that intentionally
|
|
204
|
+
pause longer than that, set `WEIGHTSLAB_DISABLE_WATCHDOGS=1`. If RPCs fail with
|
|
205
|
+
`RESOURCE_EXHAUSTED`, a handler couldn't acquire the lock within the window —
|
|
206
|
+
something else is holding it; check for a long/blocking train or eval step.
|
|
207
|
+
|
|
208
|
+
**Pause/resume doesn't work, or train vs test stats are mixed up.**
|
|
209
|
+
The train step isn't wrapped in `guard_training_context` (or eval in
|
|
210
|
+
`guard_testing_context`). See §3 — these context managers are how the system
|
|
211
|
+
gates and separates phases.
|
|
212
|
+
|
|
213
|
+
**Large weights/images fail to transfer.** Raise `GRPC_MAX_MESSAGE_BYTES`.
|
|
214
|
+
|
|
215
|
+
**The agent bar says it's unconfigured.** The LLM agent needs a provider: a
|
|
216
|
+
local **Ollama** server (`provider: ollama`, available immediately) or **cloud
|
|
217
|
+
OpenRouter** initialized from the UI via `/init` (then `/model` to switch,
|
|
218
|
+
`/reset` to clear). See `weightslab/docs/weights_studio.rst`.
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## 6. Where things live (for deeper digging)
|
|
223
|
+
|
|
224
|
+
**Backend (`weightslab/weightslab/`):**
|
|
225
|
+
- `src.py` — the public verbs (`watch_or_edit`, `serve`, `keep_serving`,
|
|
226
|
+
`tag_samples`, `query_*`, decorators) re-exported from `__init__.py`.
|
|
227
|
+
- `trainer/services/` — `experiment_service.py` (gRPC servicer) delegating to
|
|
228
|
+
`{model,data,agent}_service.py`; `data_image_utils.py` (preview/mask encoding).
|
|
229
|
+
- `components/` — `global_monitoring.py` (locks, `guard_*` contexts, pause),
|
|
230
|
+
`checkpoint_manager.py`, `evaluation_controller.py`.
|
|
231
|
+
- `data/` — `dataframe_manager.py`, `data_samples_with_ops.py`, `sample_stats.py`,
|
|
232
|
+
H5 storage (`h5_dataframe_store.py`, `h5_array_store.py`, `array_proxy.py`).
|
|
233
|
+
- `backend/` — `ledgers.py` (`GLOBAL_LEDGER`), `logger.py`, `audit_logger.py`, `cli.py`.
|
|
234
|
+
- `security/` (`CertAuthManager`), `proto/`, `examples/`, `docs/`.
|
|
235
|
+
|
|
236
|
+
**Frontend (`weights_studio/src/`):**
|
|
237
|
+
- `main.ts` — bootstrap; builds the grpc-web transport from `WS_SERVER_*`.
|
|
238
|
+
- `experiment_service.client.ts` / `experiment_service.ts` — generated client
|
|
239
|
+
(regenerate with `npm run generate-proto:data`; do not hand-edit).
|
|
240
|
+
- `grid_data/` — grid + modal rendering (`GridCell.ts`, `DataImageService.ts`,
|
|
241
|
+
`gridDataManager.ts`, `BboxRenderer.ts`, `SegmentationRenderer.ts`,
|
|
242
|
+
`PointCloudViewer.ts`).
|
|
243
|
+
- `docker/` — compose, `nginx-entrypoint.sh` (injects `config.js`), Envoy assets.
|
|
244
|
+
|
|
245
|
+
**Docs:** `weightslab/docs/` (Sphinx) — `configuration.rst` (all env vars),
|
|
246
|
+
`weights_studio.rst` (studio deploy + agent), `quickstart.rst`, `grpc/`.
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## 7. For contributors (working in a checkout)
|
|
251
|
+
|
|
252
|
+
- **The two repos must sit side by side** (`…/weightslab`, `…/weights_studio`);
|
|
253
|
+
codegen and Envoy configs reach across by relative path.
|
|
254
|
+
- **Editing the proto is cross-repo** — do all of: edit
|
|
255
|
+
`experiment_service.proto`; regenerate Python stubs from the repo root; run
|
|
256
|
+
`npm run generate-proto:data` in weights_studio. Editing one side only leaves
|
|
257
|
+
the build broken.
|
|
258
|
+
- **Tests:** backend `python -m pytest weightslab/tests/...`; frontend unit
|
|
259
|
+
`npm run test` (vitest); E2E/user-simulation Playwright lives in
|
|
260
|
+
**weights_studio** (`test:realtime:*`, `test:e2e:*`), not here.
|
|
261
|
+
- **CI on a custom branch:** pushes to non-`main`/`dev` branches only run CI when
|
|
262
|
+
the commit message contains `[force ci]` (both repos).
|
|
263
|
+
- **TLS/auth in the bundled UI** is decided by cert presence under
|
|
264
|
+
`WEIGHTSLAB_CERTS_DIR` (single source of truth) — don't hardcode secure/insecure.
|
|
265
|
+
- **To make this guide available to pip users**, ship it as package data inside
|
|
266
|
+
the installed package (e.g. as `weightslab/weightslab/AGENTS.md`) so the §0
|
|
267
|
+
skill can locate it; keep the root `AGENTS.md` (mirrored as the gitignored
|
|
268
|
+
`CLAUDE.md`) as the contributor-facing source.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Changelog - 2026-06-18 v1.2.6 (1)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: weightslab
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.6
|
|
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
|
|
@@ -120,23 +120,16 @@ The granular statistics and interactive paradigm enable powerful workflows:
|
|
|
120
120
|
- **Docker Desktop v4.77 or newer** — required to deploy the Weights Studio UI (`weightslab ui launch`).
|
|
121
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
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.
|
|
128
123
|
|
|
129
124
|
|
|
130
125
|
### Installation
|
|
131
|
-
|
|
132
|
-
> [!
|
|
133
|
-
>
|
|
134
|
-
>
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
```
|
|
139
|
-
> Or install directly on your machine.
|
|
126
|
+
Install directly on your machine.
|
|
127
|
+
> [!TIP]
|
|
128
|
+
> Setting a clean Python environment:
|
|
129
|
+
> ```bash
|
|
130
|
+
> python -m venv weightslab_venv
|
|
131
|
+
> ./weightslab_venv/Scripts/activate
|
|
132
|
+
> ```
|
|
140
133
|
|
|
141
134
|
Install our framework:
|
|
142
135
|
```bash
|
|
@@ -148,17 +141,16 @@ Deploy our interface:
|
|
|
148
141
|
weightslab ui launch
|
|
149
142
|
```
|
|
150
143
|
|
|
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
|
|
154
|
-
```bash
|
|
155
|
-
weightslab ui launch --certs # generates TLS certs + a gRPC auth token if missing, then launches secured
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
> [!IMPORTANT]
|
|
144
|
+
The command `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. However, communication are not safe.**
|
|
145
|
+
> [!TIP]
|
|
146
|
+
> To run secured communication, pass the arguments `--certs`:
|
|
147
|
+
> ```bash
|
|
148
|
+
> weightslab ui launch --certs # generates TLS certs + a gRPC auth token if missing, then launches secured
|
|
149
|
+
> ```
|
|
159
150
|
> 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`.
|
|
151
|
+
|
|
160
152
|
<!--
|
|
161
|
-
Want to see it working end
|
|
153
|
+
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
154
|
```bash
|
|
163
155
|
weightslab start example # classification (default)
|
|
164
156
|
weightslab start example --cls # classification
|
|
@@ -186,27 +178,29 @@ weightslab start example --gen # generation
|
|
|
186
178
|
|
|
187
179
|
2. **Wrap your parameters** with WeightsLab tracking:
|
|
188
180
|
```python
|
|
189
|
-
model = wl.watch_or_edit(parameters, ...) # ← Now WeightsLab monitors your parameters and allow you to update them from your UI
|
|
181
|
+
model = wl.watch_or_edit(parameters, flag='hp', ...) # ← Now WeightsLab monitors your parameters and allow you to update them from your UI
|
|
190
182
|
```
|
|
191
183
|
|
|
192
184
|
3. **Wrap your model** with WeightsLab tracking:
|
|
193
185
|
```python
|
|
194
|
-
model = wl.watch_or_edit(SimpleModel(...), ...) # ← Now WeightsLab monitors your model state
|
|
186
|
+
model = wl.watch_or_edit(SimpleModel(...), flag='model', ...) # ← Now WeightsLab monitors your model state
|
|
195
187
|
```
|
|
196
188
|
|
|
197
189
|
4. **Wrap your optimizer** with WeightsLab tracking:
|
|
198
190
|
```python
|
|
199
|
-
optimizer = wl.watch_or_edit(optim.Adam(...), ...) # ← Tracks optimizer state and update optimizer learning rate from your UI
|
|
191
|
+
optimizer = wl.watch_or_edit(optim.Adam(...), flag='opt', ...) # ← Tracks optimizer state and update optimizer learning rate from your UI
|
|
200
192
|
```
|
|
201
193
|
|
|
202
194
|
5. **Wrap your signal** with WeightsLab tracking:
|
|
203
195
|
```python
|
|
204
|
-
|
|
196
|
+
train_criterion = wl.watch_or_edit(nn.CrossEntropyLoss(reduction="none"), flag='signal', name="train_loss/sample", per_sample=True, log=True) # ← Tracks this signal and others (metrics, ..etc) from your UI
|
|
197
|
+
test_criterion = wl.watch_or_edit(nn.CrossEntropyLoss(reduction="none"), flag='signal', name="test_loss/sample", per_sample=True, log=False) # ← Tracks this signal and others (metrics, ..etc) from your UI - Plot is disabled, only per sample signal
|
|
205
198
|
```
|
|
206
199
|
|
|
207
200
|
6. **Wrap your dataset** with WeightsLab tracking:
|
|
208
201
|
```python
|
|
209
|
-
train_loader = wl.watch_or_edit(
|
|
202
|
+
train_loader = wl.watch_or_edit(train_dataset, flag='data', loader_name="train_loader", ...) # ← Tracks this dataset and others (validation, test) from your UI
|
|
203
|
+
val_loader = wl.watch_or_edit(val_dataset, flag='data', loader_name="val_loader", ...) # ← Tracks this dataset and others (validation, test) from your UI
|
|
210
204
|
```
|
|
211
205
|
|
|
212
206
|
7. **Run your training script** as usual:
|
|
@@ -451,9 +445,10 @@ if __name__ == "__main__":
|
|
|
451
445
|
## Examples
|
|
452
446
|
|
|
453
447
|
### Local examples
|
|
448
|
+
|
|
454
449
|
After starting the UI, launch a local experiment with the command:
|
|
455
450
|
```bash
|
|
456
|
-
weightslab start example
|
|
451
|
+
weightslab start example # classification (default)
|
|
457
452
|
# weightslab start example --cls # classification
|
|
458
453
|
# weightslab start example --seg # segmentation
|
|
459
454
|
# weightslab start example --det # detection
|
|
@@ -461,66 +456,9 @@ weightslab start example # classification (default)
|
|
|
461
456
|
# weightslab start example --gen # generation
|
|
462
457
|
```
|
|
463
458
|
|
|
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>
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
## AI Agent
|
|
472
|
-
|
|
473
|
-
WeightsLab can run its data agent in two modes:
|
|
474
|
-
|
|
475
|
-
- Local provider with Ollama
|
|
476
|
-
- Cloud provider with OpenRouter
|
|
477
|
-
|
|
478
|
-
Use local Ollama when you want a fully local setup and do not need cloud-hosted models (see more details installation from the documentation).
|
|
479
|
-
Use OpenRouter when you want larger hosted models and model selection directly from Weightslab UI.
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
### Cloud OpenRouter
|
|
483
|
-
You can either preconfigure OpenRouter in `agent_config.yaml` / `.env`, or initialize it interactively from Weightslab UI.
|
|
484
|
-
|
|
485
|
-
#### SDK Configuration
|
|
486
|
-
|
|
487
|
-
Example static configuration:
|
|
488
|
-
|
|
489
|
-
```yaml
|
|
490
|
-
agent:
|
|
491
|
-
provider: openrouter
|
|
492
|
-
openrouter_model: meta-llama/llama-3.3-70b-instruct
|
|
493
|
-
fallback_to_local: false
|
|
494
|
-
# openrouter_api_key: ${OPENROUTER_API_KEY}
|
|
495
|
-
```
|
|
496
|
-
|
|
497
|
-
Environment variable:
|
|
498
|
-
|
|
499
|
-
```bash
|
|
500
|
-
export OPENROUTER_API_KEY=your_key_here
|
|
501
|
-
```
|
|
502
|
-
|
|
503
|
-
#### Interactive setup from Weightslab UI
|
|
504
459
|
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
2. Type `/init`.
|
|
508
|
-
3. Choose either:
|
|
509
|
-
- `A` Enter your OpenRouter API key manually
|
|
510
|
-
- `B` Use the OpenRouter OAuth flow
|
|
511
|
-
4. Select a model from the fetched list, then confirm.
|
|
512
|
-
|
|
513
|
-
The default OpenRouter model, as recommended by Graybx, is `meta-llama/llama-3.3-70b-instruct`.
|
|
514
|
-
|
|
515
|
-
### Typical Usage Flow
|
|
516
|
-
|
|
517
|
-
1. Start your WeightsLab backend (e.g., "main.py").
|
|
518
|
-
2. Start Weightslab UI.
|
|
519
|
-
3. If you use Ollama, query the agent directly.
|
|
520
|
-
4. If you use OpenRouter and the agent is not configured yet, type `/init`.
|
|
521
|
-
5. Ask natural-language data operations such as sorting, filtering, slicing, and inspection requests. You can also ask questions about the data.
|
|
522
|
-
6. Use `/model` to try another cloud model without re-entering the key.
|
|
523
|
-
7. Use `/reset` if you want to clear the current connection and start over.
|
|
460
|
+
### Cloud examples
|
|
461
|
+
Find our [sandbox](https://preview.graybx.com) online. The password is **graybx**.
|
|
524
462
|
|
|
525
463
|
|
|
526
464
|
## Documentation (API + SDK)
|